web中登录后返回之前受保护页面 博客分类: web功能 servletURL页面跳转
程序员文章站
2024-03-14 23:32:11
...
处理登录后跳转到之前受保护的页面:
在我们上网的时候,经常会遇到有些页面是受保护的,也就是需用先登录了以后才能访问到该页面
当我们没登录直接访问这些受保护的页面的时候,系统会自动跳转到登录页面
然后我们登录成功以后,系统就又会自动跳转到之前受保护的页面
那么这种功能效果是怎么做出来的呢。其实很简单,我们在跳转到登录页面把之前页面的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>
好了,这样就可以完成上面说的功能了。