2015-02-10 58 views
1

我有一個JSF頁面contentEdit.xhtml,它接受一個請求參數「代碼」加載內容進行編輯和其他相關操作。爲了提供訪問控制,我創建了一個ContentAccessFilter過濾器,並將其應用於contentEdit.xhtml,以檢查當前用戶是否有權訪問由「代碼」標識的內容。 ContentAccessFilter的JSF對直接對象的訪問控制

片段:

 boolean isAuthorized = false; 
     String userId = httpReq.getRemoteUser(); 
     String code = httpReq.getParameter("code"); 

     if (code != null && !code.isEmpty()) 
     { 
      ContentDAO dao = ContentDAO.getInstance(); 
      isAuthorized = dao.isContentAuthorized(code, userId); 
     } 

     if (!isAuthorized) 
     { 
      httpRes.sendError(HttpServletResponse.SC_NOT_FOUND); 
      return; 
     } 

對於contentEdit.xhtml的第一個條目,過濾器正常工作的代碼參數的第一個條目中總是存在通過調用諸如/contentArea.xhtml?code=從一個錨的html標記cnn。但是,對contentEdit.xhtml進行後續操作時,代碼參數會丟失。例如,我有像這樣的按鈕。

<p:commandButton value="Download" action="#{contentView.downloadContent}"/> 
<p:commandButton value="Publish" action="#{contentView.publishContent}"/> 

點擊該按鈕將調用與contentEdit.xhtml相同的URL,而參數代碼不包含在請求URL中。這個缺少的參數在過濾器中失敗。

正在使用Servlet在這種情況下過濾一個正確的方式來實現訪問控制?如果是,當觸發一個commandButton時如何包含一個請求參數?

回答

0

過濾器是在Web應用程序中實施授權的好方法......您處於正確的軌道上。

最好的方法是使用過濾器,但將code參數值存儲在會話中(javax.servlet.http.HttpSession),這樣參數不需要在每個請求的查詢字符串中傳遞。您可以在第一個請求的會話數據中設置code屬性,並在收到新請求時檢索它。

如果一定要使用的查詢字符串與每個請求傳遞code值,你就需要使用includeViewParams參數的查詢字符串創建保存code參數在生成的URL。 BalusC(JSF上帝)比任何人都更好地解釋這一點... https://stackoverflow.com/a/17745573/3858863

+0

感謝您的幫助。我認爲會議方式應該是最適合我需要的。我的表單是一個多部分表單,它在使用f:param時引入了一些複雜性,因爲我使用的是servlet 2.5容器。 – lumion 2015-02-16 01:13:53