web中登录后返回之前受保护页面
处理登录后跳转到之前受保护的页面:
在我们上网的时候,经常会遇到有些页面是受保护的,也就是需用先登录了以后才能访问到该页面
当我们没登录直接访问这些受保护的页面的时候,系统会自动跳转到登录页面
然后我们登录成功以后,系统就又会自动跳转到之前受保护的页面
那么这种功能效果是怎么做出来的呢。其实很简单,我们在跳转到登录页面把之前页面的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>
好了,这样就可以完成上面说的功能了。
上一篇: 人群中多看了一眼
下一篇: 函数处理父子级之间的查询