Java Spring项目中的CORS跨域开启的几种方式
引
在服务器端开启跨域的原理,一般都是通过在HTTP Headers中的响应头的Access-Control-Allow-Origin指定放行的域,来完成的。
Access-Control-Allow-Origin响应头指定了该响应的资源是否被允许与给定的域(origin)共享。
跨域出错,一般在浏览中会有:
'http://xxxxx' has been blocked by CORS policy: Request header field content-type is not allowed by Access-Control-Allow-Headers in preflight response.
要开启全局跨域也有很多的方式,如下:
一.添加filter开启
可以在添加filter指定共享的域
filter类
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CrossOriginFilter implements Filter {
private FilterConfig config = null;
@Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
@Override
public void destroy() {
this.config = null;
}
/**
* @comment 跨域的设置
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) response;
// 表明它允许"http://xxx"发起跨域请求
httpResponse.setHeader("Access-Control-Allow-Origin",
config.getInitParameter("AccessControlAllowOrigin"));
// 表明在xxx秒内,不需要再发送预检验请求,可以缓存该结果
httpResponse.setHeader("Access-Control-Allow-Methods",
config.getInitParameter("AccessControlAllowMethods"));
// 表明它允许xxx的外域请求
httpResponse.setHeader("Access-Control-Max-Age",
config.getInitParameter("AccessControlMaxAge"));
// 表明它允许跨域请求包含xxx头
httpResponse.setHeader("Access-Control-Allow-Headers",
config.getInitParameter("AccessControlAllowHeaders"));
chain.doFilter(request, response);
}
}
web.xml的配置中
<!-- CORS过滤器-->
<filter>
<filter-name>CrossOrigin</filter-name>
<filter-class>cn.mashirodever.blog.filter.CrossOriginFilter</filter-class>
<init-param>
<param-name>AccessControlAllowOrigin</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>AccessControlAllowMethods</param-name>
<param-value>HEAD,POST,GET,DELETE,PUT</param-value>
</init-param>
<init-param>
<param-name>AccessControlMaxAge</param-name>
<param-value>3628800</param-value>
</init-param>
<init-param>
<param-name>AccessControlAllowHeaders</param-name>
<param-value>x-requested-with</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CrossOrigin</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
二.SpringMVC中配置开启
这种方法在spring项目中支持性会比filter好些,有时用filter不行的可尝试切换到这种。有一次就是filter中配置了允许的请求方法,但是只有get能跨域,post请求就一直报cors错误。换到这种就好了
<mvc:cors>
<mvc:mapping path="/**"
allowed-origins="*"
allowed-methods="POST, GET, OPTIONS, DELETE, PUT"
allowed-headers="Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
allow-credentials="true"
max-age="3600" />
</mvc:cors>
origins中设为*就是全部域都能共享(开启跨域),这样还是不是很安全的,可以指定域:
<!-- path 是指定的地址,要多可有多个mapping -->
<!-- allowed-origins 是开启的域 -->
path="/api/**"
allowed-origins="http:xx1.com,https:xx2.com"
三.添加配置类开启
@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://domain2.com")
.allowedMethods("PUT", "DELETE")
.allowedHeaders("header1", "header2", "header3")
.exposedHeaders("header1", "header2")
.allowCredentials(false).maxAge(3600);
}
}
Java Spring项目中的CORS跨域开启的几种方式的更多相关文章
- 如何在ASP.NET Core中实现CORS跨域
注:下载本文的完整代码示例请访问 > How to enable CORS(Cross-origin resource sharing) in ASP.NET Core 如何在ASP.NET C ...
- System.Web.Http.Cors配置跨域访问的两种方式
System.Web.Http.Cors配置跨域访问的两种方式 使用System.Web.Http.Cors配置跨域访问,众多大神已经发布了很多文章,我就不在详细描述了,作为小白我只说一下自己的使用心 ...
- Spring Boot 2中对于CORS跨域访问的快速支持
原文:https://www.jianshu.com/p/840b4f83c3b5 目前的程序开发,大部分都采用前后台分离.这样一来,就都会碰到跨域资源共享CORS的问题.Spring Boot 2 ...
- Spring MVC 4.2 CORS 跨域访问
跨站 HTTP 请求(Cross-site HTTP request)是指发起请求的资源所在域不同于该请求所指向资源所在的域的 HTTP 请求.比如说,域名A(http://domaina.examp ...
- 在ASP.NET Web API中实现CORS(跨域资源共享)
默认情况下,是不允许网页从不同的域访问服务器资源的,访问遵循"同源"策略的原则. 会遇到如下的报错: XMLHttpRequest cannot load http://local ...
- 在node中通过cors跨域。
cors : 全称 cross origin resource share 跨资源共享 在nodejs 中可以通过在服务器端设置代码如下实现cors跨域 res.setHeader('Access- ...
- SpringBoot:CORS处理跨域请求的三种方式
一.跨域背景 1.1 何为跨域? Url的一般格式: 协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址 示例: https://www.dustyblog.cn:8080/say/Hel ...
- spring boot:解决cors跨域问题的两种方法(spring boot 2.3.2)
一,什么是CORS? 1,CORS(跨域资源共享)(CORS,Cross-origin resource sharing), 它是一个 W3C 标准中浏览器技术的规范, 它允许浏览器向非同一个域的服务 ...
- Vue 项目中遇到的跨域问题及解决方法
原文:https://www.jb51.net/article/137278.htm 问题描述 前端 vue 框架,跨域问题后台加这段代码 header("Access-Control-Al ...
- WEX5中ajax跨域访问的几种方式
1.使用jsonp方式 使用jsonp访问的话,前端需要把回调函数名传递给后端,后端执行完后也需要把回调函数传回给前端,默认情况下ajax自动生成一个回调函数名,后端可以通过String callba ...
随机推荐
- 记录--卸下if-else 侠的皮衣!- 策略模式
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 当我是if-else侠的时候 怕出错 给我一个功能,我总是要写很多if-else,虽然能跑,但是维护起来确实很难受,每次都要在一个方法里面 ...
- 记录--分享8个非常实用的Vue自定义指令
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在 Vue,除了核心功能默认内置的指令 ( v-model 和 v-show ),Vue 也允许注册自定义指令.它的作用价值在于当开发人员 ...
- 记录--react native 封装人脸 检测、美颜组件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本组件目前只能用在React Native 的iOS端 本组件来之实际中的开发需求:可以检测并且标记人脸,实现基本的美颜,可进行拍照.换行 ...
- 如何打造一个花里胡哨的Github个人主页?
1.介绍 2.使用 2.1.创建一个同名仓库 2.2.引用模板 2.3.为内容添加有趣模块 2.3.1.徽章badge 2.3.2.waka 时间展示 2.3.3.展示 GitHub stars 等信 ...
- vue中类tabs左右滑动
效果图 思路 给定一个变量用来记录滚动了几列,每滚动一次加1滚动一列,监听页面滚动父级元素宽度改变,重新设置滚动的距离(放在计算属性中让其自动计算) <template> <div ...
- C# OpenCvSharp MatchTemplate 多目标匹配
效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.D ...
- C++中结构体的各种用法,详细版
C++中的结构体是一种用户自定义的数据类型,可以存储不同类型的数据成员.以下是一些结构体的常见用法: 1. 定义结构体类型 结构体类型的定义可以放在函数内部或外部,例如: ``` struct Per ...
- Java实现两种队列(数组和链表)
package algorithm; /** @author Administrator @date 2022-09-13 17:50 */ public class QueueLinked{ pri ...
- Python爬取腾讯视频电影名称和链接(一)
1 import requests 2 import json 3 from bs4 import BeautifulSoup #网页解析获取数据 4 import sys 5 import re 6 ...
- Python爬虫爬取搜狐视频电影并存储到mysql数据库
数据获取方式:微信搜索关注[靠谱杨阅读人生]回复[电影].整理不易,资源付费,谢谢支持. 代码: 1 import time 2 import traceback 3 import requests ...