我使用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;
}
答案 0 :(得分:11)
如果执行完毕,你应该从你的拦截器return false
。
返回: 如果执行链应继续执行下一个拦截器或处理程序本身,则为true。否则,DispatcherServlet假定这个拦截器已经处理了响应本身。
更改
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;
}