アプリケーションに2つのフィルターがあります。ある条件に基づいて、2番目のフィルターを実行するかどうかを選択したいと思います。これを行う方法はありますか?
私はグーグルをしましたが成功しませんでした。 2番目のフィルターを実行せずにリクエストを続行したい。それは可能ですか?
どんな助けでもありがたいです。
リクエストに属性を設定し、2番目のフィルターで確認できます。
public class FirstFilter implements Filter {
//...
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setAttribute("executeSecondFilter", true);
//...
if(someReason)
servletRequest.setAttribute("executeSecondFilter", false);
filterChain.doFilter(servletRequest, servletResponse);
}
}
public class SecondFilter implements Filter {
//..
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if (servletRequest.getAttribute("executeSecondFilter") == null || !((Boolean) servletRequest.getAttribute("executeSecondFilter"))) {
filterChain.doFilter(servletRequest, servletResponse);
}
//...
}
}
上記のコードは次のように簡略化できます。
public class FirstFilter implements Filter {
//...
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//...
if(someReason)
servletRequest.setAttribute("executeSecondFilter", false);
filterChain.doFilter(servletRequest, servletResponse);
}
}
public class SecondFilter implements Filter {
//..
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
if (servletRequest.getAttribute("executeSecondFilter") != null) {
filterChain.doFilter(servletRequest, servletResponse);
}
//...
}
}
このようにして、属性「executeSecondFilter」の存在を確認するだけです。
Colinの答えに加えて、別の方法があります。 FilterChain#doFilter()
を呼び出さずに、 RequestDispatcher#forward()
を呼び出します。
if (condition) {
request.getRequestDispatcher(((HttpServletRequest) request).getServletPath()).forward(request, response);
} else {
chain.doFilter(request, response);
}
ただし、これはallフィルターを現在からスキップし、<dispatcher>FORWARD</dispatcher>
でリッスンしているフィルターを想定します。