2011-08-03 34 views
6

我新的JSF和PrettyFaces。所以現在我發現我可以配置PrettyFaces來將請求「轉發」到正確的.xhtml文件。問題是,我(或用戶,如果他知道我的文件夾結構)也可以請求文件。這是我的示例:JSF和PrettyFaces - 如何限制直接XHTML要求

文件: webbapp/mypage.xhtml

我添加以下行漂亮-config.xml中:

<url-mapping id="myPageId"> 
    <pattern value="/prettyurltomypage" /> 
    <view-id value="/mypage.xhtml" /> 
</url-mapping> 

的PrettyFaces過濾器配置攔截的「/ 「。 Faces Front Controller配置爲處理所有「 .xhtml」請求。當我要求...

http://localhost:8080/myapp/prettyurltomypage 

...很好。我的問題是,我還可以請求...

http://localhost:8080/myapp/mypage.xhtml 

我該如何限制.xhtml請求?我的目標是讓jsf/server提供默認的404頁面。

我的解決方案(到目前爲止)是定義漂亮-config.xml中重寫規則:

<rewrite match="/mypage.xhtml" substitute="/prettyurltomypage" redirect="301" /> 

是否有任何其他(聰明)的方式?

回答

6

它可以通過部署描述符標記XHTML文件作爲網絡資源來完成。
要做到這一點,您可以添加這樣的事情你的web.xml

<security-constraint> 
    <display-name>Restrict direct access to XHTML files</display-name> 
    <web-resource-collection> 
     <web-resource-name>XHTML files</web-resource-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </web-resource-collection> 
    <auth-constraint/> 
</security-constraint> 

如果您想了解更多關於安全方面的限制有在一個的Javalobby簡要article

+0

@Christian Beikov如果輸入的URL與'url-pattern'中的表達式匹配,那麼無論您使用哪種過濾器,都會得到HTTP 403。作爲旁註,我在生產環境中使用基於安全約束的解決方案,到目前爲止,我無法直接訪問JSF頁面。 – BCsongor

0

請參見下面的問題: http://code.google.com/p/prettyfaces/issues/detail?id=116

希望這將幫助你

+0

安全約束不起作用,因爲它通過PrettyFaces,濾池運行的請求將被轉發,最後該文件的請求總是完成。我所知道的唯一解決方案是設置一個拒絕訪問的Filter,但您必須瞭解資源請求還會使用爲servlet定義的映射的事實。 –

+0

@BCsongor我無法訪問任何與此安全約束。 Prettyfaces當然會將請求轉發給.xhtml文件,並且因爲那個文件必須被調用。 –

3

呀,如果你只是想阻止訪問直接頁面,這可能去沒有使用類似定製的安全包裝的最好辦法 - 否則,如果你只是想確保頁面正確呈現。實際上,您可以將您的臉部servlet映射更改爲.xhtml,這意味着當用戶訪問頁面時,您的源碼不會公開。

<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.faces</url-pattern> 
</servlet-mapping> 

如果你想要做更復雜的重寫規則,以實際鎖定的網頁,你可以考慮使用自定義重寫處理器和執行處理器接口。

http://ocpsoft.com/docs/prettyfaces/3.3.0/en-US/html_single/#inbound_rewriting.options

定製處理器可以訪問HttpServletRequest和HttpServletResponse的和入站和出站重寫同時調用:你可以用這個接口可以做更復雜的事情:

/** 
* Perform a rewrite operation on a given URL, utilizing any necessary information from the given {@link RewriteRule} 
* configuration object from which the processor was invoked. 
* 
* @author Lincoln Baxter, III <[email protected]> 
*/ 
public interface Processor 
{ 
    /** 
    * Process an inbound URL Rewrite request. This takes place when the request first comes in to the server and passes 
    * through {@link RewriteFilter} 
    */ 
    String processInbound(HttpServletRequest request, HttpServletResponse response, RewriteRule rule, String url); 

    /** 
    * Process an outbound URL Rewrite request. This takes place when a URL is passed in to 
    * {@link HttpServletResponse#encodeRedirectURL(String)}, and since most frameworks ensure the call to 
    * 'encodeRedirectUrl()' occurs automatically, can be assumed to occur whenever a URL would be rendered to HTML 
    * output. 
    */ 
    String processOutbound(HttpServletRequest request, HttpServletResponse response, RewriteRule rule, String url); 
} 

否則,你在做什麼將工作,直到OCPSoft重寫https://github.com/ocpsoft/rewrite(誰也落後PrettyFaces)發佈,在這種情況下,您可以通過簡單的入站重寫規則輕鬆完成此操作:

package com.example; 
public class ExampleConfigurationProvider extends HttpConfigurationProvider 
{ 

    @Override 
    public int priority() 
    { 
    return 10; 
    } 

    @Override 
    public Configuration getConfiguration(final ServletContext context) 
    { 
    return ConfigurationBuilder.begin() 
     .defineRule() 
     .when(Direction.isInbound().and(DispatchType.isRequest()).and(Path.matches(".*\\.xhtml")).andNot(Path.matches(".*javax.faces.resource.*"))) 
     .perform(SendStatus.code(404)); 
    } 
} 

此重寫規則將阻止訪問.XHTML文件上的入站HTTP請求,同時仍允許轉發錯誤或異步請求。它還會使JSF2資源API處於功能狀態,如果您按照另一個答案中的建議使用Java EE安全約束,情況並非如此。

希望這有助於 林肯

+0

嘿!非常感謝! – Alebon

+0

我的榮幸:)很高興我可以幫忙! – Lincoln