使用 Spring 引导拦截器重定向

Redirect using Spring boot interceptor

我使用 spring boot 和 freemarker 创建了一个网络应用程序并实现了拦截器 (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");
        }
    }

控制器class(在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;
    }

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

Returns: true if the execution chain should proceed with the next interceptor or the handler itself. Else, DispatcherServlet assumes that this interceptor has already dealt with the response itself.

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

改变

if (userSession == null) {
    response.sendRedirect("/login");
}

if (userSession == null) {
    response.sendRedirect("/login");
    return false;
}

在拦截器preHandle()函数中。

return false 让 Spring 框架假定请求已由 spring 拦截器本身处理,不需要进一步处理.

return true 让 Spring 知道通过另一个 spring 拦截器处理请求或将其发送到处理程序方法(您的控制器功能)如果没有更多的 spring 拦截器。

因此,在这种情况下 return 在拦截器 preHandle 函数的末尾为 false。

当我使用 return false 时,我会收到“错误:超出 maxRedirects。可能陷入重定向循环 http://localhost:8080/api/login”

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if(true){
            response.sendRedirect("/api/login");
            return false;
        }
        return true;
    }