【发布时间】: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