0
点赞
收藏
分享

微信扫一扫

记住我的登录状态实现

干自闭 2022-01-30 阅读 72

在网站中,http 请求是无状态的,也就是说,当用户1连接服务器并登录成功后,刷新网站重新连接的时候,仍需要重新登录,仅通过常规信息无法识别不同用户。而 cookies 的出现就是为了解决这种问题,实现网站上记住登录状态的功能,使用户在登录成功后的一段时间内不需要重新登录就可以访问网站。

实现思路

  1. 使用cookies方式实现:当用户登录成功后,服务器为客户端设置 cookie ,值由用户名和密码组成。当用户第二次访问网页时,就会把自动地把自己 cookies 一并发送给服务器,服务器通过携带的 cookies 数据就能识别当前用户。(用户名密码信息较为重要,记得进行加密,由服务器进行解密识别)
  2. 通过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();
        // 没有保存cookies记录
        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;
            }
        }
        // 找不到sessionid,重新登录
        if(!isheve){
            response.sendRedirect(request.getContextPath() + "/login");
            return false;
        }
        // 此处进行数据校验
        // HttpSession session = request.getSession();
        // User username = (User) session.getAttribute(sessionid);
        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";
        }
        
        // 登录判断逻辑
        // if(...) ...
        
		// 登录成功后保存session和设置cookies
        String uuid = UUID.randomUUID().toString();
        // 将登录用户信息保存到session中
        session.setAttribute(uuid,user);
        // 保存cookie,实现自动登录
        Cookie cookie_username = new Cookie("sessionid", uuid);
        // 设置cookie的持久化时间,30天
        cookie_username.setMaxAge(30 * 24 * 60 * 60);
        // 设置为当前项目下都携带这个cookie
        cookie_username.setPath(request.getContextPath());
        // 向客户端发送cookie
        response.addCookie(cookie_username);
        return "hi";
    }
举报

相关推荐

0 条评论