2016-02-24 17 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檢查。 –