FacesServlet URL模式

时间:2014-03-16 08:23:14

标签: java jsf java-ee-7

我不确定我在这里做错了什么,但当我在网址中将两次面孔上下文绕过我的所有Realm证券时。

我的网址格式:

<servlet-mapping>
    <servlet-name>Faces</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>

安全约束

<security-constraint>
    <display-name>ADMIN</display-name>
    <web-resource-collection>
        <web-resource-name>Protected Admin Area</web-resource-name>
        <description/>
        <url-pattern>/faces/admin/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>ADMIN</role-name>
    </auth-constraint>
    <user-data-constraint>
        <description/>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>

所以当我转到:http://domain.com/faces/admin/index.xthml我确实得到了正在寻找的正确答案。

但是如果我转到:http://domain.com/faces/faces/admin/index.xhtml它完全让我进入,不管servlet是否在/ admin *我假设在管理员结束时*是导致它的原因。但是,我如何解决这个问题,使domain.com/faces/faces无效,只有domain.com/faces有效?

我似乎无法找到任何其他人面对这个问题。所以我一定是做错了。

谢谢

1 个答案:

答案 0 :(得分:1)

首先,好消息:你没有做错任何事。

要解决:使用FacesServlet

上的扩展程序映射变体
<servlet-mapping>
   <servlet-name>Faces</servlet-name>
   <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

坏消息:这可能是请求匹配模型中的一个疏忽(读取:缺陷)。

我的假设是FacesServlet的URL匹配模型不能很好地与标准的servlet容器请求匹配模型配合使用。


在理想情况下(没有JSF), /faces/faces/admin/index.xhtml 必须与servlet或特定资源相对应。容器将尝试验证它是否是有效资源,然后验证资源是否是受约束的资源。

这里的问题是容器在字面上采用资源约束非常,这意味着它在安全表中查找与该URL最接近的文字匹配。如果它没有将资源解析为受限制,则它会在不干扰的情况下为资源提供服务。

  • 当您将 / faces / admin / *定义为受保护资源时,请求 /faces/faces/admin/admin.xhtml 然后还要一个 / faces / * servlet映射,容器尝试验证 /faces/faces/admin/index.xhtml 是一个受约束的资源(并且它不是)。由于容器没有理由进一步提出请求,因此将请求移至FacesServlet,然后FacesServlet似乎只是盲目地删除了对 faces 的所有引用requestURL(因为你已经对 / faces / *说好了)并提供任何剩下的东西。

  • 这就是文件扩展名servlet定义似乎不受其影响的原因; 在文件扩展名映射的情况下,即使在容器确定之前,FacesServlet 必须在您的文件夹结构中找到与该网址相对应的文字资源资源是否受约束

验证这一理论,可能需要向mojarra团队提交关键的JIRA。