拦截器 preHandle() 未重定向到 login.html

Posted

技术标签:

【中文标题】拦截器 preHandle() 未重定向到 login.html【英文标题】:Interceptor preHandle() not redirecting to login.html 【发布时间】:2014-05-24 07:08:56 【问题描述】:

我有一个弹簧应用程序。我引入了一个 sessionInterceptor 来防止直接访问 index.jsp。如果用户没有登录,它就不能访问 index.jsp 并且应该被重定向到 login.html。代码正在访问 preHandle() 方法并运行所有代码,但在 return false 之后它没有重定向到 login.html。怎么了?有高手帮忙吗?提前致谢。

我在 SessionInterceptor.java 中的 preHandle() 是:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 

        HttpSession session = request.getSession();

        // if displaying the home page, make sure the user is reloaded.
        if (request.getRequestURI().endsWith("login.html")) 
            session.removeAttribute("isUserLoggedIn");
        

        if (session.getAttribute("isUserLoggedIn") == null && !request.getRequestURI().endsWith("login")) 
            response.sendRedirect(request.getContextPath() + "/login.html");
            return false;               
        
        return true;
    

我也尝试了以下方法,但都是徒劳的。

RequestDispatcher dispatcher = request.getServletContext().getRequestDispatcher("/login.html");
                dispatcher.forward(request, response);

我的 dispatcher-servlet.xml 设置是:

<bean id="sessionInterceptor" class="com.xxx.xxx.xxx.SessionInterceptor" />
<bean id="annotationMapper" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="sessionInterceptor" />
        </list>
    </property>
</bean>

<!-- Configures Handler Interceptors -->
<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <bean class="com.xxx.xxx.xxx.SessionInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

web.xml 是:

  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>login.html</welcome-file>
  </welcome-file-list>

【问题讨论】:

如果不重定向,它在做什么? 它什么也没做。运行完整代码后。它保持在同一页面上。 那是什么页面?如果您打开浏览器的网络控制台,响应包含什么? Request URL:http://localhost:8080/myContext/index.jsp Request Method:GET Status Code:200 OK 响应是我的 index.jsp。 ***.com/questions/11132653/…的可能重复 【参考方案1】:

您可以尝试重定向到将从控制器捕获的逻辑路径 试试

response.sendRedirect("/NotLogged");

然后像这样创建一个函数:

@RequestMapping(value = "/NotLogged", method = RequestMethod.GET)
public String notLogged() 
    return "login.html";

希望对你有用!

【讨论】:

response.sendRedirect(request.getContextPath() + "/errors/401.html");【参考方案2】:

当我使用 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;

【讨论】:

以上是关于拦截器 preHandle() 未重定向到 login.html的主要内容,如果未能解决你的问题,请参考以下文章

页面未重定向到给定链接 Mandrill

Magento - PayPal 未重定向到移动网站

PHP标头未重定向到感谢页面

未重定向到 Codeigniter 4 中的特定 URL

验证后挂钩未重定向到表单页面

命令输出(stdout,stderr)未重定向到管道