1. Servlet登录部分:
假设是第一次登录,此时session和cookie中没有用户登录的数据,所以需要在输入登录信息之后将用户信息存入session,
以及将用户的账号密码拼接成字符串在勾选自动登录的状态下存入cookie中,代码如下:
//调用业务层方法登录成功就把user对象信息存储到session中
User user = service.login(username, password);
request.getSession().setAttribute("user", user);
//登录成功将用户的账号密码拼接成字符串存入到cookie中
String userStr = username+":"+password;
//如果用户在客户端勾选了自动登录则客户端传入的请求参数auto的值为on
if ("on".equals(auto)) {
//将账号密码存储到cookie中
Cookie cookie = new Cookie(user",userStr);
cookie.setPath(request.getContextPath());
cookie.setMaxAge(7*24*60*60);
response.addCookie(cookie);
}
2. Filter部分
过滤器的作用是在执行servlet中的方法之前先判断用户是否已经登录,判断的方法就是获取session中的user对象,判断user
对象是否为null,不为null就直接放行;为null就去cookie中查找是否有用户存入的登录信息,如果有就获取信息并存入session中,如
果没有就证明用户没有勾选自动登录或者已经退出登录,代码如下:
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//获取session中user对象
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
//先判断user是否为空,不为空就直接执行放行
if (user == null) {
//user为空证明未登录,则需要去cookie中获取存入的账号密码
Cookie[] cookies = request.getCookies();
//遍历cookies获取账号密码
if (cookies!=null) {
for (Cookie cookie : cookies) {
if ("user".equals(cookie.getName())) {
//获取cookie中user的值然后将账号密码分离出来
String[] str = cookie.getValue().split(":");
try {
//调用业务层的自动登录方法登录
user = service.autoLogin(str[0], str[1]);
} catch (Exception e) {
e.printStackTrace();
}
//登录完成将user对象存入session中
session.setAttribute("user",user);
}
}
}
}
chain.doFilter(req, resp);
3.servlet退出登录部分
退出登录时需要将session和cookie进行销毁,这部分就很简单,代码如下:
//通过调用invalidate方法销毁session对象
HttpSession session = request.getSession();
session.invalidate();
//通过将cookie的生命周期设置为0销毁cookie
Cookie cookie = new Cookie("user","s");
cookie.setMaxAge(0);
cookie.setPath(request.getContextPath());
response.addCookie(cookie);