【问题标题】:Getting User Name from Within HttpSessionListener从 HttpSessionListener 中获取用户名
【发布时间】:2012-10-11 06:12:20
【问题描述】:

我想从HttpSessionListener.sessionCreated() 中获取用户名。当我说用户名时,我是指HttpServletRequest.getRemoteUser() 返回的名称。

显然,一定有一个HttpServletRequest 对象导致会话被创建(因此sessionCreated() 调用)。但是如何从sessionCreated() 中访问它?传递给sessionCreated()HttpSessionEvent 对象似乎无法获取导致创建会话的HttpServletRequest 对象。

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    HttpSessionListener 无权访问 HttpServletRequest 对象,因为它是在没有发出请求时调用的——通知会话销毁或创建。

    因此,过滤器是更好的地方,您可以在其中将 username = request.getRemoteUsr() 添加到会话中。

    示例 - 过滤器代码

    String username = request.getRemoteUsr() ;
    session.setAttribute("username",username);
    

    然后在 sessionCreated 方法中检索此用户名

    String username = (String)session.getAttribute("username");
    

    我希望您将获得在 HttpSessionListener sessionCreated() 方法中创建此会话的同一请求的相同用户名。

    【讨论】:

    • 感谢您的回答,我会尝试您的建议。有一点不清楚,您说在没有发出请求时调用 HttpSessionListener,但我认为必须调用 request.getSession() 才能创建会话,所以那里不是真的必须是创建会话时的请求对象?
    • 我认为这个解决方案行不通,因为在创建会话时会发送sessionCreated 事件,而此时尚未设置属性username
    【解决方案2】:
    // set
    session.setAttribute("username", request.getRemoteUser();
    
    // get
    String un = (String) session.getAttribute("username");
    

    【讨论】:

      【解决方案3】:

      你可以使用HttpSessionAttributeListener:

      public class UsernameHttpSessionAttributeListener implements HttpSessionAttributeListener {
      
          @Override
          public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
              if (httpSessionBindingEvent.getName().equals("username")) {
                  // do something
              }
          }
      
          ...
      }
      

      当然,您需要在 HTTP 会话中的任何地方设置属性 username,例如在 servlet 过滤器中。

      【讨论】:

        猜你喜欢
        • 2011-07-11
        • 2010-10-31
        • 2011-06-05
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        • 2011-02-24
        • 2019-12-30
        • 2021-07-18
        相关资源
        最近更新 更多