【发布时间】:2013-02-20 10:14:13
【问题描述】:
我遇到了一个 servlet 过滤器问题,希望有人能帮助我。 我拥有的是我在 JBoss 7.1.1 上运行的 servlet 过滤器(它是一个 SSO Fedlet)
这是一个简单的“Hello World”应用程序,我只是想在点击包含“Hello World”的 index.jsp 之前测试它以使 SSO 正常工作。
在我的 doFilter 方法中,我进入了一个 handleSSO 调用,然后在返回时,它调用了 chain.doFilter(req,res);
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
handleSSO(request, response); //logs in user etc..
chain.doFilter(req, res);
}
private void handleSSO(HttpServletRequest request, HttpServletResponse response) {
//login code here where the initiateAuthnRequest occurs for the IdP
//if successful then do this:
response.sendRedirect(getRedirectURL(request)); //this is /HelloWorld/
}
所以发生的事情是在调用 sendRedirect 之后,它返回到 doFilter 并调用 chain.doFilter。
然后我得到一个 IllegalStateException。
闲逛我读到你不能同时执行 sendRedirect 和 chain.doFilter。
因此,我在 chain.doFilter 周围放置了一些逻辑,并且仅在未发生重定向时才调用它。
但是,当这种情况发生时,我会在 doFilter 中得到一个无限循环。好像是在一遍遍地重新认证……
然后我认为我的 web.xml 需要 tweeking。这是它的样子:
<filter>
<filter-name>SamlFilter</filter-name>
<filter-class>com.gsk.servlet.filters.SAMLFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SamlFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
所以我的想法是,因为 url 模式是 /* 它会继续尝试进行身份验证。 为了测试这一点,我将 url 模式更改为 /HelloWorld/。 但是,当我这样做时,我永远不会进入过滤器代码并且 index.jsp 页面会显示。
我不知道解决方案可能是什么。
如果有人有任何想法,那就太好了。
FWIW,所有这些代码在 Jboss 5 上运行良好,所以我不知道这是否是 JBoss 问题。
【问题讨论】:
标签: jboss7.x single-sign-on servlet-filters illegalstateexception