奇怪的行为:Angular Js-Spring Rest Service

时间:2018-07-25 19:24:09

标签: java angularjs spring

我在中间层使用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"

我做了一些研究,但没有找到任何相关信息。我们对此表示任何帮助。

1 个答案:

答案 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());
    }
}