JSF和PrettyFaces - 如何限制直接的xhtml请求

时间:2011-08-03 09:11:39

标签: jsf restriction prettyfaces

我是JSF和PrettyFaces的新手。所以到现在为止我发现我可以配置PrettyFaces将请求“转发”到正确的.xhtml文件。问题是,我(或用户,如果他知道我的文件夹结构)也可以请求该文件。这是我的样本:

文件: webbapp / mypage.xhtml

我在pretty-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页面。

我的解决方案(到目前为止)是在pretty-config.xml中定义重写规则:

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

还有其他(更智能)的方式吗?

3 个答案:

答案 0 :(得分:6)

可以通过在部署描述符中将XHTML文件标记为Web资源来完成 为此,您可以在 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

答案 1 :(得分: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 <lincoln@ocpsoft.com>
 */
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 Rewrite 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安全约束,则情况并非如此。

希望这有帮助, 林肯

答案 2 :(得分:0)

请参阅以下问题: http://code.google.com/p/prettyfaces/issues/detail?id=116

希望这会对你有所帮助