首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Spring启动拦截器重定向

使用Spring启动拦截器重定向
EN

Stack Overflow用户
提问于 2017-06-25 03:43:55
回答 3查看 13.6K关注 0票数 4

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

在拦截器内部,当用户没有登录时,它将重定向到登录页面。这可以很好地工作。但问题是,在重定向到登录页面之前,控制器首先被执行。

我的拦截器代码:

代码语言:javascript
复制
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之后,此控制器仍将被执行)。为什么?我对这个问题很感兴趣。

代码语言:javascript
复制
@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;
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-25 04:07:14

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

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

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

变化

代码语言:javascript
复制
if (userSession == null) {
    response.sendRedirect("/login");
}

代码语言:javascript
复制
if (userSession == null) {
    response.sendRedirect("/login");
    return false;
}
票数 19
EN

Stack Overflow用户

发布于 2018-12-08 14:12:32

在拦截器preHandle()函数中。

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

返回true,以便让Spring知道通过另一个spring拦截器处理请求,或者如果没有更多的spring拦截器,则将其发送到处理程序方法(您的控制器函数)。

因此,在这种情况下,在interceptor preHandle函数的末尾返回false。

票数 1
EN

Stack Overflow用户

发布于 2020-07-07 03:59:42

当我使用return false时,我得到"Error: Exceeded。可能卡在重定向循环http://localhost:8080/api/login中“

代码语言:javascript
复制
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if(true){
            response.sendRedirect("/api/login");
            return false;
        }
        return true;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44740332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档