1

当使用 PrettyFaces/Rewrite 重写 JSF 应用程序中的 URL 并使用 PicketLink 保护它时,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>

用户将被重定向到/common/login.xhtml而不是/login.

我知道我可以/login在 PicketLink 中用作 loginPage,但是直到现在,我已经能够以完全透明的方式为我的应用程序使用 PrettyFaces/Rewrite(我可以删除它,一切仍然可以工作......但是 URL 很丑陋)。

我注意到SecurityFilter来自 PicketLink 的似乎出现在RewriteFilter来自 PrettyFaces/Rewrite 之前:

    at org.ocpsoft.rewrite.servlet.impl.HttpRewriteResultHandler.handleResult(HttpRewriteResultHandler.java:41)
    at org.ocpsoft.rewrite.servlet.RewriteFilter.rewrite(RewriteFilter.java:268)
    at org.ocpsoft.rewrite.servlet.RewriteFilter.doFilter(RewriteFilter.java:188)
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
    at org.picketlink.http.internal.SecurityFilter.processRequest(SecurityFilter.java:346)
    at org.picketlink.http.internal.SecurityFilter.performOutboundProcessing(SecurityFilter.java:237)
    at org.picketlink.http.internal.SecurityFilter.doFilter(SecurityFilter.java:196)

因此,如果 PrettyFaces 以HttpServletResponse某种方式包装 以覆盖encodeRedirectUrl()SecurityFilter则不会像以前那样看到这个包装的响应。

有没有办法让RewriteFilter先到先得 SecurityFilter

我没有在我的部署描述符中声明这些过滤器,它们是通过一个web-fragment.xmlfor PrettyFaces 和一个@WebListenerfor PicketLink 自动注册的。

4

1 回答 1

1

您可以尝试在absolute-orderingweb.xml 中添加一个元素来控制排序。就像是:

<web-app> 
    ... 
    <absolute-ordering> 
        <name>com_ocpsoft_rewrite</name> 
        <others/> 
    <absolute-ordering> 
    ...
</web-app>
于 2016-07-25T16:33:50.263 回答