我想检查所有请求中的会话,如果不存在特定会话,则将用户重定向到登录页面。
我在每次请求之前都使用@ControllerAdvice
和@ModelAttribute
来检查会话,但是如果会话不存在,如何重定向用户?
@ControllerAdvice(basePackages = "ir.sadeghpro.magnet.controller")
public class Advice {
@ModelAttribute
public void checkSession(HttpSession session){
if (session.getAttribute("user") == null){
System.out.println("session is not exists");
// how to redirect user
}
}
第二种方法是使用HandlerInterceptor
获取请求,然后再发送给控制器
@Component
public class CheckSessionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
HttpSession session = request.getSession();
if (session == null || session.getAttribute("user") == null) {
String url = request.getHeader("x-forwarded-proto") + "://" + request.getHeader("x-forwarded-host") + "/login";
response.sendRedirect(url);
return false;
} else {
return true;
}
}
}
但是通过这种方式,静态资源(例如js或CSS或图片)将被重定向到/login
网址
是否有任何方法可以检查会话或任何条件,并且如果对所有请求返回错误的重定向到某个页面,则不检查每个控制器中的内容?