2010-08-30 37 views
1

我在我的應用程序中使用Orchestra和RichFaces。在我的應用程序訪問頁面時,我得到了下面的錯誤很多次,頁面沒有加載:Orchestra和RichFaces問題

WARN _ReentrantLock:103 - Waited for longer than 30000 milliseconds for access to lock [email protected] which is locked by thread http-8080-2 

我相信在心臟的問題是,我使用的身份驗證過濾器。下面是它的代碼(conversationController是會話範圍的bean):

@Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
    throws IOException, ServletException 
    {   
     FacesContextBuilder builder = new FacesContextBuilder(); 

     FacesContext facesContext = builder.getFacesContext(request, response); 
     ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext(); 
     Application application = facesContext.getApplication(); 
     ELContext elContext = facesContext.getELContext(); 
     ConversationController conversationController = (ConversationController) application.getELResolver().getValue(elContext, null, "conversationController"); 
     SessionController sessionController = (SessionController) application.getELResolver().getValue(elContext, null, "sessionController"); 
     ApplicationController applicationController = (ApplicationController) application.getELResolver().getValue(elContext, null, "applicationController"); 
     EntityRegistry entityRegistry = conversationController.getEntityRegistry();  

     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     HttpServletResponse httpResponse= (HttpServletResponse) response; 

     User currentUser = sessionController.getCurrentUser(); 

     Boolean isTesting = (Boolean) servletContext.getAttribute("ginger.TESTING"); 
     if (isTesting == null) isTesting = false; 

     if (currentUser == null) 
     { 
      if (httpRequest.isSecure() || isTesting) 
      {    
       Cookie[] cookies = httpRequest.getCookies(); 
       Cookie cookie = null; 

       if (cookies != null) 
       { 
        for (int i=0; i<cookies.length; i++) 
        { 
         if (cookies[i].getName().equals("ginger.USERCOOKIE")) 
         { 
          cookie = cookies[i]; 
          break; 
         } 
        } 
       } 

       if (cookie != null) 
       { 
        currentUser = entityRegistry.getUserByCookie(cookie.getValue()); 
       } 

       if (currentUser == null) 
       { 
        currentUser = new UnregisteredUser(); 

        String cookieValue = String.valueOf(applicationController.getRandom()); 

        currentUser.setCookie(cookieValue); 

        entityRegistry.storeUser(currentUser); 

        cookie = new Cookie("ginger.USERCOOKIE", cookieValue); 
        cookie.setPath(applicationController.getPath()); 
        cookie.setMaxAge(365*24*60*60); 
        if (!isTesting) cookie.setSecure(true); 

        httpResponse.addCookie(cookie); 
       } 

       sessionController.setCurrentUser(currentUser); 

       @SuppressWarnings("unchecked") 
       String url = URLConstructor.constructUrl(servletContext, httpRequest, httpResponse, false, httpRequest.getRequestURI(), httpRequest.getParameterMap()); 

       httpResponse.sendRedirect(url); 
      } 
      else 
      { 
       @SuppressWarnings("unchecked") 
       String url = URLConstructor.constructUrl(servletContext, httpRequest, httpResponse, true, httpRequest.getRequestURI(), httpRequest.getParameterMap()); 

       httpResponse.sendRedirect(url); 
      } 
     } 
     else 
     { 
      chain.doFilter(request, response); 
     } 

     builder.removeFacesContext(); 
    } 

回答

2

我響應被提交之前解決了這個通過釋放FacesContext的。就像這樣:

@SuppressWarnings("unchecked") 
String url = URLConstructor.constructUrl(servletContext, httpRequest, httpResponse, true, httpRequest.getRequestURI(), httpRequest.getParameterMap()); 
builder.removeFacesContext(); 
httpResponse.sendRedirect(url); 

我不完全理解這一點,但它似乎新請求仍然使用舊的FacesContext,這干擾了_ReentrantLock越來越解鎖。