我正在尝试配置 CQ5.5 SSO 并使用 @SlingFilter 设置 HTTP 标头值。
看起来存在执行时间问题,其中 SlingFilter 在 SSO 身份验证处理程序之后处理请求,因此无法在 Http 标头中找到经过验证的用户。
您可以在过滤器上设置服务排名以控制执行顺序。
@Properties({ @Property(name = Constants.SERVICE_DESCRIPTION, value = "Description"),
@Property(name = Constants.SERVICE_VENDOR, value = "Vendor"),
@Property(name = Constants.SERVICE_RANKING, intValue = -760, propertyPrivate = true),
@Property(name = "filter.scope", value = "request", propertyPrivate = true)
})
您可以通过查看组件的属性来查看现有过滤器的服务排名,例如
http://localhost:4502/system/console/components/org.apache.sling.i18n.impl.I18NFilter
似乎如果组件具有相同的服务排名,那么它们的 service.id 将用于确定它们的顺序。
您可以通过查看最近的请求来查看文件管理器的处理顺序
http://localhost:4502/system/console/requests
并选择您提出的要求。你会看到类似的东西:
0 (2013-04-04 15:12:56) LOG Calling filter: org.apache.sling.bgservlets.impl.BackgroundServletStarterFilter
0 (2013-04-04 15:12:56) LOG Calling filter: org.apache.sling.i18n.impl.I18NFilter
0 (2013-04-04 15:12:56) LOG Calling filter: org.apache.sling.rewriter.impl.RewriterFilter
0 (2013-04-04 15:12:56) LOG Calling filter: com.day.cq.wcm.core.impl.WCMRequestFilter
0 (2013-04-04 15:12:56) LOG Calling filter: com.day.cq.wcm.foundation.forms.impl.FormsHandlingServlet
2 (2013-04-04 15:12:56) LOG Calling filter: org.apache.sling.engine.impl.debug.RequestProgressTrackerLogFilter
2 (2013-04-04 15:12:56) LOG Calling filter: com.day.cq.wcm.mobile.core.impl.redirect.RedirectFilter
一些较旧的过滤器将使用该filter.order
属性。这仅在未找到 service.ranking 属性时使用。见吊索 1735。
这是通过使用标准 HTTP 过滤器解决的,而不是使用白板支持的 Sling 过滤器 - Apache Http 服务白板。在用户通过身份验证后调用 Sling 过滤器,为了使我的逻辑正常工作,我需要在请求到达 Sling 身份验证层之前拦截请求。所以我需要将它们注册为 std Servlet Filter
@Component
@Service
@org.apache.felix.scr.annotations.Properties({
@Property(name = "pattern", value = "/.*"),
@Property(name = Constants.SERVICE_RANKING, intValue = 100000, propertyPrivate = false),
@Property(name = "_usernameHeader", value = "SM_USER")
})
public class TestFilter implements javax.servlet.Filter {