使用 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.
改变
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;
}
我使用 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.
改变
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;
}