FacesServlet URL模式

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

我的url格式:

 Faces /faces/*  

安全约束

  ADMIN  Protected Admin Area  /faces/admin/*    ADMIN    NONE   

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

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

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

谢谢

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

要解决 :在FacesServlet上使用扩展映射变体

  Faces *.xhtml  

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

我的假设是FacesServlet的URL匹配模型与标准的servlet容器请求匹配模型不兼容。


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

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

  • 当您将/ faces / admin / *定义为受保护资源时,请求/faces/faces/admin/admin.xhtml然后还有/ faces / * servlet映射,容器会尝试validation/ faces / faces / admin /index.xhtml是一种受约束的资源(事实并非如此)。 由于容器没有理由进一步提出请求,它将请求交给FacesServlet ,然后FacesServlet似乎只是盲目地剥离requestURL中所有对faces的引用(因为你已经说好了/ faces / *)和服务于任何剩下的东西。

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

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