【问题标题】:Spring MVC HandlerInterceptor : Redirect FailedSpring MVC HandlerInterceptor:重定向失败
【发布时间】:2016-09-13 06:37:58
【问题描述】:

我创建了一个简单的 WebMVC 应用程序 - 配置了处理程序拦截器。拦截器的职责很简单——它应该检查 HttpRequest 中是否存在有效的会话——如果是,则重定向到注册页面。

我遇到的问题是在重定向时 - 浏览器正在抛出消息:

页面未正确重定向

Firefox 检测到服务器正在重定向请求 这个地址永远不会完成。

拦截器代码如下:

public class LoginInterceptor extends HandlerInterceptorAdapter{



// to be used checking session management for user.
@Override
public boolean preHandle(HttpServletRequest request,
                         HttpServletResponse response,
                         Object handler) throws Exception {


    System.out.println(" <interceptor> - this is pre handle");

    return true;
}


@Override
public void postHandle(HttpServletRequest request,
                       HttpServletResponse response, Object handler,
                       ModelAndView modelAndView) throws Exception {

    System.out.println(" <interceptor> - this is post handle");

    HttpSession session = request.getSession();
    User user = (User) session.getAttribute("user");


    System.out.println(" <interceptor> - session id is --> " + session.getId());
    System.out.println(" <interceptor> - session create time is --> " + session.getCreationTime());
    System.out.println(" <interceptor> - session last accessed time is --> " + session.getLastAccessedTime());

    try {
        System.out.println(" <interceptor> - user info is --> " + user.toString());
    }catch(Exception e){
        e.toString();
    }

    try{
        if(session != null){
            response.sendRedirect("register");
            return;
        }
    }catch(Exception e){
        e.toString();
    }

}


public void afterCompletetion(){
    System.out.println(" <interceptor> - this is after completion");

}

}

我试图将完整的请求上下文路径附加到重定向 - 以及根上下文 - 两者都失败了。我看不出我在这方面失败的地方 - 所以非常感谢任何帮助。

【问题讨论】:

  • 不确定这是否只是 C&P 问题...但请检查最后一个方法...您拼错了... public void afterComplete(){ 应该是 public void afterCompletion(){ 并且不要不要忘记使用@Override,你自己发现了问题......
  • 更改为response.sendRedirect(request.getContextPath()+"/register");

标签: java spring spring-mvc filter handler


【解决方案1】:

无论您编写什么拦截器,所有请求都会显示出来。

所以当它重定向到/register 时,它也会到达拦截器,它会发现session 不为空,然后再次重定向......同样的事情继续......无限重定向到同一个请求。

@Override
public void postHandle(HttpServletRequest request,
                       HttpServletResponse response, Object handler,
                       ModelAndView modelAndView) throws Exception { 
    HttpSession session = request.getSession(); 
    try{
        if(session != null){                            //Infinite 
            response.sendRedirect("register");
            return;
        }
    }catch(Exception e){
        e.toString();
    }

}

所以请确保它只会拦截configurationcode 的一个请求

if((request.getRequestURI().equals(contextPath+"/someURI") && session != null){
    response.sendRedirect("register");
}

然后它将只检查特定请求并重定向到注册。它不会陷入无限循环。

【讨论】:

    【解决方案2】:

    检查你的拦截器配置,看看它是否只接受特定的 url 模式。

    请参见下面的示例。

    <!-- Configures Interceptors -->
    <mvc:interceptors>
         <!-- This XML will intercept all URIs -->
         <bean class="com.howtodoinjava.interceptor.DemoInterceptor"></bean>
    
         <!-- This XML will apply interceptor to only certain URIs -->
         <!--
         <mvc:interceptor>
              <mvc:mapping path="/users"></mvc:mapping>
              <bean class="com.howtodoinjava.interceptor.DemoInterceptor"></bean>
         <mvc:interceptor>
          -->
    </mvc:interceptors>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-18
      • 2014-06-20
      • 2015-06-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2015-05-19
      相关资源
      最近更新 更多