我正在尝试使用 Spring的RestTemplate进行跨源请求.通信是在两个Spring-boot webapps之间完成的,这两个webapp都运行在localhost但不同的端口上.我所做的是:
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setorigin("http://localhost:8083");
httpHeaders.add("Authorization",token);

httpentity<Void> httpentity = new httpentity<>(httpHeaders);

ParameterizedTypeReference<List<MyObj>> beanType = new ParameterizedTypeReference<List<MyObj>>() {};
ResponseEntity<List<MyObj>> list = restTemplate.exchange(serviceURL,HttpMethod.GET,httpentity,beanType);

执行调用,“授权”标题传递得很好,但无论我尝试什么,接收端都没有“Origin”标题.
当我使用其他工具(SoapUI,RestClient Chrome插件等)创建一个simillar请求时,标题就像我提供的那样传递.

要在接收端打印所有标头,我正在使用javax.servlet.Filter的实现:

public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain)
        throws IOException,servletexception {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    Enumeration<String> headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
        String headerName = headerNames.nextElement();
        log.info(headerName + ": " + request.getHeader(headerName));
    }
}

使用RestTemplate时为什么不传递origin头?

解决方法

有同样的问题,我花了一个世纪来修复.

根本原因是来自RestTemplate文档的这一行

Note: by default the RestTemplate relies on standard JDK facilities to establish HTTP connections.

如果您在Java中检查HttpUrlConnection类的源代码,您将在下面的代码块中找到,并且标头Origin是禁止更改的受限标头之一:

/*
 * Restrict setting of request headers through the public api
 * consistent with JavaScript XMLHttpRequest2 with a few
 * exceptions. disallowed headers are silently ignored for
 * backwards compatibility reasons rather than throwing a
 * SecurityException. For example,some applets set the
 * Host header since old JREs did not implement HTTP 1.1.
 * Additionally,any header starting with Sec- is
 * disallowed.
 *
 * The following headers are allowed for historical reasons:
 *
 * Accept-Charset,Accept-Encoding,Cookie,Cookie2,Date,* Referer,TE,User-Agent,headers beginning with Proxy-.
 *
 * The following headers are allowed in a limited form:
 *
 * Connection: close
 *
 * See http://www.w3.org/TR/XMLHttpRequest2.
 */
 private static final boolean allowRestrictedHeaders;
 private static final Set<String> restrictedHeaderSet;
 private static final String[] restrictedHeaders = {
    /* Restricted by XMLHttpRequest2 */
    //"Accept-Charset",//"Accept-Encoding","Access-Control-Request-Headers","Access-Control-Request-Method","Connection",/* close is allowed */
    "Content-Length",//"Cookie",//"Cookie2","Content-transfer-encoding",//"Date",//"Expect","Host","Keep-Alive","Origin",// "Referer",// "TE","Trailer","transfer-encoding","Upgrade",//"User-Agent","Via"
};

只需设置JVM参数,就可以轻松解决此问题

-Dsun.net.http.allowRestrictedHeaders=true

或在代码中添加一行

System.setProperty("sun.net.http.allowRestrictedHeaders","true");

这抑制了限制.

java – RestTemplate没有传递Origin头的更多相关文章

  1. HTML5 3D书本翻页动画的实现示例

    这是一款十分炫酷的HTML5 3D书本翻页动画,效果相对比较简单,拖拽鼠标模拟用手翻页,需要的朋友们下面随着小编来一起学习学习吧

  2. 使用postMessage让 iframe自适应高度的方法示例

    这篇文章主要介绍了使用postMessage让 iframe自适应高度的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. ios – UIPopoverController出现在错误的位置

    所以我花了一些时间寻找答案,但到目前为止还没有找到任何答案.我正在尝试从UIInputAccessoryView上的按钮呈现弹出窗口.UIBarButtonItem我想显示popover来自定制视图,所以我可以使用图像.我创建这样的按钮:当需要显示popover时,我这样做:但我得到的是:弹出窗口看起来很好,但它应该出现在第一个按钮上时出现在第二个按钮上.然后我发现了这个问题:UIBarButto

  4. ios – 无法在UITableViewCell的drawRect中绘制

    我在使用自定义UITableViewCell的drawRect方法时遇到了麻烦.这是我正在使用的代码我已经调试过以确保所有数值都有意义,看起来它们确实存在.无法真正找出屏幕上没有任何内容的原因.值得一提的是,这也是一个在笔尖中定义的单元格.我正在使用iOS7sdk构建.有任何想法吗?tahnks解决方法你可能不应该在UITableViewCell自己的drawRect中这样做.而是创建一个自定义UIView并将其添加为子视图.另见thisanswer.

  5. UITableView在iOS 7中,在单元格中编辑UITextView时,不滚动到正确的位置

    我有一个静态单元的表视图.一个单元格包含一个UITextView,并且heightForRowAtIndexPath:是动态计算的,因此单元格总是足够高以容纳文本(该部分在iOS7下实现了一些工作,实际上,因为不可能简单地询问textView的contentSize).当我在文本视图中点击开始编辑时,键盘动画到位,tableView上的contentInsets会自动调整,以解决这个问题(即iPh

  6. ios – 找不到金属’质地’

    随着每个基于Metal的ImageView的实现,我都面临同样的问题Valueoftype‘MTLDrawable’hasnomember‘texture’好像苹果改变了一些金属api这是我试用的全部功能:解决方法执行系统和xcode更新后,我遇到了同样的问题.在更新过程中,xcode将构建目标切换到模拟器.一旦我将目标切换回设备,它就会再次编译.

  7. ios – 计算UITextField基线位置

    我试图通过编程方式将UITextField的实例的基线与UIButton的实例对齐.我正在处理这个计算类似于here描述的方式,但是使用UITextField可以有一个偏移的内容.任何想法如何获得UITextField中的文本位置甚至更好,是否有一个更简单的方法来对齐基线?解决方法在我的经验中,与UIButton不同,UITextField在文本周围实际上并没有任何偏移.无论如何,您可以在两个控件中找出确切的文本框:

  8. ios – UISearchController不重新显示旋转导航栏

    我已经实施了UISearchController,除了…解决方法看起来UISearchController忘记在状态栏重新出现时重新设置searchBar的框架.我认为这可能是UISearchController中的一个错误;似乎有一些列在radar.似乎searchBar的超级视图最终以错误的高度.这是令人烦恼的,因为解决方案因此涉及到SearchController的视图层次结构,哪个苹果可以改变…

  9. 键盘隐藏了IOS中的文本字段

    90个我在IOS中使用带有一些文本字段的scrollview创建了一个表单.视图看起来像这样,当我开始编辑州或以下字段时,键盘会隐藏该字段.像这样,我该怎么做才能看到下面的字段?

  10. ios – 在viewDidLayoutSubviews中更改帧

    我是否需要添加某种标志来检查动画是否已经运行?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部