看到好多网站都有这么一个功能,就是没登陆的时候,有些页面是可以查看的,但是必须要登陆才能进行操作,很多朋友在开发过程中为防止这样的事情发生也许会做一个提示框,或直接将用户界面重定向到登陆界面,其实这两种的用户用户体验效果都不是很好,其实,用户想操作,我们需要用户登陆,这是没问题的,问题就是我们在处理完用户登陆后,能继续让用户之前的操作流转下去呢,这种实现方式我感觉更好,当然很多网站也都这么实现的,下面我们来简单实现以下。
1、首先一个过滤器,对非法的操作进行拦截,同时保存当前的请求。
package com.lyl.servlet;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class LoginFilter implements Filter {
private String [] urls;
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
String url=req.getRequestURI();
System.out.println("url==="+url);
System.out.println("contextPath=="+ req.getContextPath());
url=url.replace(req.getContextPath()+"/", "");
List<String> urlList= Arrays.asList(urls);
if(!urlList.contains(url)){
Object o=req.getSession().getAttribute("user");
if(o !=null){
chain.doFilter(request, response);
}else{
if(req.getQueryString() !=null) url=url+"?"+req.getQueryString();
req.setAttribute("reqURL",url);
req.getRequestDispatcher("/login.jsp").forward(request, response);
}
}else{
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("--------------------Filter进行了初始化------------------");
String urlStr=config.getInitParameter("noInterruptUrl");
urls=urlStr.split(",");
}
@Override
public void destroy() {
System.out.println("--------------------Filter进行了销毁------------------");
}
}
2、登陆成功方法后续处理:如果之前的请求路径不为空,转发到之前的页面。
package com.lyl.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 4488742375496278371L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String userName=req.getParameter("userName");
String password=req.getParameter("password");
User user=new User();
user.setUserName(userName);
user.setPassword(password);
String reqURL=req.getParameter("reqURL");
req.getSession().setAttribute("user", user);
String dispatcher="bidding.jsp";
//如果登录页面保存之前的请求路径不为空,取出之前的请求路径,转发到之前的请求页面
if(reqURL !=null && !"".equals(reqURL)){
dispatcher=reqURL;
}
req.getRequestDispatcher("/"+dispatcher).forward(req, resp);
}
}
3、web.xml中配置需要不需要拦截的路径,过滤器初始化操作的时候,进行取值。
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.lyl.servlet.LoginFilter</filter-class>
<init-param>
<param-name>noInterruptUrl</param-name>
<param-value>login.jsp,login.do,bidding.jsp</param-value>
</init-param>
</filter>
说白了其实原理很简单,进行非登录拦截的时候,顺便存下之前的请求路径,在后面登陆成功后,转发到之前是请求路径就ok了,有兴趣的朋友可以试下,附上源代码。