Tomcat 如何防止spring安全性附加;jsessionid=XXX登录重定向?

Tomcat 如何防止spring安全性附加;jsessionid=XXX登录重定向?,tomcat,servlets,spring-security,jetty,Tomcat,Servlets,Spring Security,Jetty,当未经身份验证的客户端请求一个需要非匿名访问级别(如security config.xml中定义)的URL时,spring security会向我们的登录页面发送一个HTTP重定向(例如/login)。那很好 问题在于,在缺少现有会话(由客户端请求中提供的cookie标识)的情况下,spring security会发出一个重定向,该重定向也会在URL中指定客户端的新会话,例如/login;jsessionid=8o7pglapojus 许多容器都支持这一点(显然它在tomcat中工作得很好?),

当未经身份验证的客户端请求一个需要非匿名访问级别(如
security config.xml
中定义)的URL时,spring security会向我们的登录页面发送一个HTTP重定向(例如
/login
)。那很好

问题在于,在缺少现有会话(由客户端请求中提供的cookie标识)的情况下,spring security会发出一个重定向,该重定向也会在URL中指定客户端的新会话,例如
/login;jsessionid=8o7pglapojus

许多容器都支持这一点(显然它在tomcat中工作得很好?),但Jetty(我们现在正在使用的)似乎不支持——重定向的URL完全完整地通过我们的URL路由器(包括
jsessionid
“参数”),并且命名会话与jetty/spring security的
/login
请求不关联(即,在响应
/login
请求的Set-Cookie头中提供了一个全新的会话ID)


我们可以通过在路由中匹配
/login.*
来解决这个问题,但我很好奇是否有任何方法可以防止身份验证重定向中的会话id的释放。

在Spring Security 3.0.0 M1或更高版本中,您可以在
名称空间中设置
禁用url rewriting=“true”
。看看这是否有帮助。也可以看到这一点。

另一个解决方案在这里(对于那些Spring安全性的人,例如我自己)


创建一个Servlet过滤器包装并管理它。

现在看起来是这样的

<security:http auto-config="false" use-expressions="true" disable-url-rewriting="true">

在此之后,您的应用程序将无法正确执行有状态作业。

@ahmet alp balkan:

seamframework提供了比随机编码器更好的解决方案。

@巴卢斯克:

如果开发人员使用SpringSecurity的FilterChainProxy来实现安全功能,只是不使用http名称空间


然后,我们无法找到添加禁用url重写的方法,而不尝试向筛选器链添加自定义筛选器,或向web.xml插入独立筛选器

由于您正在使用jetty,只需在web.xml中添加以下context param标记

<!-- Disables appending JSESSSIONID in browser address bar/requests -->
<context-param>
    <param-name>org.eclipse.jetty.servlet.SessionIdPathParameterName</param-name>
    <param-value>none</param-value>
</context-param>

org.eclipse.jetty.servlet.sessiondPathParameterName
没有一个

请参阅:

以下是我如何解决此问题的

场景是,我有几个会话较少且security=“none”的页面,在重新直接提交帖子时,重定向url用于附加;Jsessionid=在url中-当然会导致错误

此外,我无法添加禁用url重写=“true”也无法工作

如果在表格提交中提交代码,对我有什么作用

HttpSession session = request.getSession();
if (session != null) session.invalidate();
这确保了没有活动会话——这确保了spring on redirect post提交不需要携带会话信息,因此不需要向url添加JSESSION


这当然需要我的具体案例。。并且不能用作整个应用程序的通用解决方案。如果这对你有帮助,请告诉我

我已经为特定用例添加了一个答案-这里有多种解决方法(总结我的发现历程和实验)

  • @总体级别-确保没有url重写级别
  • 无需携带会话信息>无附加JSESSIONID
    
    HttpSession session=request.getSession();if(会话!=null)
    session.invalidate()

    这些解决方案特定于spring安全性。还有其他解决方案可以在Tomcat级别完成

  • 将会话跟踪更改为COOKIE,会话信息已与浏览器COOKIE一起使用>无需在url中传递信息>无需附加JSESSIONID [在不允许使用cookie的情况下不起作用,我面临着Safari/Opera浏览器+Chrome浏览器的问题,该浏览器具有严格的第三方cookie设置]
  • 
    COOKIE

  • 在web服务器级别禁用URL重写
  • 在WEB-INF/WEB.xml
    disableURLRewriting=“true”


    希望这对你有帮助

    @BalusC是否有任何已知的spring 3之前的解决方案?@Xorty请看一看,如果升级到spring Security 3+不是一个选项。您的意思是,如果客户端不允许Cookie,那么应用程序将无法执行有状态的作业?