Java Spring WebUtils针对每个请求的错误

Java Spring WebUtils针对每个请求的错误,java,spring,spring-mvc,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

我们最近决定将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:?]
这发生在我们站点RESTAPI上的每个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));
}
这意味着唯一可能发生错误的地方是
actualur.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;
}
你认为是弹簧虫还是我做错了什么

提前感谢,


Michal

我会查看上的示例8。总之,看起来使用了不同的mecahnics来获取主机:

UriComponentsBuilder.fromUri(responseEntity.getHeaders().getLocation()).build()


在使用
getLocation()
的地方使用
getOrigin()

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

您使用过nginx代理吗

当nginx将请求转发到tomcat服务器时,http头中的一些信息可能会丢失,所以我在nginx.conf中添加了这些信息,它可以工作:

proxy\u set\u头主机$http\u主机

代理\u集\u头原点$http\u原点

你好,布莱克,谢谢你的回答。不幸的是,我发布的所有代码示例都与Spring源代码分离,甚至没有被我的用户直接使用。我认为Spring Security在处理Http请求时使用了它。