当用户进行身份验证时,重置会话cookie被认为是一种很好的安全做法。
如何用Java做到这一点?
到目前为止我的尝试是成功的,但我想知道是否有更好的方法:
public static HttpSession resetSessionId(HttpSession session,
HttpServletRequest request) {
session.invalidate();
session = request.getSession(true);
return session;
}
答案 0 :(得分:3)
我只传递了获取会话的请求。如果会话尚不存在,那么创建一个会话就没有意义使其无效。如果会话刚刚由容器创建(由于用户首次直接在登录表单上发出http请求),这也成立。
public static ... (HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session!=null && !session.isNew()) {
session.invalidate();
}
答案 1 :(得分:2)
你的答案似乎是最佳的。另一种方法是以这种方式直接操纵厨师:
Cookie cookie = new Cookie ("JSESSIONID", "randomValue");
cookie.setMaxAge( 0 );
所以你创建一个具有相同名称的新cookie并立即过期,但我不建议这样做,因为对于熟悉基本Servlet API的人来说,你的内容更清晰,更明显
答案 2 :(得分:2)
Tomcat(自6.0.24 AFAIK起)可以自动更改身份验证的sessionId - 只要您使用标准的servlet身份验证机制(基本的,基于表单的身份验证)。这可以通过基本身份验证器阀的changeSessionIdOnAuthentication进行配置:http://tomcat.apache.org/tomcat-6.0-doc/config/valve.html
答案 3 :(得分:1)
另一种方式(不是更好的方法)是调用org.apache.catalina.session.StandardManager
的'changeSessionId(existingSession)',它将当前会话的会话ID更改为新的随机生成的会话ID。
您必须使用StandardManager Mbean来调用该方法。请参阅Tomcat MBeans
伪代码:
ObjectName contextObjectName = new ObjectName(“Catalina:type = Manager,path = / whatever,host = whateverhost”);
mbeanServer.invoke(contextObjectName,“changeSessionId”,new Object [] {session},new String [] {“javax.servlet.http.HttpSession”});