首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每次请求都会出现Spring WebUtils错误

每次请求都会出现Spring WebUtils错误
EN

Stack Overflow用户
提问于 2016-04-13 23:32:11
回答 2查看 1.3K关注 0票数 3

最近我们决定将spring框架从4.1.6升级到4.2.5。之后,出现了以下错误:

代码语言:javascript
复制
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中找到了以下内容:

代码语言:javascript
复制
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()方法时,我发现:

代码语言:javascript
复制
public UriComponents build(boolean encoded) {
        if (this.ssp != null) {
            return new OpaqueUriComponents(this.scheme, this.ssp, this.fragment); 

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

代码语言:javascript
复制
@Override
public String getHost() {
    return null;
}

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

提前谢谢你,

米哈尔

EN

回答 2

Stack Overflow用户

发布于 2016-10-20 15:16:00

我在使用nginx代理时也遇到了这个问题。

actualUrl.getHost().equals()抛出NullPointException,因为tomcat服务器无法从http头获取主机。

你用过nginx代理吗?

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

proxy_set_header Host $http_host;

proxy_set_header Origin $http_origin;

票数 2
EN

Stack Overflow用户

发布于 2016-04-13 23:47:47

我会在this site上查看示例8。总而言之,似乎使用了不同的机制来获取主机:

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36603150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档