4

我试图通过实现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),所以如果用户没有登录,它不会让他进入网站,如果他登录了,至少他的用户名应该在会话中. 不应该吗?

4

5 回答 5

3

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

public String intercept( ActionInvocation actionInvocation ) throws Exception {
    Map session = actionInvocation.getInvocationContext().getSession();
于 2011-08-12T13:50:59.220 回答
0

您可以使用以下内容返回HttpSession-- 并在它不存在时创建它。

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

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

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

或者,您可以CreateSessionInterceptor在堆栈中使用早期,以便在您需要时创建会话。然后只需使用上面的地图示例来获取它。

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

于 2011-08-12T17:31:20.313 回答
0

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

public String intercept(ActionInvocation ai) throws Exception {

     Map session = ActionContext.getContext().getSession(); 
于 2013-05-14T11:14:53.210 回答
0

您可以使用 ActionContext 本身在 Interceptor 上获取会话...请参阅以下代码片段:

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

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

HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession(true);
于 2017-02-06T08:40:37.520 回答
-1

添加导入:

import org.apache.struts2.StrutsStatics;
于 2016-11-08T22:35:12.040 回答