繁体   English   中英

HttpSession无法获取属性

[英]HttpSession Can not get attribute

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

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

这是我在Handler的handle方法中向会话添加值的方式:

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

这是我尝试在Filter中取回数据的方式:

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

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

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM