JSF 和 PrettyFaces - 如何限制直接 xhtml 请求
Posted
技术标签:
【中文标题】JSF 和 PrettyFaces - 如何限制直接 xhtml 请求【英文标题】:JSF and PrettyFaces - How to restrict direct xhtml requests 【发布时间】:2011-10-18 22:35:43 【问题描述】:我是 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" />
还有其他(更智能的)方法吗?
【问题讨论】:
【参考方案1】:可以通过在部署描述符中将 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。
【讨论】:
@Christian Beikov 如果输入的 URL 与url-pattern
中的表达式匹配,无论您使用什么过滤器,您都将获得 HTTP 403。作为旁注,我在生产环境中为此使用了基于安全约束的解决方案,到目前为止,我无法直接访问 JSF 页面。【参考方案2】:
是的,如果您只是想阻止对直接页面的访问,这可能是最好的方法,而不使用自定义安全包之类的东西 - 否则,如果您只是想确保页面正确呈现。您实际上可以将您的 faces 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 安全约束,则情况并非如此。
希望这会有所帮助, 林肯
【讨论】:
我很高兴 :) 很高兴我能提供帮助!【参考方案3】:请参阅以下问题: http://code.google.com/p/prettyfaces/issues/detail?id=116
希望对你有帮助
【讨论】:
安全约束将不起作用,因为通过 PrettyFaces-Filter 运行的请求将被转发,并且最终对文件的请求总是完成。我知道的唯一解决方案是设置一个拒绝访问的过滤器,但您必须意识到资源请求还将使用为 faces servlet 定义的映射。 @BCsongor 我无法使用此安全约束访问任何内容。 Prettyfaces 当然会将请求转发到 .xhtml 文件,因此必须在某个地方调用文件。以上是关于JSF 和 PrettyFaces - 如何限制直接 xhtml 请求的主要内容,如果未能解决你的问题,请参考以下文章
Primefaces FileUpload 与 PrettyFaces 和 JSF 2.2.3