我在中间层使用Angular JS和Spring 4 rest服务。我在请求标头中遇到怪异的行为。我的应用程序显示用户信息的基本仪表板。首次用户登录时,Angular JS会在请求标头中使用用户名对rest服务进行ajax调用并显示数据。用户现在可以搜索另一个用户,并且选择后,Angular JS现在可以对相同的REST服务进行ajax调用,但是在请求标头中使用不同用户名并显示数据。
但是对我而言,上述行为并未发生。例如,当XXX用户登录时,正在使用用户名“ XXX”调用rest服务,现在当用户搜索并尝试为另一个用户提取数据时说“ YYY”,在IE / Chrome中,我在请求标头“ YYY”中看到的是作为用户名传递。但是在春季休息日的过滤器方法内部,我总是在所有请求中看到(首次用户名)“ XXX”。
这并不是在所有环境中都发生,这很奇怪。虽然我在请求标头中看到传递了正确的用户名,但在过滤器方法日志中却打印了旧的/已登录的用户名。下面是过滤器功能代码,
@Provider
@Priority(Priorities.HEADER_DECORATOR)
public class UserInterceptor implements ContainerRequestFilter {
private static final Logger logger = Logger.getLogger(UserInterceptor .class.getName());
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
logger.info("requestContext.getHeaders() "+requestContext.getHeaders()); //always prints "XXX"
我做了一些研究,但没有找到任何相关信息。我们对此表示任何帮助。
答案 0 :(得分:1)
我相信您在这里缺少一些注释。如果我正确阅读了documentation for ContainerRequestFilter,则需要在此处为您的班级添加'@PreMatching'注释。
根据文档:
如果应在预匹配扩展点(即在JAX-RS运行时执行任何请求匹配之前)应用过滤器,则过滤器必须使用@PreMatching注释进行注释。
JAX-RS是将HTTP请求与特定方法匹配的过程。我相信这里的问题是您在尝试将请求匹配到特定路径之前尝试抢头。
@Provider
@PreMatching
@Priority(Priorities.HEADER_DECORATOR)
public class UserInterceptor implements ContainerRequestFilter {
private static final Logger logger = Logger.getLogger(UserInterceptor.class.getName());
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
logger.info("requestContext.getHeaders() "+requestContext.getHeaders());
}
}