2016-02-24 18 views
2

我到处都找,但还没有找到一个简单的解决方案。SpringMVC会话超时 - 重定向到一个特殊的JSP

我们有一个特殊的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来到这个servlet映射,* .mvc:

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

凡是发送URL这种模式应该是交叉检查会话有效性和若无效,重定向到超时。 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> 

只要我试图访问有一个在我用SpringMVC表单代码NullPointerException异常甚至任何形式收到SessionRequiredException之前,会议。我需要全局防范这些NullPointerException。

+1

嗨基因,你可以使用拦截此功能的SO线程,让你开始http://stackoverflow.com/questions/8295977/interceptors-in-spring-mvc –

回答

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 

    } 

} 
+0

为什么你使用'SessionHandler'作为那个? AFAIK它是一个Jetty类,所以它不会在Tomcat中工作。为什么不'if(request.getSession(false)!= null){chain.doFilter(...'你也应该说你必须使过滤器不处理初始*登录*页面... –

+0

正如你在评论中所说的那样,Spring拦截器是完全可以接受的(并且可能更容易编写和集成到Spring MVC应用程序中) –

+0

谢谢是SessionHandler是我们自己的类,我编辑了我的答案以澄清它仅仅是进行常规会话.isValid检查。 –