2

/*の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.xmlFilter

<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クリーンアップアクティビティを実行し、ログインページにリダイレクトしています。

4

1 に答える 1

0

もう 1 つの方法は、サーブレット コンテナーが何かを URL として解釈しないようにすることです。これを実現するには、特別な JSP または JSF タグを使用せず、HTML タグを直接使用します。あなたの場合、次のようになります。

<h:commandLink  action="#{myBean.myMethod}">
  <img src="#{request.contextPath}/myLocInWebserver/myImage.jpg"/>
</h:commandLink>

もう<h:graphicImage>...

ハードコーディングせずにコンテキストパスにプレフィックスを付ける必要があるため、#{request.contextPath}.

JavaMelody を自分のアプリケーションに統合していたので、最近このソリューションにたどり着き、管理者にツールへのリンクを提供しました。ただし、どういうわけかJavaMelodyは;jsessionid追加で失敗します。したがって、現在、次のように URL を生成しています。

<a href="#{request.contextPath}/monitoring" 
   target="_blank" 
   class="ui-link ui-widget"
>
  Java Melody Performance Monitoring
</a>

典型的な JSF ソリューションの代わりに

<p:link value="Java Melody Performance Monitoring" 
        href="/monitoring" 
        target="_blank" 
/>

これは単に機能しません。

このソリューションの利点は、これを URL ごとに制御できるようになったことです<tracking-mode>COOKIE</tracking-mode>。グローバルな設定について心配する必要はありません。

于 2017-09-20T23:30:44.987 に答える