核心思路:利用 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";
}