【问题标题】:Generate a new session Id生成新的会话 ID
【发布时间】:2018-07-31 15:32:14
【问题描述】:

如何在不扩展 HttpServlet 类的情况下生成新的会话 ID。是否必须扩展 HttpServlet 类 & 是否必须在 doGet 方法中生成新的会话 ID

public class LoginSupport extends ActionSupport {

    public void prepare() {
        HttpSession session = ServletActionContext.getRequest().getSession();
        session.invalidate();
        //How to genarate new session id
    }
}

【问题讨论】:

  • 再次调用HttpServletRequest#getSession() 应该重新创建会话并生成新 ID

标签: servlets session-fixation


【解决方案1】:

调用HttpSession#invalidate()后,可以调用HttpServletRequest#getSession()创建新的会话。

例如

public void prepare() {
    final HttpServletRequest request = ServletActionContext.getRequest();
    request.getSession().invalidate();

    // generate new session (and id)
    final HttpSession newSession = request.getSession();
}

来自服务器的下一个 HTTP 响应应该包含一个新的会话 ID,例如

Set-Cookie: JSESSIONID=6a303082951311647336934;path=/

来自https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServletRequest.html#getSession--

getSession

HttpSession getSession()

返回与此请求关联的当前会话,或者如果请求没有会话,则创建一个

【讨论】:

  • 它不起作用,你能告诉我我应该在准备方法中放什么吗?
  • 从字面上看我的回答。
  • 我用prepare方法把你的代码放在我的代码之后,但是它不起作用&为什么我们要销毁一个会话ID两次??
  • 可能和我很久以前的这个问题有关~stackoverflow.com/questions/6824724/…。在我对此的研究中,我发现 JBoss 表现出这种行为
  • @Mapa 可能会为那个打开另一个问题。我从没用过 JBoss
【解决方案2】:

在 Servlet 3.1 或更高版本 (Java EE 7) 上,只需使用 HttpServletRequest#changeSessionId()

request.changeSessionId();

它不会使会话无效,而只是更改 JSESSIONID cookie 的值。

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 2012-08-12
    • 2015-04-03
    • 2017-03-27
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    相关资源
    最近更新 更多