我在中间层使用 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"
我做了一些研究,但没有找到任何相关信息。
我相信你在这里遗漏了一些注释。如果我正确阅读 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());
}
}