SpringMVC会话超时 - 重定向到特殊JSP

时间:2016-02-24 18:48:00

标签: spring spring-mvc

我到处寻找,但没有找到一个简单的解决方案。

我们有一个特殊的JSP, timeout.jsp ,只要SpringMVC模块拦截无效的会话操作,就需要显示它。超时已在web.xml中配置并且可以正常工作。

以前在Struts中,这是一个定义前进和拦截dispatchMethod的问题,

<forward name="sessionTimeout" path="/WEB-INF/timeout.jsp" redirect="false" />

   @Override
    protected ActionForward dispatchMethod(final ActionMapping mapping, final ActionForm form,
            final HttpServletRequest request, final HttpServletResponse response, final String name)
            throws Exception {
           //...
          if (!isSessionValid())
             return mapping.findForward("sessionTimeout");
}

但是如何在SpringMVC模块中实现全能解决方案呢?

我的所有SpringMVC URL都来自这个servlet映射,* .mvc:

<servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>*.mvc</url-pattern>
</servlet-mapping>

任何发送带有此模式的网址的内容都应该交叉检查会话有效性,如果无效,则重定向到 timeout.jsp

请注意 此处给出的解决方案(https://stackoverflow.com/a/5642344/1005607 工作:

<web-app>
    <error-page>
        <exception-type>org.springframework.web.HttpSessionRequiredException</exception-type>
        <location>/index.jsp</location>
    </error-page>
</web-app>

在我尝试访问会话时,即使在任何类型的SessionRequiredException之前,我的SpringMVC表单代码中也存在NullPointerException。我需要全局防范这些NullPointerExceptions。

1 个答案:

答案 0 :(得分:1)

我的最终解决方案:老式过滤器。它适用于我,没有其他简单的解决方案。

<强>的web.xml

<filter>
    <filter-name>spring_mvc_controller_filter</filter-name>
    <filter-class>myapp.mypackage.SpringMVCControllerFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>spring_mvc_controller_filter</filter-name>
    <url-pattern>*.mvc</url-pattern>
</filter-mapping>   

<强> SpringMVCControllerFilter

public class SpringMVCControllerFilter implements Filter
{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

        HttpSession session = request.getSession(false);
        if (session.isValid() && !session.isNew())
        {
            chain.doFilter(request, response);
        }
        else
        {
            request.getRequestDispatcher("/WEB-INF/jsp/sessionTimeout.jsp").forward(request, response);
        }


    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}