自动登陆

在完成登陆时,如果用户勾选"自动登陆",将在下次登陆时,自动完成登陆功能,减少用户再次输入账号和密码繁琐的操作。此功能是对用户的操作体验进行优化,
效果图如下:
自动登录在这里插入图片描述

  • 步骤1:确定登录表单复选框login.jsp
    -<input type="checkbox" name="autoLogin" value="autoLogin"> 自动登录 </label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <label>
  • 步骤2:完善Servlet,在登录成功后,判断是否勾选自动登录复选框,如果勾选cookie记录登录信息
       if (user != null) {
			// 登陆成功
			// 判断用户是否勾选自动登陆
			String autoLogin = request.getParameter("autoLogin");
			if (autoLogin != null) {
				// String username_code = URLEncoder.encode(username, "utf-8");
				Cookie cookie_username = new Cookie("cookie_username", username);
				Cookie cookie_password = new Cookie("cookie_password", password);
				// 设置Cookie的持久化时间
				cookie_username.setMaxAge(60 * 60);//一个小时
				cookie_password.setMaxAge(60 * 60);
				// 设置Cookie的携带路径
				cookie_username.setPath(request.getContextPath());
				cookie_password.setPath(request.getContextPath());
				// 发送Cookie
				response.addCookie(cookie_username);
				response.addCookie(cookie_password);

			}
			session.setAttribute("user", user);
			response.sendRedirect(request.getContextPath());// 重定向到首页
		}
  • 步骤3:编写过滤器实现类,在下一次访问时进行自动登录
    1. 如果已经登录,不进行登录
    2. 如果浏览器没有自动登录cookie信息,不进行自动登录
    3 .如果浏览器记录cookie有误,不进行自动登录
    4. 用户没有登录,浏览器记录正确的cookie,将自动完成登录(session的记录状态)
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		HttpSession session = req.getSession();
		String username = null;
		String password = null;
		Cookie[] cookies = req.getCookies();
		if (cookies != null) {
			for (Cookie cookie : cookies) {
				if (cookie.getName().equals("cookie_username")) {
					username = cookie.getValue();
					System.out.println("username:"+username);
					//username = URLDecoder.decode("cookie_username", "utf-8");
					//System.out.println("username:"+username);
				} 
				if (cookie.getName().equals("cookie_password")) {
					password = cookie.getValue();
					System.out.println("password:"+password);
				}

			}
			// 自动登陆代码实现
			if (username != null && password != null) {

				UserService service = new UserService();
				User user = null;
				try {
					user = service.login(username, password);
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				session.setAttribute("user", user);

			}
			// 放行
			chain.doFilter(req, resp);

		}
	}

  • 步骤4:编写过滤器xml配置
  <!-- 自动登陆filter -->
  <filter>
   <filter-name>LoginFilter</filter-name> 
   <filter-class>com.tzw.web.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>LoginFilter</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>

总结

  • Fileter的生命周期:过滤器从创建到销毁的过程
    • 服务器启动的时候,服务器就会创建过滤器的对象每次访问被拦截对象目标资源,过滤器中的doFilter方法就会执行,当服务器关闭的时候,服务器就会销毁Filter对象

    • 服务器启动时执行初始化的方法,init

    • 访问资源被拦截时执行拦截方法,doFilter。放行:chain.doFilter(request,response)

    • 服务器关闭时执行销毁方法,destroy

猜你喜欢

转载自blog.csdn.net/qq_37784788/article/details/83210811