1

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

4

1 回答 1

0

您应该重定向或调用过滤器链:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    if(needsRedirect(request)){
        handleSSO(request, response); //logs in user etc..
    }else{
        chain.doFilter(req, res);
    }
}
于 2018-07-05T06:56:43.143 回答