我创建了一个监听/* 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:graphicImage
时JSESSIONID
附加到图像的问题
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>
。