我在Filter
/* 的 url 模式上创建了一个监听,它用实现替换HttpServletRequest
了HttpServletRequestWrapper
。
我有一个Servlet
并且在此Servlet
用于h:graphicImage
渲染从Apache
Web 服务器获取的图像。
<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
,我正在做一些数据库清理活动并重定向到登录页面。