如何避免用户访问 JSF 中的 .xhtml 页面?

Posted

技术标签:

【中文标题】如何避免用户访问 JSF 中的 .xhtml 页面?【英文标题】:How to avoid user access to .xhtml page in JSF? 【发布时间】:2011-08-06 05:24:50 【问题描述】:

我是 JSF 新手,首先编写的是 jsf 网络应用程序。

带有 .jsf 的 URL 映射到 WebContent 中的 .xhtml 文件,但为什么我可以在带有所有 jsf 标签的 Web 浏览器中打开 .xhtml。如何保护它?

【问题讨论】:

试着把它们放在WEB-INF下 @ahvargas:这不适用于 JSF。 限制是附加的吗?例如: Restrict raw XHTML DocumentsXHTML*.xhtmlAuth /*Adminconstraint> 不限制原始 xhtml 文件传输给具有的用户 【参考方案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() 
    

【讨论】:

【参考方案2】:

就我的经验而言,mk761203 的答案在为谷歌应用引擎和服务器端设置项目时绝对有帮助。在不排除这些文件的情况下,GAE 会自动将扩展名为 .xhtml 的文件作为静态文件进行解释,这些文件由谷歌服务器场的专用服务器提供服务。在这里阅读更多:https://developers.google.com/appengine/docs/java/config/appconfig#Static_Files_and_Resource_Files

【讨论】:

【参考方案3】:

您可以向您的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>

【讨论】:

【参考方案4】:

在 GAE 上,您需要两件事:

    如上所述编辑 web.xml 添加 appengine-web.xml
<static-files>
    <exclude path="/**.xhtml" />
</static-files>`

【讨论】:

【参考方案5】:

除了定义 &lt;security-constraint&gt; 以阻止 Stacker 在此问题上正确回答的对 .xhtml 文件的直接访问之外,您还可以将 FacesServlet 映射的 &lt;url-pattern&gt;*.jsf 更改为 @987654326 @。

<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>

在 JSF 1.x 中,这曾经以无限循环结束,但在 JSF 2.x 中不再如此。因此,您可以将所有页面调用/链接为.xhtml,而无需摆弄不同的扩展名。唯一的缺点是,如果不调用FacesServlet,您将无法显示“纯”XHTML 文件,但是这样的页面无论如何都应该命名为.html :)

【讨论】:

@s_t_e_v_e:无论如何,GAE 是一头奇怪的野兽。 我不明白,如果您在 *.xhtml 上定义 并将 设置为 *.xhtml 那么如何设置 xhtml 它不会被屏蔽了? @michal777: "除了...",所以你不需要定义both

以上是关于如何避免用户访问 JSF 中的 .xhtml 页面?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSF 中实现登录过滤器?

无法从xhtml文件,Jsf managedBean访问方法

JSF .xhtml 页面中的 Google 地址自动完成功能 - 任何示例? [复制]

JSF 2.0在bean(或页面?)之间传递数据

当用户在 JSF 中注销后单击后退按钮时重定向到登录页面 [重复]

从 xhtml 文件创建 jsf 视图/组件树