怪异行为:角度Js-弹簧座服务



我在中间层使用Angular JS和Spring 4 rest服务。我在请求标头中遇到了一个奇怪的行为。我的应用程序显示用户信息的基本面板。当用户第一次登录时,Angular JS对请求头中有用户名的rest服务进行AJAX调用,并显示数据。用户现在可以搜索另一个用户,选择后,Angular JS现在对同一个rest服务进行AJAX调用,但在请求头中有不同的用户名,并显示数据。

但上述行为并没有发生在我身上。比如当XXX用户登录时,休息服务被调用用户名";XXX";现在,当用户搜索并试图为另一用户提取数据时;YYY";,在IE/Chrome中,我在请求标头中看到";YYY";作为用户名传递。但在Spring Rest方面,在filter方法内部,我总是看到(第一次使用用户名(";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"

我做了一些调查,但找不到任何相关信息。

我相信您在这里缺少了一些注释。如果我正确阅读了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());
}
}

最新更新