HttpServletRequest を引数に与えられていないコンポーネントの内部でHttpServletRequest を呼び出す方法です。
以下のようなThreadLocalを利用したクラスを用意します。
public class HttpServletRequestLocator { private static ThreadLocal<HttpServletRequest> httpServletRequests = new ThreadLocal<HttpServletRequest>(); public static HttpServletRequest get() { return httpServletRequests.get(); } public static void set(HttpServletRequest httpServletRequest) { httpServletRequests.set(httpServletRequest); } private HttpServletRequestLocator() { } }
ServletFilter は以下のようにします。
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest prevHttpServletRequest = HttpServletRequestLocator.get(); try { HttpServletRequestLocator.set((HttpServletRequest) request); filterChain.doFilter(request, response); } finally { HttpServletRequestLocator.set(prevHttpServletRequest); } }
これでこのフィルターが通ったコンポーネントでは、いつでもHttpServletRequestを呼び出せるようになります。
HttpServletRequest httpServletRequest = HttpServletRequestLocator.get();