我是JSF和PrettyFaces的新手。所以到目前为止,我发现我可以配置PrettyFaces将请求"转发"到正确的.xhtml文件。问题是,i(或者一个用户,如果他知道我的文件夹结构)也可以请求这个文件。这是我的示例:
文件:webbapp/mypage.xhtml
我在pretty-config.xml中添加了以下行:
<url-mapping id="myPageId">
<pattern value="/prettyurltomypage" />
<view-id value="/mypage.xhtml" />
</url-mapping>
PrettyFaces Filter被配置为拦截"/"。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" />
有其他(更聪明的)方法吗?
可以通过在部署描述符中将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的简短文章。
是的,如果您只是想阻止对直接页面的访问,那么这可能是不使用自定义安全包之类的东西的最佳方法-否则,如果您只是想确保页面正确呈现。实际上,您可以将您的faces servlet映射更改为.xhtml,这意味着当人们访问页面时,您的源代码将不会暴露。
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
如果你想做更复杂的重写规则来真正锁定页面,你可以考虑使用自定义重写处理器并实现processor接口。
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重写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安全约束,则不会出现这种情况。
希望这有帮助,林肯
参见以下问题:http://code.google.com/p/prettyfaces/issues/detail?id=116
希望对你有帮助