java - 每个请求的 Spring WebUtils 错误

标签 java spring spring-mvc

我们最近决定将 spring 框架从 4.1.6 更新到 4.2.5。之后出现如下错误:

java.lang.NullPointerException
    at org.springframework.web.util.WebUtils.isSameOrigin(WebUtils.java:816) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.web.cors.DefaultCorsProcessor.processRequest(DefaultCorsProcessor.java:71) ~[spring-web-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.web.servlet.handler.AbstractHandlerMapping$CorsInterceptor.preHandle(AbstractHandlerMapping.java:503) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.web.servlet.HandlerExecutionChain.applyPreHandle(HandlerExecutionChain.java:134) ~[spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:954) [spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) [spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:968) [spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:870) [spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) [servlet-api.jar:?]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:844) [spring-webmvc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) [servlet-api.jar:?]

我们网站对 REST API 的每个 AJAX 请求都会发生这种情况。我做了一些研究,在 WebUtils 中发现了以下内容:

public static boolean isSameOrigin(HttpRequest request) {
    String origin = request.getHeaders().getOrigin();
    if (origin == null) {
        return true;
    }
    UriComponents actualUrl = UriComponentsBuilder.fromHttpRequest(request).build();
    UriComponents originUrl = UriComponentsBuilder.fromOriginHeader(origin).build();
    return (actualUrl.getHost().equals(originUrl.getHost()) && getPort(actualUrl) == getPort(originUrl));
}

这意味着唯一可能发生该错误的地方是 actualUrl.getHost().equals。当我打开 build() 方法时,我发现:

public UriComponents build(boolean encoded) {
        if (this.ssp != null) {
            return new OpaqueUriComponents(this.scheme, this.ssp, this.fragment); 

getHost() 方法在 OpaqueUriComponents 中定义如下,在所有情况下肯定会导致 null 并引发 NullPointerException。

@Override
public String getHost() {
    return null;
}

你认为这是一个 spring 错误还是我做错了什么?

提前致谢

米迦勒

最佳答案

我在使用nginx代理的时候也遇到过这个问题。
actualUrl.getHost().equals()抛出 NullPointException,因为 tomcat 服务器无法从 http header 获取主机。

你用过nginx代理吗?

当 nginx 转发请求到 tomcat 服务器时,http header 中的一些信息可能会丢失,所以我将这些添加到 nginx.conf 中并且它有效:

proxy_set_header Host $http_host;<br/> proxy_set_header Origin $http_origin;

关于java - 每个请求的 Spring WebUtils 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36603150/

相关文章:

java - 如何在类路径中使用通配符来添加多个 jar?

c# - 跨平台开发的更好选择:Java还是C#?

java - 无法从 java 中读取文件(困难格式)

java - 你能给我一个没有框架的依赖注入(inject)的例子吗?

java - spring-boot RabbitListener 如何将单个队列绑定(bind)到单个线程?

hibernate - "migrate business logic code into our domain model"是个好主意吗?

java - 关于 Spring web.xml <context-param> 和 <listener> 标签的一些信息(引用一个 Hello World 示例)

java - 定制 Jackson 反序列化器来处理任何 bean 的属性

java - Spring MVC 中模型对象未传递给 jsps - InternalResourceView - renderMergedOutputModel

java - Spring @transactional 不起作用