通过过滤器实现用户的自动登录功能。
1,首先是用户登录功能,用户登录时,需要输入用户名和密码,可以选择在多长时间以内自动登录,
2,提交登录到servlet,在servlet中判断用户名和密码是否与数据库中匹配,如果不匹配则返回一个用户名或密码错误的异常信息到登陆页面,让用户重新登陆
3,如果匹配,则封装用户名和密码到一个user对象中,并保存在session域中,以便于在这次会话中其他页面可以从session中获取用户信息,在顶部显示XXX,欢迎你信息。判断用户是否选择了自动登录功能,如果选择,则将用户名和密码用“-”连接存储到cookie的value中,以autoLogin为cookie的name,并设置cookie的最大生命为用户选择的时间(从单选按钮获取参数),设置路径为工程路径,然后添加cookie到响应中。将cookie发送给用户,用于下一次会话时判断用户是否选了自动登录。
4,(核心)写一个过滤器,拦截全站的资源,在过滤器中,(先对request和response做向下强转)尝试获取名为autoLogin的cookie,如果存在,则记录cookie的值(应该是之前存的用户名和密码),如果获取的value是null,则放行,并结束当前函数,如果不是null,则将value的值拆分成用户名和密码,并封装成user对象记录在一个session域中,放行。
代码片段:
public class Filter1 implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { //强转 HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; //设置全站编码。 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //获取用户cookie ,如果autoLogin不是null,则说明用于设置了自动登录, Cookie[] cookies = request.getCookies(); String result = null; if(cookies!=null){ for(int i=0;i<cookies.length;i++){ if("autoLogin".equals(cookies[i].getName())) result = cookies[i].getValue(); break; } } System.out.println("result"+result); if(result==null){ //request.getSession().removeAttribute("user"); //没有自动登录,直接放行。 chain.doFilter(request, response); return; } //如果result不是null,说明用户选择了自动登录,分割字符串,取出用户名密码,封装到user中,并存储进session中,放行。 String[] ss = result.split("-"); String username = ss[0]; String password = ss[1]; User user = new User(); user.setUsername(username); user.setPassword(password); request.getSession().setAttribute("user", user); chain.doFilter(request, response); } public void destroy() { } }