2012-11-21 48 views
2

我有JSF頁面,這些頁面鏈接到其他JSF頁面。當我點擊鏈接並且會話已經過期時,控制權轉到登錄頁面。我將用用戶名密碼登錄,然後再次進入我點擊鏈接的同一頁面。現在我將點擊鏈接,顯示一個空白頁面,如果我通過F5進行頁面刷新,則會加載預期的頁面。在Session過期後處理JSF頁面變空白

而且還我檢查了我的控制檯JBoss服務器上,查看過期異常沒有出現。

,所以我有點困惑我處理這方式是爲了避免越來越顯示空白頁。

請幫忙。

+0

你可以與相關的代碼更新。 – 757071

回答

2

如果你通過Ajax和登錄是從瀏覽器緩存送達後返回的頁面進行鏈接導航可能發生這種情況(因此包含一個過時的視圖狀態標識符的形式)。您需要告訴瀏覽器不要緩存受限制的頁面。你可以用下面的過濾器實現這一目標:

@WebFilter(servletNames={"Faces Servlet"}) 
public class NoCacheFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest req = (HttpServletRequest) request; 
     HttpServletResponse res = (HttpServletResponse) response; 

     if (!req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc) 
      res.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
      res.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
      res.setDateHeader("Expires", 0); // Proxies. 
     } 

     chain.doFilter(request, response); 
    } 

    // ... 
} 

請注意,這個問題因而也表明你正在使用頁面到頁面導航(阿賈克斯)命令鏈接。這是一個不好的做法。這些鏈接不是SEO友好的,也不是可收藏的。命令鏈接只能用於表單提交。使用普通鏈接進行頁面到頁面導航。另請參見When should I use h:outputLink instead of h:commandLink?

+0

感謝您的回覆。 –

+0

@BalusC,但是當我使用Post Redirect Get模式的命令鏈接時,它可以嗎? – guest

0

@BaluSC:感謝您的答覆。

二手H:outputLink的儘可能。
而且我通過web.xml中的標記處理了ViewExpiredException。

<error-page> 
    <exception-type>java.lang.Exception</exception-type> 
    <location>/ErrorHandler</location> 
    </error-page> 

<servlet> 
    <servlet-name>ErrorHandler</servlet-name> 
    <servlet-class>com.common.beans.ErrorHandler</servlet-class> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>ErrorHandler</servlet-name> 
    <url-pattern>/ErrorHandler</url-pattern> 
    </servlet-mapping> 

使用一個servlet來處理這個異常並重定向到同一頁面並正確加載頁面。 而Servlet的doGet方法檢查ViewExpiredException。

public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException 
{ 

     if (request.getAttribute("javax.servlet.error.exception") != null 
     && request.getAttribute("javax.servlet.error.exception") 
      .toString().contains("ViewExpiredException")) 
     { 

      String[] attributes = 
       request.getAttribute("javax.servlet.error.request_uri") 
        .toString().split("/"); 
      StringBuilder redirectViewId = new StringBuilder(""); 
      for (int i = 2; i < attributes.length; i++) 
      { 
       redirectViewId.append("/").append(attributes[i]); 
      } 
      response.sendRedirect(FacesUtils.getFullRequestUrl(request) 
       + redirectViewId); 
     } 
}