使用Spring启动拦截器重定向

kev*_*olo 2 redirect spring spring-mvc interceptor spring-boot

我使用spring boot和freemarker创建了一个Web应用程序,并实现了拦截器(HandlerInterceptorAdapter).

在拦截器内部,当用户未登录时,它将重定向到登录页面.这很好用.但问题是控制器在重定向到登录页面之前首先被执行.

我的拦截器代码:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
        User userSession = (User) request.getSession().getAttribute("user");
        if (userSession == null) {
            response.sendRedirect("/login");
        }
    }
Run Code Online (Sandbox Code Playgroud)

控制器类(在response.sendRedirect之后,此控制器仍然被执行).为什么?我陷入了这个问题.

@RequestMapping("/home")
    public String home(Model model, HttpServletRequest httpServletRequest) {

        String returnPage = "home-admin";

        User user = (User) httpServletRequest.getSession().getAttribute("user");
        if(user != null){
            String accessType = accessTypeRepository.getAccessType(user.getAccessId());
            if(StrUtil.isEqual(accessType, AccessTypeConst.MANAGER.getType())){
                returnPage = "home-manager";
            }
        }
        return returnPage;
    }
Run Code Online (Sandbox Code Playgroud)

Bun*_*ner 12

return false如果你完成执行,你应该从你的拦截器.

返回:如果执行链应继续使用下一个拦截器或处理程序本身,则返回true.否则,DispatcherServlet假定这个拦截器已经处理了响应本身.

http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html

更改

if (userSession == null) {
    response.sendRedirect("/login");
}
Run Code Online (Sandbox Code Playgroud)

if (userSession == null) {
    response.sendRedirect("/login");
    return false;
}
Run Code Online (Sandbox Code Playgroud)