我试图通过实现SessionAware
接口(我已经实现了setSession
方法)从我的拦截器中访问会话对象,但是我无法以这种方式获取会话对象。 / p>
然后我尝试了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),所以如果用户没有登录,就不会让他进入网站&如果他已登录,至少他的用户名应该在会话中。不应该吗?
答案 0 :(得分:3)
我有一个拦截器,它也将会话作为一个地图抓取。你尝试过这样的事吗?这对我有用。
public String intercept( ActionInvocation actionInvocation ) throws Exception {
Map session = actionInvocation.getInvocationContext().getSession();
答案 1 :(得分:0)
您可以使用以下命令返回HttpSession
- 如果不存在则创建它。
HttpSession session = ServletActionContext.getRequest().getSession(true);
如果您需要Map,那么您可以在最后一次调用后立即调用它(因为您传递了true,会话已经创建,下一次调用将返回一个空白会话映射)。
Map<String, Object> session = ActionContext.getContext().getSession();
或者,您可以在堆栈的早期使用CreateSessionInterceptor
,以便在您需要时创建会话。然后使用上面的地图示例来获取它。
仅供参考:ServletActionContext
是ActionContext
的子类,它只是提供了方便的方法来获取请求和响应,而无需像您在示例中那样使用常量。
答案 2 :(得分:0)
试试这个。它在struts 2.0.14中对我有用。
public String intercept(ActionInvocation ai) throws Exception {
Map session = ActionContext.getContext().getSession();
答案 3 :(得分:0)
您可以使用ActionContext本身获取Interceptor上的会话...请参阅以下代码段:
SessionMap<String, Object> session = ActionContext.getContext().getSession();
或者你也可以遵循这种方法: 该请求在ActionContext实例上可用,该实例可通过ThreadLocal提供。
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession(true);
答案 4 :(得分:-1)
添加导入:
import org.apache.struts2.StrutsStatics;