我被困在一个 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 问题。