欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

web中登录后返回之前受保护页面

程序员文章站 2024-03-15 11:04:59
...

处理登录后跳转到之前受保护的页面:
在我们上网的时候,经常会遇到有些页面是受保护的,也就是需用先登录了以后才能访问到该页面
当我们没登录直接访问这些受保护的页面的时候,系统会自动跳转到登录页面
然后我们登录成功以后,系统就又会自动跳转到之前受保护的页面
那么这种功能效果是怎么做出来的呢。其实很简单,我们在跳转到登录页面把之前页面的URL记录下来
这里的记录有两种方式,一种是直接记录在session中,一种是以一个参数传递给将这个URL传递给登录页面
当登录成功以后,再跳回这个记录的这个URL就可以了
但是需要注意之前的页面可能有参数,我们需要把人家的参数也一同保存起来。

下面就看一个小例子:
1、首先是两个受保护的页面protectedPage1.jsp和protectedPage2.jsp

<body>
    this is first protected page.
    <br>
    <%
        String user = request.getParameter("user");
        out.print("user=" + user);
    %>
</body>

 

<body>
    this is second protected page.
    <br>
    <%
        String two = request.getParameter("two");
        out.print(two);
    %>
    <br>
    <%
        String user = request.getParameter("user");
        out.print("user=" + user);
    %>
</body>

 

2、然后是登录页面login.jsp

<body>
    <form action="/recoveryPage/ToProtectedServlet" method="post">
        userName:<input type="text" name="user"> <input type="submit"
            value="submit">
    </form>
</body>

 

3、到达两个受保护页面的Servlet,FirstServlet.java和SecondServlet.java
其中使用到了URLUtil这个工具类,下面会有这个工具类的说明

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpSession session = request.getSession();
    String user = request.getParameter("user");
    if (user == null || "".equals(user)) {
        session.setAttribute("newURL", URLUtil.dealURL("WEB-INF/jsp/protectedPage1.jsp"));
        request.getRequestDispatcher("WEB-INF/jsp/loginPage.jsp").forward(request, response);
        return;
    }

    request.setAttribute("user", user);
    request.getRequestDispatcher("WEB-INF/jsp/protectedPage1.jsp").forward(request, response);
}

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpSession session = request.getSession();
    String two = request.getParameter("two");
    String user = request.getParameter("user");
    if (user == null || "".equals(user)) {
        session.setAttribute("newURL", URLUtil.dealURL("WEB-INF/jsp/protectedPage2.jsp?two=" + two));
        request.getRequestDispatcher("WEB-INF/jsp/loginPage.jsp").forward(request, response);
        return;
    }

    request.setAttribute("user", user);
    request.getRequestDispatcher("WEB-INF/jsp/protectedPage2.jsp?two=" + two).forward(request, response);
}

 

4、处理登录页面的Servlet

HttpSession session = request.getSession();
String newURL = (String) session.getAttribute("newURL");
String oldURL = URLUtil.getURL(newURL);
System.out.println("oldURL=" + oldURL);
String user = request.getParameter("user");
if (user == null || "".equals(user)) {
    request.getRequestDispatcher("WEB-INF/jsp/loginPage.jsp").forward(request, response);
    return;
}
String newOldURL = URLUtil.appendArges(oldURL, new String[] { "user=" + user });
System.out.println("newOldURL" + newOldURL);
request.getRequestDispatcher(newOldURL).forward(request, response);

 

5、URL处理工具类
注意:上面使用的是session传递保护页面的地址,所以我们不用对保护页面的URL进行处理
但是如果是在参数中传递一个url的参数对象,那么我们就需要对保护页面的URL处理,
需要将原来的URL中的?和&符合替换,不然会导致跳转到登录页面的URL错误。(一个URL不能有多个?)
这里的替换很简单,可以使用其他字符换掉?和&就可以了,在获得保护页面的URL的时候,再替换回来就行

public class URLUtil {
    public static String dealURL(String oldURL) {
        String newURL = oldURL;
        return newURL;
    }

    public static String getURL(String newURL) {
        String oldURL = newURL;
        return oldURL;
    }

    public static String appendArges(String url, String[] arges) {
        if (url.indexOf("?") == -1) {
            url = url + "?" + arges[0];

        } else {
            url = url + "&" + arges[0];
        }
        for (int i = 1; i < arges.length; i++) {
            url = url + "&" + arges[i];
        }
        String newOldURL = url;
        return newOldURL;
    }
}

 
其他的一些配置就不贴了,比如Servlet的映射等等。
这个时候我们可以进行测试:

<html>
<body>
    <h2>
        <a href="/recoveryPage/FirstServlet">to one protected page</a><br>
        <a href="/recoveryPage/SecondServlet?two=2">to two protected page</a>
    </h2>
</body>
</html>

 

好了,这样就可以完成上面说的功能了。