在完成登陆时,如果用户勾选"自动登陆",将在下次登陆时,自动完成登陆功能,减少用户再次输入账号和密码繁琐的操作。此功能是对用户的操作体验进行优化,
效果图如下:
- 步骤1:确定登录表单复选框login.jsp
-<input type="checkbox" name="autoLogin" value="autoLogin"> 自动登录 </label> <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
-