我是JSF的新手,只是简单地编写jsf web app。
带有.jsf的URL映射到WebContent中的.xhtml文件,但为什么我可以在Web浏览器中使用所有jsf标记打开.xhtml。如何保护这个?
答案 0 :(得分:18)
您可以向web.xml
添加安全约束,阻止对*.xhtml
的所有请求。
<security-constraint>
<display-name>Restrict raw XHTML Documents</display-name>
<web-resource-collection>
<web-resource-name>XHTML</web-resource-name>
<url-pattern>*.xhtml</url-pattern>
</web-resource-collection>
<auth-constraint />
</security-constraint>
答案 1 :(得分:10)
除了定义<security-constraint>
以阻止Stacker在此问题上正确回答的.xhtml
文件的直接访问权限之外,您还可以更改<url-pattern>
的{{1}}从FacesServlet
到*.jsf
的映射。
*.xhtml
在JSF 1.x中,这常常以无限循环结束,但在JSF 2.x中不再存在。因此,您可以将所有页面调用/链接为<servlet>
<servlet-name>facesServlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>facesServlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
,而无需摆弄不同的扩展程序。唯一的缺点是,如果不调用.xhtml
,您将无法显示“普通”XHTML文件,但无论如何这样的页面应该被命名为FacesServlet
:)
答案 2 :(得分:2)
在GAE上你需要两件事:
<static-files>
<exclude path="/**.xhtml" />
</static-files>`
答案 3 :(得分:1)
您可以使用servlet过滤器
@WebFilter(filterName = "XhtmlFilter", urlPatterns = { "*.xhtml" })
public class XhtmlFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
((HttpServletResponse) response).sendError(404);
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
答案 4 :(得分:0)
据我所知,在为谷歌应用引擎和服务器面孔设置项目时,mk761203的答案绝对有用。在不排除这些文件的情况下,GAE会自动将文件与.xhtml扩展名作为静态文件进行插入,这些文件由googles服务器场的专用服务器提供服务。在此处阅读更多内容:https://developers.google.com/appengine/docs/java/config/appconfig#Static_Files_and_Resource_Files