【问题标题】:How to avoid user access to .xhtml page in JSF?如何避免用户访问 JSF 中的 .xhtml 页面?
【发布时间】: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 文件传输给具有的用户

标签: java jsf jsf-2


【解决方案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 上,您需要两件事:

        1. 如上所述编辑 web.xml
        2. 添加 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
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-28
          • 2014-06-21
          • 2021-11-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多