在网站中,http 请求是无状态的,也就是说,当用户1连接服务器并登录成功后,刷新网站重新连接的时候,仍需要重新登录,仅通过常规信息无法识别不同用户。而 cookies 的出现就是为了解决这种问题,实现网站上记住登录状态的功能,使用户在登录成功后的一段时间内不需要重新登录就可以访问网站。
实现思路
- 使用cookies方式实现:当用户登录成功后,服务器为客户端设置 cookie ,值由用户名和密码组成。当用户第二次访问网页时,就会把自动地把自己 cookies 一并发送给服务器,服务器通过携带的 cookies 数据就能识别当前用户。(用户名密码信息较为重要,记得进行加密,由服务器进行解密识别)
- 通过session方式实现:session 本质上也是通过 cookies 来实现的,区别在于 cookies 数据保存在客户端,而 session 数据保存在服务器端。当用户登录成功的时候,服务器保存一个 sessionid 值,并通过 Cookies 方式发送给客户端,设置有效时间为1个月,那么在今后的一个月中,客户端访问我的网站时会将这个 sessionid 值发送到我的服务器上进行验证,服务器判断是否存在在 sessionid ,存在就直接放行,不存在就跳转到登录界面进行重新登录。
代码实现
使用 HandlerInterceptor 拦截器预先处理请求
public class LoginHandle implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Cookie[] cookies = request.getCookies();
if(null == cookies){
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
String sessionid = "";
boolean isheve = false;
for(Cookie cookie:cookies){
if("sessionid".equals(cookie.getName())){
sessionid = cookie.getValue();
isheve = true;
break;
}
}
if(!isheve){
response.sendRedirect(request.getContextPath() + "/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
return;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
return;
}
}
实现 WebMvcConfigurer ,重写 addInterceptors() 方法来配置拦截器
@Configuration
public class LoginConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration registration = registry.addInterceptor(new LoginHandle());
registration.addPathPatterns("/hi/*");
registration.excludePathPatterns("/login");
}
}
登录成功后保存session和设置cookies
@RequestMapping(value = "/chat", method = RequestMethod.POST)
public String loginIntoChatRoom(User user, HttpServletRequest request, Model model,HttpServletResponse response){
user = userService.validateUserPassword(user.getName(), user.getPassword());
if (user == null){
return "login";
}
String uuid = UUID.randomUUID().toString();
session.setAttribute(uuid,user);
Cookie cookie_username = new Cookie("sessionid", uuid);
cookie_username.setMaxAge(30 * 24 * 60 * 60);
cookie_username.setPath(request.getContextPath());
response.addCookie(cookie_username);
return "hi";
}
|