私はサーブレット フィルターの問題で立ち往生しており、誰かが私を助けてくれることを望んでいます。私が持っているのは、JBoss 7.1.1 で実行しているサーブレット フィルター (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 には微調整が必要だと思いました。これは次のようになります。
<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-pattern を /HelloWorld/ に変更しました。ただし、これを行うと、フィルター コードに入ることがなく、index.jsp ページが表示されます。
私は解決策が何であるかについて行き詰まっています。
誰かに何かアイデアがあれば、それは素晴らしいことです。FWIW、このコードはすべて Jboss 5 で正常に動作したため、JBoss の問題かどうかはわかりません。