使用Spring启动拦截器重定向

时间:2017-06-24 19:43:55

标签: spring spring-mvc redirect spring-boot interceptor

我使用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");
        }
    }

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

3 个答案:

答案 0 :(得分:11)

如果执行完毕,你应该从你的拦截器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");
}

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

答案 1 :(得分:1)

在拦截器preHandle()函数中。

返回false ,以让Spring框架假定请求已由Spring拦截器本身处理,并且不需要进一步的处理。

返回真,让Spring知道通过另一个Spring拦截器处理该请求,或者如果没有其他Spring拦截器,则将其发送到处理程序方法(您的控制器功能)。

因此,在这种情况下,拦截器 preHandle 函数最后返回false。

答案 2 :(得分:1)

当我使用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;
    }