我已经使用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;
}发布于 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
变化
if (userSession == null) {
response.sendRedirect("/login");
}至
if (userSession == null) {
response.sendRedirect("/login");
return false;
}发布于 2018-12-08 14:12:32
在拦截器preHandle()函数中。
返回false,让Spring框架假定请求已经由spring拦截器本身处理,不需要进一步的处理。
返回true,以便让Spring知道通过另一个spring拦截器处理请求,或者如果没有更多的spring拦截器,则将其发送到处理程序方法(您的控制器函数)。
因此,在这种情况下,在interceptor preHandle函数的末尾返回false。
发布于 2020-07-07 03:59:42
当我使用return false时,我得到"Error: Exceeded。可能卡在重定向循环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;
}https://stackoverflow.com/questions/44740332
复制相似问题