@xmlhttprequest 跨域mapping支持跨域吗

查看: 11381|回复: 10
注册时间最后登录阅读权限20积分326精华0帖子
注册会员, 积分 326, 距离下一级还需 174 积分
扫一扫,手机访问本帖
本帖最后由 jacksonlai 于
13:12 编辑
通过spring mvc 实现 Ajax跨域访问
本人不太喜欢直接用servlet,写的web.xml一堆东西,最近项目一直在使用springmvc,所以帖一个spring mvc 的 Ajax跨域访问的Proxy,废话不说了,代码如下:
@Controller
@RequestMapping(&/AjaxProxy&)
public class AjaxProxyController {
& && &&&@RequestMapping(value = &/proxy&)
& && &&&@ResponseBody
& && &&&public final void proxyAjaxCall(
& && && && && && && && &@RequestParam(required = true, value = &url&) String url,
& && && && && && && && &HttpServletRequest request, HttpServletResponse response)
& && && && && && && && &throws IOException {
& && && && && & // URL needs to be url decoded
& && && && && & url = URLDecoder.decode(url, &utf-8&);
& && && && && & // 此处主义要设置OutputStreamWriter的编码, 否则使用系统的默认字符编码
& && && && && & OutputStreamWriter writer = new OutputStreamWriter(
& && && && && && && && && && &&&response.getOutputStream(), response.getCharacterEncoding());
& && && && && & HttpClient client = new HttpClient();
& && && && && & try {
& && && && && && && && &HttpMethod method =
& && && && && && && && &// Split this according to the type of request
& && && && && && && && &if (request.getMethod().equals(&GET&)) {
& && && && && && && && && && &&&method = new GetMethod(url);
& && && && && && && && &} else if (request.getMethod().equals(&POST&)) {
& && && && && && && && && && &&&method = new PostMethod(url);
& && && && && && && && && && &&&// Set any eventual parameters that came with our original
& && && && && && && && && && &&&// request (POST params, for instance)
& && && && && && && && && && &&&Enumeration&String& paramNames = request.getParameterNames();
& && && && && && && && && && &&&while (paramNames.hasMoreElements()) {
& && && && && && && && && && && && && & String paramName = paramNames.nextElement();
& && && && && && && && && && && && && & ((PostMethod) method).setParameter(paramName,
& && && && && && && && && && && && && && && && && && &&&request.getParameter(paramName));
& && && && && && && && && && &&&}
& && && && && && && && &} else {
& && && && && && && && && && &&&throw new NotImplementedException(
& && && && && && && && && && && && && && && && &&This proxy only supports GET and POST methods.&);
& && && && && && && && &}
& && && && && && && && &method.getParams().setParameter(
& && && && && && && && && && && && && & HttpMethodParams.HTTP_CONTENT_CHARSET, &UTF-8&);
& && && && && && && && &// Execute the method
& && && && && && && && &client.executeMethod(method);
& && && && && && && && &// Set the content type, as it comes from the server
& && && && && && && && &Header[] headers = method.getResponseHeaders();
& && && && && && && && &for (Header header : headers) {
& && && && && && && && && && &&&if (&Content-Type&.equalsIgnoreCase(header.getName())) {
& && && && && && && && && && && && && & response.setContentType(header.getValue());
& && && && && && && && && && &&&}
& && && && && && && && &}
& && && && && && && && &String responseBody = method.getResponseBodyAsString();
& && && && && && && && &// Write the body, flush and close
& && && && && && && && &writer.write(responseBody);
& && && && && && && && &writer.flush();
& && && && && && && && &writer.close();
& && && && && & } catch (HttpException e) {
& && && && && && && && &// log.error(&Oops, something went wrong in the HTTP proxy&, null,
& && && && && && && && &// e);
& && && && && && && && &writer.write(e.toString());
& && && && && && && && &
& && && && && & } catch (IOException e) {
& && && && && && && && &e.printStackTrace();
& && && && && && && && &writer.write(e.toString());
& && && && && && && && &
& && && && && & }
在 openlayers 中代理的使用:
OpenLayers.ProxyHost = '/XXXXXX/AjaxProxy/proxy.do?url=';
XXXXXX是项目名字
总评分:&金钱 + 50&
注册时间最后登录阅读权限20积分326精华0帖子
注册会员, 积分 326, 距离下一级还需 174 积分
自己先顶一个
注册时间最后登录阅读权限200积分1362精华0帖子
jacksonlai 发表于
自己先顶一个
已经给你加金钱了。
注册时间最后登录阅读权限20积分326精华0帖子
注册会员, 积分 326, 距离下一级还需 174 积分
admin 发表于
已经给你加金钱了。
注册时间最后登录阅读权限20积分478精华0帖子
注册会员, 积分 478, 距离下一级还需 22 积分
jacksonlai 发表于
谢谢,管理员
一次给加了50分,顶,顶,顶
注册时间最后登录阅读权限20积分332精华0帖子
注册会员, 积分 332, 距离下一级还需 168 积分
顶,赞一个!
注册时间最后登录阅读权限200积分1362精华0帖子
hao 发表于
一次给加了50分,顶,顶,顶
就是为了鼓励大家发原创的东西给大家共享。
注册时间最后登录阅读权限50积分1771精华0帖子
高级会员, 积分 1771, 距离下一级还需 1229 积分
谢谢楼主,好东西啊!
注册时间最后登录阅读权限10积分48精华0帖子
新手上路, 积分 48, 距离下一级还需 152 积分
注册时间最后登录阅读权限10积分66精华0帖子
新手上路, 积分 66, 距离下一级还需 134 积分
学习学习&&挺好的
积极宣传本站,为本站带来更多的用户访问量
经常在论坛发帖,且发帖量较大
号外号外!!!
OpenLayers中文官方站奖励政策
赚积分啦!!!!
积分越多,可查询更多优质帖子。还有很多奖励哦!!还不快来参加!!!!
Powered by本来想学习一下@RequestBody这个注解,但发请求时出现跨域问题,所以就先来看一下跨域该怎么办。
首先因为最近在做一个前后端分离的项目,分开就意味着可能不在一个域中,所以不可避免的遇到CORS的问题。试过几个方法:
Spring MVC 4.2.5以后新增的支持跨域的注解,如果是老项目的话升级spring库可能会有些兼容的问题,不知为什么这个注解没有升效;用反向代理,这个一定好使的;
还有就是我现在使用的,手动增加一个Filter,在Response中增加对跨域的支持,这种方式对老浏览器可能会有问题。
CORSFilter.
public class CORSFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse)
response.setHeader(&Access-Control-Allow-Origin&, &*&);
response.setHeader(&Access-Control-Allow-Methods&, &POST, GET, OPTIONS, DELETE&);
response.setHeader(&Access-Control-Max-Age&, &3600&);
response.addHeader(&Access-Control-Allow-Headers&, &Origin, X-Requested-With, Content-Type, Accept&);
chain.doFilter(req, res);
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}123456789101112123456789101112
&xxxx.CORSFilter&
&1234567812345678
如此即可解决跨域问题。
@RequestBody
下面说说@RequestBody这个注解。因为一直觉得传简单对象直接不用注解也可以自动组装,就以为可以为我们组装所有类型的对象。但今天过,原来象Map,List或复合对象都必需使用这个注解才可以正确组装,以下是我的测试代码:&
首先写个测试的Controller:
RequestBodyController.java
import java.util.L
import java.util.M
import javax.servlet.http.HttpServletR
import org.mon.controller.BaseC
import org.springframework.context.annotation.S
import org.springframework.stereotype.C
import org.springframework.web.bind.annotation.CrossO
import org.springframework.web.bind.annotation.RequestB
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.ResponseB
import com.alibaba.fastjson.JSON;
public String getName() {
public String getValue() {
public void setName(String name) {
this.name =
public void setValue(String value) {
this.value =
private List&A&
public List&A& getA() {
public String getCount() {
public void setA(List&A& a) {
public void setCount(String count) {
this.count =
@Scope(&prototype&)
@Controller
@RequestMapping(&/rb&)
public class RequestBodyController extends BaseController{
@RequestMapping(value = &test1&)
@ResponseBody
public Map test1(A a,HttpServletResponse response) {
System.out.println(JSON.toJSONString(a));
return toSuccess();
} catch (Exception e) {
e.printStackTrace();
return toError();
@RequestMapping(value = &test2&)
@ResponseBody
public Map test2(List&A& a,HttpServletResponse response) {
System.out.println(JSON.toJSONString(a));
return toSuccess();
} catch (Exception e) {
e.printStackTrace();
return toError();
@RequestMapping(value = &test3&)
@ResponseBody
public Map test3(@RequestBody List&A& a,HttpServletResponse response) {
System.out.println(JSON.toJSONString(a));
return toSuccess();
} catch (Exception e) {
e.printStackTrace();
return toError();
@RequestMapping(value = &test4&)
@ResponseBody
public Map test4(B b,HttpServletResponse response) {
System.out.println(JSON.toJSONString(b));
return toSuccess();
} catch (Exception e) {
e.printStackTrace();
return toError();
@RequestMapping(value = &test5&)
@ResponseBody
public Map test5(@RequestBody B b,HttpServletResponse response) {
System.out.println(JSON.toJSONString(b));
return toSuccess();
} catch (Exception e) {
e.printStackTrace();
return toError();
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
测试用的html文件:&
&!DOCTYPE html&
lang=&en&&
charset=&UTF-8&&
&Document&
src=&/js/jquery/1.9.1/jquery-1.9.1.min.js&&&
function ajax(url,data,contentType){
type: &POST&,
contentType: contentType,
data: data,
success: function(data){
console.log(data);
error: function(XMLHttpRequest, textStatus, errorThrown) {
alert(&Error Occured!&);
function test1(){
var data = {
&http://localhost:8080/orcs/rb/test1.do&,
&application/x-www-form-urlencoded&
function test2(){
var data = [
value:444456
&http://localhost:8080/orcs/rb/test2.do&,
&application/x-www-form-urlencoded&
function test3(){
var data = [
value:444456
&http://localhost:8080/orcs/rb/test3.do&,
JSON.stringify(data),
&application/json&
function test4(){
var data = {
value:444456
&http://localhost:8080/orcs/rb/test4.do&,
&application/x-www-form-urlencoded&
function test5(){
var data = {
value:444456
&http://localhost:8080/orcs/rb/test5.do&,
JSON.stringify(data),
&application/json&
onclick=&test1()&&btn1&
onclick=&test2()&&btn2&
onclick=&test3()&&btn3&
onclick=&test4()&&btn4&
onclick=&test5()&&btn5&
&123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
发现@RequestBody这个注解,使用时对ajax有些要求:
数据必需要用JSON.stringify(data)处理;contentType类型必需为application/json。
而不加这个注解组装简单对象时,则:&
1. 数据直接用json不必处理;&
2.&contentType类型默认为application/x-www-form-urlencoded即可。
因为没有深入研究,有不对的地方请指出 :)
本文已收录于以下专栏:
相关文章推荐
js前端请求:
function getOcrInfo(imageData){
   url: 'http://localhost:8080/LSWS/ws/ocr/...
一次正常的请求
最近别人需要调用我们系统的某一个功能,对方希望提供一个api让其能够更新数据。由于该同学是客户端开发,于是有了类似以下代码。
@RequestMapping(method = Re...
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' he...
  前端ajax跨域请求后台接口时,报下面的错:
to preflight
request doesn't
pass access
control ch...
一、了解spring注解@ResponseBody,@RequestBody和HttpMessage
Spring MVC 解决跨域问题&以及对@RequestBody的理解本来想学习一下@RequestBody这个注解,但发请求时出现跨域问题,所以就先来看一下跨域该怎么办。CORS首先因为最近在做一...
jq ajax通过post json对象
遇到的HTTP 415/400问题错误解决方案:/Linux/28.htm
客户端:...
UMeditor结合spring mvc restful解决图片上传跨域问题项目背景(任何不谈背景的解决方案都是耍流氓):
之前在很多地方看到了各种解决方法,然而有的是和我的情况不一致,有的是根本没...
现在接手学校网络中心的一个项目,根据团队成员的实际情况以及开发需要,老师希望做到前后端完全分离。后台使用java提供restful API 作为核心,前台无论PC或者移动端可以共用一个核心。前期解决了...
使用Spring MVC 的 @RequestBody 映射json请求参数时报“The request sent by the client was syntactically incorrect....
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)SpringBoot下如何配置实现跨域请求? - 喝酒不骑马的博客 - CSDN博客
SpringBoot下如何配置实现跨域请求?
SpringBoot
最近在做的项目中,我们采用前后端分离式开发。后台RequestController接口写好后,通过另一台电脑的前端界面用ajax访问我电脑上的后台服务接口时,http请求会返回500的错误。经过查阅资料得知,这个问题是由“跨域请求”所引起的。那么这个“跨域”到底是什么呢?
一、什么是跨域请求?
跨域请求,就是说浏览器在执行脚本文件的ajax请求时,脚本文件所在的服务地址和请求的服务地址不一样。说白了就是ip、网络协议、端口都一样的时候,就是同一个域,否则就是跨域。这是由于Netscape提出一个著名的安全策略——同源策略造成的,这是浏览器对JavaScript施加的安全限制。是防止外网的脚本恶意攻击服务器的一种措施。
二、SpringBoot工程如何解决跨域问题?
那么如何在SpringBoot中处理跨域问题呢?方法有很多,这里着重讲一种——利用@Configuration配置跨域。
代码实现如下:
* Created by myz on .
* 设置跨域请求
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
return corsC
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(source);
这里最重要代码是
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
source.registerCorsConfiguration("/**", buildConfig());
“*”代表全部。”**”代表适配所有接口。
其中addAllowedOrigin(String origin)方法是追加访问源地址。如果不使用”*”(即允许全部访问源),则可以配置多条访问源来做控制。
corsConfiguration.addAllowedOrigin("/")
corsConfiguration.addAllowedOrigin("/")
查看CorsConfiguration类的官方文档()
我们可以找到官方对setAllowedOrigins(List allowedOrigins)和addAllowedOrigin(String origin)方法的介绍。
addAllowedOrigin是追加访问源地址,而setAllowedOrigins是可以直接设置多条访问源。
但是有一点请注意,我查看setAllowedOrigins方法源码时发现,源码如下
public void setAllowedOrigins(List&String& allowedOrigins) {
this.allowedOrigins = allowedOrigins != null?new ArrayList(allowedOrigins):null;
根据源码可以得知,setAllowedOrigins会覆盖this.allowedOrigins。所以在配置访问源地址时,
addAllowedOrigin方法要写在setAllowedOrigins后面,当然了,一般情况下这两个方法也不会混着用。
addAllowedHeader、addAllowedMethod、registerCorsConfiguration方法和addAllowedOrigin的源码差不太多,这里就不一一介绍了。感兴趣的朋友可以自行查阅。
三、其他实现跨域请求方法
当然。除了用这种初始化配置的方法设置跨域问题,在官方的文档中也介绍了其他实现跨域请求的方法()。
例如在接口上使用@CrossOrgin注解:
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
对于上述代码,官方给出如下一段说明:
You can add to your @RequestMapping annotated handler method a @CrossOrigin annotation in order to enable CORS on it (by default @CrossOrigin allows all origins and the HTTP methods specified in the @RequestMapping annotation).
意思就是可以直接在@RequestMapping接口上使用@CrossOrigin实现跨域。@CrossOrigin默认允许所有访问源和访问方法。
还有一种方法是直接对整个Controller进行跨域设置:
@CrossOrigin(origins = "", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
这里,可以对@CrossOrigin设置特定的访问源,而不是使用默认配置。
以上就是对SpringBoot下配实现跨域请求的介绍。
参考文档:
我的热门文章转载自&http://blog.csdn.net/james_wade63/article/details/
跨域是指html文件所在的服务器与ajax请求的服务器是不同的ip+port,例如:&
- ‘192.168.1.1:8080’ 与 ‘192.168.1.2:8080’是不同的域。&
- ‘192.168.1.1:8080’ 与 ‘192.168.1.1:8081’是不同的域。
解决此类问题的方法很多,有需要客户端和服务端都要更改的,例如jsonp,iframe等等;有只需要客户端更改的,这种情况只能出现在hybrid app开发中,即通过调用native方法来进行网络请求;有只需要服务端配置的,下面介绍3种服务端配置的方法。
如果您使用的mvc框架是spring4.2以上的话,一个@CrossOrigin就可以搞定。将@CrossOrigin加到Controller上,那么这个Controller所有的请求都是支持跨域的,代码如下:
@Controller
@CrossOrigin
public class GreetingController {123123
将@CrossOrigin加到请求方法上,那么这个请求是支持跨域的,代码如下
@CrossOrigin
@RequestMapping(&/greeting&)
public @ResponseBody Greeting greeting(@RequestParam(required=false, defaultValue=&World&) String name) {123123
更详细的@CrossOrigin介绍,请参看
全局配置,也需要spring4.2以上。
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping(&/greeting-javaconfig&).allowedOrigins(&http://localhost:9000&);
}123456789123456789
.addCorsMappings()中的参数代表支持跨域的url,.allowedOrigins()中的参数代表可以访问该接口的域名,设置为”*”可支持所有域。
这种方法就跟框架无关了,需要两个jar包,点击进行下载,两个jar包可以放的程序里,也可以放到tomcat中,然后将下面的配置写到web.xml中就可以了
& com.thetransactioncompany.cors.CORSFilter
& cors.allowOrigin
& cors.supportedMethods
& GET, POST, HEAD, PUT, DELETE
& cors.supportedHeaders
& Accept, Origin, X-Requested-With, Content-Type, Last-Modified
& cors.exposedHeaders
& Set-Cookie
& cors.supportsCredentials
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545512345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
本文已收录于以下专栏:
相关文章推荐
跨域是指html文件所在的服务器与ajax请求的服务器是不同的ip+port,例如:
- ‘192.168.1.1:8080’ 与 ‘192.168.1.2:8080’是不同的域。
- ‘192....
现在很多开发的API都支持ajax直接请求,这样就会导致跨域的问题,解决跨域的问题一方面可以从前端,另一方面就是服务器端。既然是搞服务器端,做对外的API服务,当然是做到越简单越好,前端只需要傻傻的使...
1、Response.Redirect这个跳转页面的方法跳转速度不快,因为它要走2次回发(postback)。    它可以跳转到任何页面,没有站点页面限制(可以由baidu跳转到google),但不...
使用WebUploader跨域上传图片,用SpringMVC实现服务器端使用WebUploader实现跨域上传图片,当点击上传时,客户端会向服务器端先后发送两次请求,第一次是OPTIONS请求,用来验...
前言:之前做好的登陆接口,刚刚拿去给前端调用。发现前端那边报错,无法调到接口。因为我们后端的接口是在一台服务器上,前端(使用的是nodejs)的代码在另一台服务器上,导致两台服务器之间无法相互调用(服...
基于jQuery的ajax跨域请求,PHP作为服务器端代码
JavaScript: Use a Web Proxy for Cross-Domain XMLHttpRequest Calls
XMLHttpRequest同域限制只是浏览器端的安全限...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Spring(11)
什么是跨域
简单的说即为浏览器限制访问A站点下的js代码对B站点下的url进行ajax请求。比如说,前端域名是,那么在当前环境中运行的js代码,出于安全考虑,访问域名下的资源,是受到限制的。现代浏览器默认都会基于安全原因而阻止跨域的ajax请求,这是现代浏览器中必备的功能,但是往往给开发带来不便。特别是对我这样后台开发人员来讲,这个事情简直神奇。
但跨域的需求却一直都在,为了跨域,勤劳勇敢的程序猿们想出了许许多多的方法,例如,jsonP、代理文件等等。但这些做法增加了许多不必要的维护成本,而且应用场景也有许多限制,例如jsonP并非XHR,所以jsonP只能使用GET传递参数。更详细的资料可以看这里
如今的JS大有一统天下的趋势,浏览器已经成了大多应用最好的安身之所。哪怕在移动端也有各种Hybird方案,在本地文件系统的Web页面,也有需要获取外部数据的需求,而这些需求也必然是跨域的。在寻找跨域解决方案时,发现了最优雅解决方案就是HTML5来带了的“Cross-Origin Resource Sharing”的新特性,来赋予开发者权力决定资源是否允许被跨域访问。
CORS是一个W3C标准,全称是&跨域资源共享&(Cross-origin resource sharing)。
它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
为什么说它优雅呢?
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
解决这个问题的关键就落在了我这个负责后台的程序猿身上。
看看文档也不是什么难事嘛,就是需要在http头中设置Access-Control-Allow-Origin来决定需要允许哪些站点来访问。关于CROS协议更详细内容参考
CROS常见header
CORS具有以下常见的header
Access-Control-Allow-Origin: http://kbiao.me
Access-Control-Max-Age: 3628800
Access-Control-Allow-Methods: GET,PUT, DELETE
Access-Control-Allow-Headers: content-type
&Access-Control-Allow-Origin&表明它允许&&&&发起跨域请求
&Access-Control-Max-Age&表明在3628800秒内,不需要再发送预检验请求,可以缓存该结果(上面的资料上我们知道CROS协议中,一个AJAX请求被分成了第一步的OPTION预检测请求和正式请求)
&Access-Control-Allow-Methods&表明它允许GET、PUT、DELETE的外域请求
&Access-Control-Allow-Headers&表明它允许跨域请求包含content-type头
当然在处理这个问题的时候前端也有不少坑,特别是Chrome浏览器不允许localhost的跨域请求,详细方案见我项目中负责前端解决方案的小伙伴。假装有链接
常规解决方案
知道了问题的原因,也知道了配套的解决办法,现在就让我们来实现解决。思路很简单,当前端要请求跨域资源时候,我们给它加上响应的响应头即可。很显然我们自己定义一个过滤器是最简单不过了。
* Created by kangb on .
@Component
public class myCORSFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) servletResponse;
String origin = (String) servletRequest.getRemoteHost()+&:&+servletRequest.getRemotePort();
response.setHeader(&Access-Control-Allow-Origin&, &*&);
response.setHeader(&Access-Control-Allow-Methods&, &POST, GET, OPTIONS, DELETE&);
response.setHeader(&Access-Control-Max-Age&, &3600&);
response.setHeader(&Access-Control-Allow-Headers&, &x-requested-with,Authorization&);
response.setHeader(&Access-Control-Allow-Credentials&,&true&);
filterChain.doFilter(servletRequest, servletResponse);
public void destroy() {
@Component 是Spring的注解,关键部分在doFilter中,添加了我们需要的头,option是预检测需要所以需要允许,Authorization是做了oauth2登录响应所必须的,Access-Control-Allow-Credentials表示允许cookies。都是根据自己项目的实际需要配置。
再配置Web.xml使得过滤器生效
·CLASS_PATH·.myeCORSFilter
接下来前端就可以像往常一样使用AJAX请求获得资源了,完全不需要做出什么改变。
SPRING 4中更优雅的办法
SpringMVC4提供了非常方便的实现跨域的方法。在requestMapping中使用注解。
@CrossOrigin(origins = “http://kbiao.me”)
全局实现 .定义类继承WebMvcConfigurerAdapter,设置跨域相关的配置
public class CorsConfigurerAdapter extends WebMvcConfigurerAdapter{
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping(&/api/*&).allowedOrigins(&*&);
将该类注入到容器中:
class=&com.tmall.wireless.angel.web.config.CorsConfigurerAdapter&
更详细的内容参考Spring 官方的hello world案例
https:///spring-guides/gs-rest-service-cors.git
作者: K_Biao&
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:36579次
排名:千里之外
原创:15篇
转载:29篇
(1)(5)(1)(3)(3)(1)(7)(1)(1)(22)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'

我要回帖

更多关于 httpwebrequest 跨域 的文章

 

随机推荐