我们决定最近将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;
}
你认为这是一个春天的错误还是我做错了什么?
提前致谢,
米甲
答案 0 :(得分:1)
使用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;
答案 1 :(得分:0)
我会在this site上查看示例8。总之,看起来不同的mecahnics被用来获得主持人:
UriComponentsBuilder.fromUri(responseEntity.getHeaders().getLocation()).build();
在您使用getLocation()
getOrigin()