2010-08-18 56 views
3

如果我的問題沒有任何意義,我很抱歉。所以這裏是我的:2頁,A.jsfB.jsf。當我按下A.jsf中的按鈕時,代碼將設置object的值並重定向到B.jsf。包含B.jsf將取決於我在A.jsf中設置哪個對象(取決於我點擊哪個按鈕)。因此,我不想讓用戶在網絡瀏覽器防止用戶向頁面發出GET請求

http://myhost:myport/myproject/B.jsf

鍵入這一點,並直接到達B.jsf。所以,沒有GET請求到B.jsf,只有POST。如果我看到GET請求B.jsf,我重定向到A.jsf。我覺得解決方案在web.xml之內。
順便說一句,我使用Netbean 6.8和Java EE 6

編輯 這裏是解決方案。由於BalusC
MyFilter.java

package org.xdrawings.filter; 

public class MyFilter implements Filter{ 

    private FilterConfig filterConfig = null; 

    public void destroy(){} 

    public void init(FilterConfig filterConfig){ 
     this.filterConfig = filterConfig; 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{ 
     HttpServletRequest req = (HttpServletRequest)request; 
     HttpServletResponse res = (HttpServletResponse) response; 
     if("GET".equals(req.getMethod()) && "/B.jsf".equals(req.getServletPath())){ 
      res.sendRedirect("A.jsf"); 
     }else { 
      chain.doFilter(request, response); 
     } 
    } 
} 

然後我web.xml

<filter> 
    <filter-name>My Filter</filter-name> 
    <filter-class>org.xdrawings.filter.MyFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>My Filter</filter-name> 
    <url-pattern>*.jsf</url-pattern> 
</filter-mapping> 

All credits go to BalusC

回答

7

是的,如你所猜,可以從web.xml中控制。您需要聲明security-constrainturl-pattern/b.jsfhttp-methodGET,以及一個空的auth-constraint

<security-constraint> 
    <display-name>Prevent GET requests on the b.jsf file</display-name> 
    <web-resource-collection> 
     <web-resource-name>The b.jsf file</web-resource-name> 
     <url-pattern>/b.jsf</url-pattern> 
     <http-method>GET</http-method> 
    </web-resource-collection> 
    <auth-constraint /> 
</security-constraint> 

然而這顯示HTTP 403 error。這不(也不能)重定向到a.jsf(至少,不是沒有提供必要的檢查提供自定義403錯誤頁面,但這是很難看的)。如果重定向是強制性的,其他的解決方案可供選擇:

  1. 在請求的構造函數通過ResponseStateManager#isPostback()作用域與b.jsf支票回傳相關的bean,然後使用ExternalContext#redirect()重定向相應。

    FacesContext context = FacesContext.getCurrentInstance(); 
    if (!context.getRenderKit().getResponseStateManager().isPostback(context)) { 
        context.getExternalContext().redirect("a.jsf"); 
    } 
    

    如果你已經在JSF 2.0,您還可以使用便捷的方法,而不是FacesContext#isPostback(),這是打字少。

  2. 或者作爲更高層次的方法,創建一個完成任務的Filter。請求的頁面和HTTP方法分別可以通過HttpServletRequest#getServletPath()getMethod()獲得,重定向可以使用HttpServletResponse#sendRedirect()完成。

    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse res = (HttpServletResponse) response; 
    if ("GET".equals(req.getMethod()) && "/b.jsf".equals(req.getServletPath())) { 
        res.sendRedirect("a.jsf"); 
    } else { 
        chain.doFilter(request, response); 
    } 
    

    這可以更容易地擴展到未來的方法和頁面,你可以在web.xmlFilter的各init-param下配置。

+1

令我驚訝的是,您對Web開發瞭解多少。你的第一種方法很好。但是,我也想學習第二種方法,因爲我總是聽到有人創建過濾器,但不知道它是什麼。所以你好像在這裏創建一個自定義的'Filter',並告訴項目通過'web.xml'使用該過濾器,對嗎?讓我試試看,然後回到你身邊。非常感謝你 – 2010-08-19 23:50:27

+0

我實現你的第二種方法,但我有幾個問題,你可以看看我的更新後的帖子,看看我的實現。 – 2010-08-20 00:26:10

+1

過濾器可以映射到'/ *'的'',或者更具體的'* .jsf',甚至更具體的'/ b.jsf'(然後刪除'if'塊中的不必要的檢查)。 ''是可選的。如果您定義了任何,則可以通過['FilterConfig#getInitParameter()'](http://download.oracle.com/javaee/5/api/javax/servlet/FilterConfig.html#getInitParameter%28java.lang .String%29)在'init()'方法內部,然後你可以將它指定爲實例變量,並在'doFilter()'邏輯中進一步使用它。例如。一串逗號分隔的頁面名稱等等。 – BalusC 2010-08-20 00:29:14

1

是不是有什麼毛病讓B.jsf您在A.jsf設置的值,併發出一個重定向,如果是不存在?