使用Access-Control-Allow-Origin解决跨域

什么是跨域

当两个域具有相同的协议(如http), 相同的端口(如80),相同的host(如www.google.com),那么我们就可以认为它们是相同的域(协议,域名,端口都必须相同)。

跨域就指着协议,域名,端口不一致,出于安全考虑,跨域的资源之间是无法交互的(例如一般情况跨域的JavaScript无法交互,当然有很多解决跨域的方案)

Spring 提供了三种方式:

  1. CorsFilter 过滤器
  2. <mvc:cors> Bean
  3. @CrossOrigin 注解

这三种方式,本质上都是用来配置 CorsConfiguration。

11.1 CorsFilter

首先,依赖 CorsFilter 创建自己的过滤器:

public class MyCorsFilter extends CorsFilter {
public MyCorsFilter() {
super(configurationSource());
} private static UrlBasedCorsConfigurationSource configurationSource() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration();
config.setAllowedOrigins(Collections.singletonList("http://domain.com"));
config.setAllowCredentials(true); CorsConfiguration config2 = new CorsConfiguration();
config2.setAllowedOrigins(Collections.singletonList("http://domain.com"));
config2.setAllowCredentials(true); source.registerCorsConfiguration("/**", config);
source.registerCorsConfiguration("/xxx", config2); return source;
}
}

然后,将其注册为一个过滤器即可。

11.2 <mvc:cors>

<mvc:cors>
<mvc:mapping path="/xxx"
allowed-origins="http://localhost:7070"
allowed-methods="GET, POST"
allowed-headers="Accept-Charset, Accept, Content-Type"
allow-credentials="true" />
<mvc:mapping path="/yyy/*"
allowed-origins="*"
allowed-methods="*"
allowed-headers="*" />
</mvc:cors>

11.3 @CrossOrigin

// 将跨域设置在类上,那么所有的 mapping 都会使用这个策略
// 如果不加参数,那么将会使用配置中的默认参数
@CrossOrigin
public class CORSController {
public String cors(@RequestParam(defaultValue = "callback") String callback, HttpServletResponse response) {
// 最原始的方式,手动写请求头
response.setHeader("Access-Control-Allow-Origin", "http://192.168.163.1:8081");
return callback + "('hello')";
} // 将跨域设置在方法上
@RequestMapping("/cors")
@CrossOrigin(origins = {"http://localhost:8080", "http://remotehost:82323"},
methods = {RequestMethod.GET, RequestMethod.POST},
allowedHeaders = {"Content-Type", "skfjksdjfk"},
allowCredentials = "true",
maxAge = 1898978
)
@RequestMapping("/rrr")
public String rrr(@RequestParam(defaultValue = "callback") String callback) {
return callback + "('rrr')";
}
}

不使用注解模式:

package com.nf147.manage.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; @RestController
public class CorsConstroller {
@RequestMapping("/cors")
public String cors (@RequestParam(defaultValue = "callback") String callback, HttpServletResponse response) {
     //使用Access-Control-Allow-Origin解决跨请求
      response.setHeader("Access-Control-Allow-Origin", "http://169.---236.45:8080"); 注意这里要和本地服务器的url一致
      return callback + "('hello')";
    }
}

请求页面:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js"></script>
</head>
<body>
<button onclick="fasong()">发送</button>
</body> <script> const url = 'http://localhost:9999'; function fasong () {
fetch(url + "/cors", {
method: 'get',
}).then(resp => resp.text())
.then(console.log);
} function fasong232() {
$.ajax({
method: 'get',
url: url + "/cors",
dataType: 'jsonp',
jsonpCallback: 'hehehe',
jsonp: 'xxxxxxxxxxxxxxxxxxxxxxx'
}).done((data) => {
console.log(3333333333333333, data);
}).fail((x, y, z) => {
console.error(x, y, z);
})
} function loadScript(src) {
const script = document.createElement('script');
script.src = src;
document.body.appendChild(script);
} function fason2g() {
if (window.confirm('是否发送?')) {
loadScript(`${url}/cors?callback=aaa`);
} else {
loadScript(`${url}/rrr?callback=bbb`);
}
} function aaa(c) {
alert(c);
} function bbb(c) {
console.log(c);
} function fasong2() {
if (window.confirm('是否发送?')) {
$.ajax({
method: 'get',
url: url
}).done((data) => {
console.log(data);
}).fail((x, y, z) => {
console.error(x, y, z);
})
}
}
</script> </html>

我这里是用node搭建了一个本地服务器

教程地址:https://www.cnblogs.com/nongzihong/p/10021033.html

效果演示:

java跨越请求实例的更多相关文章

  1. java HttpURLConnection 请求实例

    package app.works; import org.json.JSONObject; import java.io.BufferedReader; import java.io.InputSt ...

  2. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  3. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  4. JAVA上百实例源码网站

    JAVA源码包1JAVA源码包2JAVA源码包3JAVA源码包4 JAVA开源包1 JAVA开源包2 JAVA开源包3 JAVA开源包4 JAVA开源包5 JAVA开源包6 JAVA开源包7 JAVA ...

  5. Ajax跨越请求失败,解决

    跨越请求 1.1什么是跨域(两个不同系统之间的访问.调用) (1)域名不同,即两个不同的应用. (2)域名相同,但是端口不同,即同一个应用中的不同子系统. 1.2 Ajax跨域请求的缺陷 (1)创建t ...

  6. Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序

    先看一道Java面试题: public class Baset { private String baseName = "base"; // 构造方法 public Baset() ...

  7. Java HTTP请求

    注意:java  http请求要放在 try catch里面,该过程是一个阻塞过程,所以需要新建一个线程进行处理 try { HttpPost request = new HttpPost(URL); ...

  8. 主题:Java WebService 简单实例

    链接地址:主题:Java WebService 简单实例    http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...

  9. Jmeter 参数化请求实例

    Jmeter 参数化请求实例 在jmeter中的请求可以参数化,其中参数化的方式有4种: 1.CSV Data Set Config 2.数据库 3.用户自定义变量 4.用jmeter中的函数获取参数 ...

随机推荐

  1. day 15 模块 相对导入

    自定义模块: 什么是模块:本质就是.py文件,封装语句的最小单位. 自定义模块:实际上就是定义.py,其中可以包含:变量定义,可执行语句,for循环,函数定义等等,他们统称模块的成员. 模块的运行方式 ...

  2. Leaving Auction CodeForces - 749D (set,贪心,模拟)

    大意: 若干个人参加拍卖会, 给定每个人出价顺序, 保证价格递增, q个询问, 给出k个人的编号, 求删除这k个人的所有出价后, 最终谁赢, 他最少出价多少. set维护每个人最后一次投票的时间, 每 ...

  3. 部署SonarQube代码检测服务并结合Jenkins使用

    一.SonarQube部署前的内核参数等配置以及java环境配置 1. 修改内核参数配置,使满足环境要求 [root@sonarqube ~]# vim /etc/sysctl.conf vm.max ...

  4. sql server 获取整数的函数ceiling(x)和floor(x)

    --ceiling(x)返回不小于x的最小整数值,floor(x)返回不大于x的最大整数值 示例:select CEILING(-3.35), CEILING(3.35), FLOOR(-3.35), ...

  5. npm学习(四)之如何安装全局包、更新全局安装的包、卸载全局安装的包

    如何安装全局包 有两种方式用来安装 npm 包:本地安装和全局安装.选用哪种方式来安装,取决于你如何使用这个包. 如果你想将其作为一个命令行工具,那么你应该将其安装到全局.这种安装方式后可以让你在任何 ...

  6. python gRPC简单示例

    Ubuntu18.04安装gRPC protobuf-compiler-grpc安装 sudo apt-get install protobuf-compiler-grpc protobuf-comp ...

  7. 爬虫获取网页数据,报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start by

    https://blog.csdn.net/hj_xy_0705/article/details/85011072

  8. CSS3 transform 属性 旋转 div 元素

    div { transform:rotate(7deg); -ms-transform:rotate(7deg); /* IE 9 */ -moz-transform:rotate(7deg); /* ...

  9. Codeforces 990 调和级数路灯贪心暴力 DFS生成树两子树差调水 GCD树连通块暴力

    A 水题 /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace ...

  10. python打开文件的方式

    r 以只读模式打开文件 w   以只写模式打开文件,文件若存在,首先要清空,然后(重新创建) a    以追加模式打开(从EOF开始,必要时创建新文件),把所有要写入文件的数据追加到文件的末尾,即使使 ...