Spring 从URL中删除jsessionid

Spring 从URL中删除jsessionid,spring,tomcat6,shiro,prettyfaces,Spring,Tomcat6,Shiro,Prettyfaces,我正在使用以下技术进行一个项目: 弹簧 雪洛菲特 漂亮的面孔 Tomcat服务器 当我在tomcat服务器上部署它时,我在URL的末尾添加了一个“jsessionid456jghd787aa” 我试图解决这个问题,但我无法解决。对于tomcat 7,请将此添加到web.xml <session-config> <!-- Disables URL-based sessions (no more 'jsessionid' in the URL using Tomcat) -

我正在使用以下技术进行一个项目:

  • 弹簧
  • 雪洛菲特
  • 漂亮的面孔
  • Tomcat服务器
当我在tomcat服务器上部署它时,我在URL的末尾添加了一个
“jsessionid456jghd787aa”


我试图解决这个问题,但我无法解决。

对于tomcat 7,请将此添加到web.xml

<session-config>
  <!-- Disables URL-based sessions (no more 'jsessionid' in the URL using Tomcat) -->
  <tracking-mode>COOKIE</tracking-mode>
</session-config>

曲奇

以下过滤器可能会解决您的问题(从)

package com.companyname.projectname.web.filter;
导入java.io.IOException;
导入javax.servlet.Filter;
导入javax.servlet.FilterChain;
导入javax.servlet.FilterConfig;
导入javax.servlet.ServletException;
导入javax.servlet.ServletRequest;
导入javax.servlet.ServletResponse;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入javax.servlet.http.HttpServletResponseWrapper;
导入javax.servlet.http.HttpSession;
/**
*禁用URL编码的会话标识符的Servlet筛选器。
* 
* 
*版权所有(c)2006,克雷格·康迪特。版权所有。
* 
*以源代码和二进制形式重新分发和使用,带或不带
*如果满足以下条件,则允许进行修改:
* 
**源代码的重新分发必须保留上述版权声明,
*此条件列表和以下免责声明。
**二进制形式的重新分发必须复制上述版权声明,
*此条件列表和文档中的以下免责声明
*和/或分发时提供的其他材料。
*     
*本软件由版权所有者和贡献者“按原样”提供
*以及任何明示或暗示的保证,包括但不限于
*对适销性和特定用途适用性的默示保证
*拒绝承认。在任何情况下,版权所有人或贡献者均不得
*对任何直接、间接、附带、特殊、示范或
*间接损害(包括但不限于采购
*替代商品或服务;使用、数据或利润的损失;或业务
*中断)无论是何种原因造成的,且基于任何责任理论,无论是在
*合同、严格责任或侵权行为(包括疏忽或其他)
*因使用本软件而产生的任何后果,即使
*这种损害的可能性。
* 
*/
公共类DisableUrlSessionFilter实现筛选器{
/*私有静态日志记录器=LogFactory.getLog(DisableUrlSessionFilter.class);
*/
/**
*筛选请求以禁用基于URL的会话标识符。
*/
public void doFilter(ServletRequest请求、ServletResponse响应、,
FilterChain链)抛出IOException、ServletException{
//跳过非http请求
if(!(HttpServletRequest的请求实例)){
链式过滤器(请求、响应);
返回;
}
HttpServletRequest httpRequest=(HttpServletRequest)请求;
HttpServletResponse=(HttpServletResponse)响应;
//如果URL中有会话id,则清除会话
if(httpRequest.isRequestedSessionIdFromURL()){
HttpSession session=httpRequest.getSession();
if(会话!=null){
session.invalidate();
}
}
//包装响应以删除URL编码
HttpServletResponseWrappedResponse=新的HttpServletResponseWrapper(
httpResponse){
@凌驾
公共字符串url(字符串url){
返回url;
}
@凌驾
公共字符串url(字符串url){
返回url;
}
@凌驾
公共字符串编码url(字符串url){
返回url;
}
@凌驾
公共字符串编码url(字符串url){
返回url;
}
};
//处理链中的下一个请求
chain.doFilter(请求、包装响应);
}
/**
*未使用的。
*/
public void init(FilterConfig config)抛出ServletException{
}
/**
*未使用的。
*/
公共空间销毁(){
}
}

如果您没有使用Servlet 3.0,也可以使用PrettyFaces重写规则来实现这一点:

  • Tomcat 6,在context.xml中添加disableURLRewriting=“true”

  • Tomcat7和ServletFilter已经讨论过了

  • 或以编程方式:


servletContext.setSessionTrackingModes(EnumSet.of(SessionTrackingMode.COOKIE))

您可以将该设置添加到http标记中,如下所示:

<rule>
    <note>Remove jsessionid from embedded urls - for urls WITH query parameters</note>
    <from>^/(.*);JSESSIONID=.*[?](.*)$</from>
    <to type="redirect">/$1?$2</to>
</rule>

<rule>
    <note>Remove jsessionid from embedded urls - for urls WITHOUT query parameters</note>
    <from>^/(.*);JSESSIONID=.*[^?]$</from>
    <to type="redirect">/$1</to>
</rule>

正如其他人所建议的那样,您可能希望将其从Tomcat中删除,但如果您还没有cookie集,Shiro将其添加到重定向的末尾仍然会有问题。关于这个问题,有两张公开票:

我试图让Tuckey的URL重新写入工作,并在一段时间后取得了部分成功。问题是Shiro没有调用response.encodeURL(),因此导致出站规则跳闸。我能够使用以下两个规则重定向入站请求以删除会话id:

Set<SessionTrackingMode> trackingModes = new HashSet<>();
trackingModes.add(SessionTrackingMode.COOKIE);
context.getSessionHandler().getSessionManager().setSessionTrackingModes(trackingModes);

从嵌入的URL中删除jsessionid-对于具有查询参数的URL
^/(.*);JSESSIONID=.*[?](.*)的值$
/$1?$2
从嵌入的URL中删除jsessionid-用于不带查询参数的URL
^/(.*);JSESSIONID=.[^?]$
/$1
这至少使它不会显示在浏览器中,但并不能完全解决问题,因为会话ID是通过URL发送的,而会话ID被重定向到没有它的位置。如果它再也不出现就更好了

更新:

SHIRO-360和SHIRO-361已经修复,修复程序在SHIRO 1.3.0中。根据Brian Demers在SHIRO-361中的描述:

设置sessionManager.SessionDurlReWritingEnabled=fals
<rule>
    <note>Remove jsessionid from embedded urls - for urls WITH query parameters</note>
    <from>^/(.*);JSESSIONID=.*[?](.*)$</from>
    <to type="redirect">/$1?$2</to>
</rule>

<rule>
    <note>Remove jsessionid from embedded urls - for urls WITHOUT query parameters</note>
    <from>^/(.*);JSESSIONID=.*[^?]$</from>
    <to type="redirect">/$1</to>
</rule>
Set<SessionTrackingMode> trackingModes = new HashSet<>();
trackingModes.add(SessionTrackingMode.COOKIE);
context.getSessionHandler().getSessionManager().setSessionTrackingModes(trackingModes);