/*のurl-patternでリスニングを作成しました。これは、を実装Filterに置き換えます。HttpServletRequestHttpServletRequestWrapper
私はを持ってServletおり、これはWebサーバーからフェッチする画像をレンダリングするためServletに使用しています。h:graphicImageApache
<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:graphicImageh: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クリーンアップアクティビティを実行し、ログインページにリダイレクトしています。