/*のurl-patternでリスニングを作成しました。これは、を実装Filter
に置き換えます。HttpServletRequest
HttpServletRequestWrapper
私はを持ってServlet
おり、これはWebサーバーからフェッチする画像をレンダリングするためServlet
に使用しています。h:graphicImage
Apache
<h:graphicImage value="/locationInMyWebServer/myImage.jgp"></h:graphicImage>
このページ(画像を含む)にアクセスするためのURLにアクセスするJSESSIONID
と、画像名に追加された画像が表示されませんでした。形成されていたURLは以下のようになりました。
http:/myDomain/myServlet/../myImage.jpg;JSESSIONID=ABCDEFGHIJKLMM
したがって、質問の冒頭で述べたようにFilter
(このフィルターの詳細はこちら)を使用しました。
これからServlet
ログインするためのリンクがあります。ユーザーがログインすると、JSESSIONID
認証後も同じことが保持されます。ログイン前とユーザーログイン後のセッションIDは同じであるため、これがセッション固定攻撃につながります。
JSESSIONID
このフィルターの使用を回避し、使用時に画像に追加される問題を解決するにはどうすればよいですか?h:graphicImage
PS:私の中に<img src>
いるので使用できませんh:graphicImage
h:commandLink
ログイン前とログイン後、これを使用する前のセッションIDが異なっていたFilter
以下に関連するコードを追加しました。
以下のコードはweb.xml
、Filter
<filter>
<filter-name>URLSessionFilter</filter-name>
<filter-class>myPackage.web.filter.URLSessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>URLSessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
私のコードURLSessionFilter
は以下の通りです、
public class URLSessionFilter implements Filter
{
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
if (!(request instanceof HttpServletRequest))
{
chain.doFilter(request, response);
return;
}
HttpServletResponse httpResponse = (HttpServletResponse)response;
HttpServletResponseWrapper wrappedResponse = new HttpServletResponseWrapper(httpResponse)
{
public String encodeRedirectUrl(String url)
{
return url;
}
public String encodeRedirectURL(String url) {
return url; }
public String encodeUrl(String url) {
return url; }
public String encodeURL(String url) {
return url;
}
};
chain.doFilter(request, wrappedResponse);
}
public void init(FilterConfig filterConfig)
{
}
public void destroy()
{
}
}
サーブレットには、クリックするとログインページが表示されるリンクがあります。コードは以下のとおりです、
<h:commandLink action="#{myBean.myMethod}">
<h:graphicImage value="/myLocInWebserver/myImage.jpg">
</h:commandLink>
で、いくつmyBean.myMethod
かのDBクリーンアップアクティビティを実行し、ログインページにリダイレクトしています。