【问题标题】:Struts 2 Session in interceptor拦截器中的 Struts 2 Session
【发布时间】:2011-10-25 19:14:56
【问题描述】:

我正在尝试通过实现SessionAware 接口(我已实现setSession 方法)从我的拦截器中访问会话对象,但我无法通过这种方式获取我的会话对象。

然后我尝试了ActionContext.getContext().getSession(),我能够获得会话,但我不知道,但它只是第一次在每个浏览器中为每个用户显示为空,然后在另一个操作时填充被调用。

我认为会话有问题。为什么它只是第一次给我一个空会话?只有在第一次给空会话后才设置一些东西吗?

如果是这种情况,那么每个人都会在第一次请求时显示为访客,然后在第二次请求时显示为用户名,以此类推。

还是我以错误的方式获取会话?

我看到了在拦截器中获取会话的代码,但这对我不起作用,因为它找不到常量 HTTP_REQUEST

final ActionContext context = invocation.getInvocationContext();

HttpServletRequest request = (HttpServletRequest) context.get(HTTP_REQUEST);

HttpSession session = request.getSession(true);

Object user = session.getAttribute(Constants.USER_HANDLE);

对解决任何问题有什么建议吗?

我忘了提一点——我的网站是一个安全网站(https),所以如果用户没有登录,它不会让他进入网站,如果他登录了,至少他的用户名应该在那里在会话中。不应该吗?

【问题讨论】:

  • 您需要提供有关何时将用户名放入会话的更多详细信息。登录是如何处理的?
  • kerberos 用户名被 servlet-config 拦截器放置在会话中。但它只将它放在第二个请求上,这给我带来了问题......
  • ServletConfigInterceptor 设置操作的值,但不会在会话中放置任何内容。就目前而言,您的问题没有为我提供足够的信息来帮助您。 HttpServletRequest.getUserPrincipal() 是否包含您需要的用户信息?
  • 好的。但是我在会话中的第二次动作调用中获得了这些值。我是怎么得到的?servlet-config 必须在执行操作期间/之后放置它,可以吗?我会检查 getUserPrincipal() 并让你知道。但是这个 userPrincipal 会在执行到达任何操作之前设置吗?
  • 不要相信我的话,看ServletConfigInterceptor的来源。它不会在会话中放置任何东西。它只是在你的行动中注入了各种各样的东西。 :) 是的,应该在调用您的操作之前设置用户主体。

标签: struts2 struts2-interceptors


【解决方案1】:

我有一个拦截器,它也将会话作为地图抓取。你有没有尝试过这样的事情?这对我有用。

public String intercept( ActionInvocation actionInvocation ) throws Exception {
    Map session = actionInvocation.getInvocationContext().getSession();

【讨论】:

  • 是的,我已经尝试过了。这两种方法第一次给我一个空会话。
  • 第一次会话不会是空的,直到你添加一些东西?
  • 不,这不应该是因为我在安全连接中访问我的网站,所以如果用户没有登录,网站会提示他输入凭据...
  • 只有在你的拦截器注册在默认的createSession拦截器之后,你才会有一个会话。
【解决方案2】:

您可以使用以下内容返回HttpSession——如果它不存在则创建它。

HttpSession session = ServletActionContext.getRequest().getSession(true);

如果您需要 Map,那么您可以在最后一次调用之后立即调用它(因为您传递了 true,所以会话将被创建并且下一次调用将返回一个空白会话映射)。

Map<String, Object> session = ActionContext.getContext().getSession();

或者,您可以在堆栈的早期使用CreateSessionInterceptor,以便在您需要时创建会话。那么就用上面的地图例子来获取吧。

仅供参考:ServletActionContextActionContext 的子类,它只具有获取请求和响应的便捷方法,而无需像您在示例中尝试的那样使用常量。

【讨论】:

  • 是的,我可以创建一个会话,但这不是我可以做的事情。我需要从会话中获取 kerberos 用户名,因此创建会话对我没有用。我希望你明白我的意思。
  • 什么是将 kerberos 用户名放入会话中?
  • 用户登录后不应该在那里吗?我在第二次操作调用时自动获取用户名,但我没有做任何事情将其放在第二次请求中。
  • 不,事情不只是出现在您的会话中。你必须把它们放在那里。
  • 好的。那么用户名是如何在第二个请求中进入我的会话的呢?一定有什么东西把它放在那里而不是我。那么我如何才能知道那里设置了什么?此外,用户名甚至不是来自 request.getUser() 方法。那么如何获取kerberos用户名呢?
【解决方案3】:

试试这个。它在 struts 2.0.14 中对我有用。

public String intercept(ActionInvocation ai) throws Exception {

     Map session = ActionContext.getContext().getSession(); 

【讨论】:

    【解决方案4】:

    添加导入:

    import org.apache.struts2.StrutsStatics;
    

    【讨论】:

    • 能否请您添加有关此导入为何有用的其他信息?
    【解决方案5】:

    您可以使用 ActionContext 本身在 Interceptor 上获取会话...参考以下代码 sn-p:

    SessionMap<String, Object> session = ActionContext.getContext().getSession();
    

    或者您也可以采用以下方法: 该请求在 ActionContext 实例上可用,该实例通过 ThreadLocal 提供。

    HttpServletRequest request = ServletActionContext.getRequest();
    HttpSession session = request.getSession(true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多