在不使用过滤器和包装器的情况下删除 URL 中的 JSESSIONID



我创建了一个监听/* url 模式的Filter,该模式用HttpServletRequestWrapper实现替换了HttpServletRequest

我有一个Servlet,在这个Servlet使用h:graphicImage来渲染从 Web 服务器获取的图像Apache

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

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

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

因此,我使用了Filter(有关此过滤器的更多详细信息在这里),如我的问题开头所述。

从这个Servlet有一个登录链接。当用户登录时,即使在身份验证后也会保留相同的JSESSIONID。由于会话 ID 在登录之前和用户登录后相同,这会导致会话固定攻击。

我怎样才能避免使用此过滤器,并解决我在使用h:graphicImageJSESSIONID附加到图像的问题

PS:我不能使用<img src>,因为我的h:graphicImage在里面h:commandLink

在使用此Filter之前,会话 ID 在登录之前和登录后是不同的

我在下面添加了相关代码。

下面的代码来自我的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,正在做一些数据库清理活动并重定向到登录页面。

另一种方法是避免 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>

相关内容

最新更新