【问题标题】:HttpSession Can not get attributeHttpSession 无法获取属性
【发布时间】:2016-10-24 21:52:51
【问题描述】:

我使用HttpHandler和HttpFilter以及我们公司内部的授权服务来实现对jsp页面的授权。所以逻辑是: 如果我收到 HttpRequest 并且标头中有用户,我会向我们的服务发送请求以获取该用户的访问角色。比我想将这些角色作为属性添加到 HttpSession 中。我在 HttpHandler 中实现了这个逻辑,它从 Jetty-server 扩展了 AbstractHandler。因此角色已成功添加到会话对象中。然后请求进入过滤器。在我的过滤器中,我试图从会话中获取这些值,但没有运气。我检查了会话的字符串哈希值到处都是相同的,但在处理程序中我能够将值视为属性,在过滤器中根本没有属性。然后我检查了 Handler 和 Filter 中的 hashCode() 是否为 Session 对象返回不同的值,即使它们具有相同的哈希会话值。

您能否提出一些建议来弄清楚为什么会话标识符相同,但对象不同并且过滤器中没有属性值。

这就是我在 Handler 的处理方法中为会话添加价值的方式:

httpServletRequest.getSession(true).setAttribute(ACCESS_ROLES, StringUtils.join(getEntitlementAuthorities(user), ENTITLEMENT_ROLES_DIVIDER));

这就是我尝试在过滤器中取回数据的方式:

 Object attributesObject = httpRequest.getSession().getAttribute(ACCESS_ROLES);

【问题讨论】:

标签: java session servlets jakarta-ee


【解决方案1】:

最终发现问题。 我以编程方式创建 Jetty 服务器,在 HandlerCollection 中添加处理程序。 首先我添加了 SessionHandler,然后我添加了 ServletContextHandler。如果不设置 ServletContextHandler 会创建自己的 SessionHandler。所以我有两个 SessionHandlers。即使我在列表中看到会话标识符,它也是不共享属性的不同会话对象。 最后,这个模式开始起作用了:

HandlerCollection hc = new HandlerCollection();
ServletContextHandler contextHandler = buildServletHandler();
hc.addHandler(new UserAuthenticationHandler());
hc.addHandler(contextHandler);
hc.addHandler(logHandler);
SessionHandler sh = new SessionHandler();
sh.setHandler(hc);
server.setHandler(sh);

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多