【问题标题】:java Filter IllegalStateException or endless loop for fedlet on JBoss 7java 在 JBoss 7 上为 fedlet 过滤 IllegalStateException 或无限循环
【发布时间】: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


    【解决方案1】:

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

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-18
      • 2022-08-15
      • 2016-05-13
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 2015-05-01
      • 2012-10-05
      • 1970-01-01
      相关资源
      最近更新 更多