Url rewriting 将漂亮的脸和PicketLink结合起来

Url rewriting 将漂亮的脸和PicketLink结合起来,url-rewriting,servlet-filters,prettyfaces,picketlink,Url Rewriting,Servlet Filters,Prettyfaces,Picketlink,在JSF应用程序中使用PrettyFaces/Rewrite重写URL并使用PicketLink保护URL时,PicketLink似乎没有使用重写规则 例如,如果我使用以下内容配置PicketLink: builder .http() .allPaths() .authenticateWith() .form() .loginPage("/common/login.xhtml"

在JSF应用程序中使用PrettyFaces/Rewrite重写URL并使用PicketLink保护URL时,PicketLink似乎没有使用重写规则

例如,如果我使用以下内容配置PicketLink:

builder
    .http()
        .allPaths()
            .authenticateWith()
                .form()
                    .loginPage("/common/login.xhtml")
<url-mapping id="login">
    <pattern value="/login" />
    <view-id value="/common/login.xhtml" />
</url-mapping>
有这样一个重写规则:

builder
    .http()
        .allPaths()
            .authenticateWith()
                .form()
                    .loginPage("/common/login.xhtml")
<url-mapping id="login">
    <pattern value="/login" />
    <view-id value="/common/login.xhtml" />
</url-mapping>
因此,如果PrettyFaces正在以某种方式包装
HttpServletResponse
以覆盖
encodeRedirectUrl()
,那么
SecurityFilter
将不会像以前一样看到此包装的响应

有没有办法使
重写过滤器
位于
安全过滤器
之前


我没有在部署描述符中声明这些过滤器,它们是通过
web fragment.xml
为PrettyFaces自动注册的,通过
@WebListener
为PicketLink自动注册的。

您可以尝试向web.xml添加
绝对排序
元素来控制排序。比如:

<web-app> 
    ... 
    <absolute-ordering> 
        <name>com_ocpsoft_rewrite</name> 
        <others/> 
    <absolute-ordering> 
    ...
</web-app>

... 
com_ocpsoft_重写
...

正确!使用绝对顺序修复此问题。这不起作用:
SecurityFilter
仍然位于
RewriteFilter
之前。我认为这来自于两个框架如何注册各自的过滤器:PicketLink从其
PicketLink ServletContextListener
注册其过滤器,而Rewrite则在
web fragment.xml
中注册。我认为首先处理所有的
ServletContextListener
s(因此PicketLink注册其过滤器),然后添加来自DDs的所有其他过滤器(重写)。因此,在这里,订购没有效果。我已经设置了两个过滤器的断点,
SecurityFilter
RewriteFilter
之前被初始化/链接。一个可能的解决方案是Rewrite从自己的
RewriteServletContextListener
注册它的过滤器。我通过在
web.xml
中声明这两个过滤器,以正确的顺序获得了过滤器或者在自定义的
web fragment.xml
中,它的绝对顺序为#1。不幸的是,这并不能解决我的问题:当PicketLink重定向到登录页面时,url没有被重写,因此这可能是PicketLink中的问题(不使用
encodeRedirectURL()
?)。问题可能来自
org.PicketLink.http.internal.authentication.schemes.FormAuthenticationScheme.forwardToLoginPage()
,在重定向之前不会对URL进行编码。