奇怪的行为:Angular Js - Spring Rest 服务

问题描述 投票:0回答:1

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

但是上述行为并没有发生在我身上。假设当 XXX 用户登录时,将使用用户名“XXX”调用休息服务,现在当用户搜索并尝试为另一个用户提取数据时说“YYY”,在 IE / Chrome 中我在请求标头中看到“YYY”是作为用户名传递。但在 Spring Rest 方面,在过滤器方法内,我总是在所有请求中看到(第一次用户名)“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"

我做了一些研究,但没有找到任何相关信息。

java angularjs spring
1个回答
1
投票

我相信你在这里遗漏了一些注释。如果我正确阅读 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());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.