2

我在Filter/* 的 url 模式上创建了一个监听,它用实现替换HttpServletRequestHttpServletRequestWrapper

我有一个Servlet并且在此Servlet用于h:graphicImage渲染从ApacheWeb 服务器获取的图像。

<h:graphicImage value="/locationInMyWebServer/myImage.jgp"></h:graphicImage>

当我点击访问此页面(包含图像)的 URL 时,图像没有显示为JSESSIONID附加到我的图像名称。正在形成的 URL 如下所示。

http:/myDomain/myServlet/../myImage.jpg;JSESSIONID=ABCDEFGHIJKLMM

因此,我使用了问题开头所述的Filter(有关此过滤器的更多详细信息,请参见此处)。

从这里Servlet有一个用于登录的链接。当用户登录时,JSESSIONID即使经过身份验证,也会保留相同的内容。由于 Session ID 在登录之前和用户登录之后是相同的,这导致了 Session-fixation 攻击。

如何避免使用此过滤器并解决我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()
  {
  }
}

单击将显示哪个登录页面时,我的 Servlet 中有一个链接。代码如下,

<h:commandLink  action="#{myBean.myMethod}">
<h:graphicImage value="/myLocInWebserver/myImage.jpg">
</h:commandLink>

myBean.myMethod,我正在做一些数据库清理活动并重定向到登录页面。

4

1 回答 1

0

另一种方法是避免 servlet 容器将某些内容解释为 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 回答