核心思路:利用 Session 充当Cookie的功能,将登录后的用户名存储在Session中,创建Filter来为每个请求拦截校验,如果url前缀是/login或者静态资源就放行,其他则尝试获取Session值,如果有则放行,没有就重定向到login页面。

退出登录则直接删除session内容并重定向到login页面。

前端

这里为退出登录添加一个提示框(这里使用提示框框架jquery-confirm.js

$('.logout').on('click',function(){  
  $.confirm({  
    title: '警告',  
    content: '您确定要退出吗?',  
    type: 'orange',  
    typeAnimated: false,  
    buttons: {  
      omg: {  
        text: '确认',  
        btnClass: 'btn-orange',  
        action: function(){  
          window.location.href="/logout";  
	    }      
	  },      
	  close: {  
		    text: '关闭',
	  }    
	}  
  });
});

后端

登录请求成功时添加Session:

@PostMapping(value = "/login", produces = "application/json;charset=UTF-8")  
@ResponseBody  
public Response login(String username,String password, String captcha, HttpSession httpSession, Model model) {  
    log.info("username: " + username + ", password: " + password + ", captcha: " + captcha);  
    String sessionCaptcha = (String) httpSession.getAttribute("captcha");  
    log.info("sessionCaptcha: " + sessionCaptcha);  
    if (captcha == null || !captcha.equals(sessionCaptcha)) {  
        model.addAttribute("isCaptchaFailure", true);  
        return Response.failure("验证码错误");  
    }    Response response = userService.authenUser(username, password);  
    if (response.isSuccess()) {  
        httpSession.setAttribute("username", username);  
    }    return response;  
}

配置Filter:

@Component
@Order(1)
@Slf4j
public class AuthorizationFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 判断请求路径是否为 /login 如果是则放行。如果不是则判断session中是否有登录信息,如果有则放行,如果没有则跳转到登录页面
        String url = ((HttpServletRequest) servletRequest).getRequestURI();
        log.info("url: " + url);
 
        if(!(url.equals("/login") || url.startsWith("/js") || url.startsWith("/css") || url.startsWith("/images") || url.startsWith("/fonts") || url.startsWith("/checkLogin") || url.startsWith("/captcha") )) {
            String username = (String) ((HttpServletRequest) servletRequest).getSession().getAttribute("username");
            if (username == null) {
                ((HttpServletResponse) servletResponse).sendRedirect("/login");
                return;
            }
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

配置退出登录请求:

@GetMapping("/logout")  
public String logout(HttpSession httpSession) {  
    httpSession.removeAttribute("username");  
    return "redirect:/login";  
}