跨域问题

域名A(http://www.a.com)的 Web 应用程序中,
通过标签引入了域名B(http://ww.b.com)站点的某图片资源(http://www.b.com/image.jpg),
域名A的 Web 应用就会导致浏览器发起一个跨域 HTTP 请求。 同源策略:
不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。
一个请求地址里面的协议、域名和端口号都相同,就属于同源。 不允许跨域访问的网站无法跨域访问(由于同源策略)。

CORS(Cross-Origin Resource Sharing)解决跨域请求问题

CORS基本思想:
使用自定义的HTTP请求头使浏览器和服务器相互了解对方,从而决定请求或响应成功与否。 CORS分为简单请求和非简单请求(需预检请求)两类: 简单请求 请求方式使用下列方法之一:
GET
HEAD
POST HTTP的头信息不超出以下几种字段
1. Accept
2. Accept-Language
3. Content-Language
4. Last-Event-ID
5. Content-Type 的值仅限于下列三者之一:
text/plain
multipart/form-data
application/x-www-form-urlencoded 对于简单请求,浏览器会直接发送CORS请求
请求头字段header中加入:origin
响应头字段header中加入:
Access-Control-Allow-Origin:可跨域的源
Access-Control-Allow-Credentials:是否允许用户发送、处理 cookie(可选) 非简单请求(除了简单请求,其他都是非简单请求) 使用了下面任一 HTTP 方法:
PUT
DELETE
CONNECT
OPTIONS
TRACE
PATCH Content-Type 的值不属于下列之一:
application/x-www-form-urlencoded
multipart/form-data
text/plain 浏览器会先发送预检请求(不会携带Cookie和传递的参数),发送一次Preflight Request,接收一个Preflight Response。
预检请求判断是否允许跨域访问后,才决定是否发送真正的请求。 非简单请求会在头部多返回以下字:
请求头:origin
响应头:
Access-Control-Allow-Origin:可跨域的资源路径
Access-Control-Allow-Methods:服务端支持的请求方法
Access-Control-Allow-Headers:服务器允许使用的字段
Access-Control-Allow-Credentials:是否允许用户发送、处理 cookie
Access-Control-Max-Age:预检请求的有效期,单位为秒。有效期内,不会重复发送预检请求

Spring Boot CORS 实现

局部:
Controller类上使用(对该类所有方法有效):@CrossOrigin
Controller方法上使用:@CrossOrigin 全局:
使用配置类实现 方法1. 添加一个配置类 @Configuration
public class CorsConfig extends WebMvcConfigurerAdapter { @Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") //允许跨域访问的路径
.allowedOrigins("*") //允许跨域访问的资源路径
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE") //允许请求方法
.allowedHeaders("Content-Type", "ADMIN-Authorization") //
.maxAge(3600) //预检间隔时间
.allowCredentials(true); //是否允许发送cookie
}
} 方法2. 添加一个过滤器 public class CorsFilter extends GenericFilterBean { @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response; /** 设置自定义头 */
httpServletResponse.setHeader("Access-Control-Allow-Origin", httpServletRequest.getHeader(HttpHeaders.ORIGIN));
httpServletResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, ADMIN-Authorization");
httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
httpServletResponse.setHeader("Access-Control-Max-Age", "3600"); //非预检请求,给予通过(预检请求直接返回响应头)
if (!CorsUtils.isPreFlightRequest(httpServletRequest)) {
chain.doFilter(httpServletRequest, httpServletResponse);
}
}
} @Configuration
public class HaloConfiguration {
@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
FilterRegistrationBean<CorsFilter> corsFilter = new FilterRegistrationBean<>();
//设置优先级
corsFilter.setOrder(Ordered.HIGHEST_PRECEDENCE);
corsFilter.setFilter(new CorsFilter());
corsFilter.addUrlPatterns("/api/*");
return corsFilter;
}
}

Halo(九)的更多相关文章

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. 谈谈一些有趣的CSS题目(九)-- 巧妙的实现 CSS 斜线

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  3. CRL快速开发框架系列教程九(导入/导出数据)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  4. Python(九)Tornado web 框架

    一.简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...

  5. 我的MYSQL学习心得(九) 索引

    我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  6. 【Oracle 集群】Linux下Oracle RAC集群搭建之基本测试与使用(九)

    Oracle 11G RAC数据库安装(九) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总 ...

  7. Jsp的九大对象,七大动作,三大指令

    jsp九大内置对象:1>out 向客户端输出数据,字节流.如out.print(" dgaweyr"); 2>request 接收客户端的http请求.String g ...

  8. 今天我们来认识一下JSP的九大内置对象

    虽然现在基本上我们都是使用SpringMVC+AJAX进行开发了Java Web了,但是还是很有必要了解一下JSP的九大内置对象的.像request.response.session这些对象,即便使用 ...

  9. 浅谈UML的概念和模型之UML九种图

    1.用例图(use case diagrams) [概念]描述用户需求,从用户的角度描述系统的功能 [描述方式]椭圆表示某个用例:人形符号表示角色 [目的]帮组开发团队以一种可视化的方式理解系统的功能 ...

随机推荐

  1. Gradle查看Project中的所有 Task

    查看Project中所有的Task:$ gradle tasks 查看Project中所有的properties:$ gradle properties 如: 参照了: https://www.jia ...

  2. mybatis缓存机制(转)

    缓存在互联网系统中是非常重要的, 其主要作用是将数据保存到内存中, 当用户查询数据 时, 优先从缓存容器中获取数据,而不是频繁地从数据库中查询数据,从而提高查询性能.目 前流行的缓存服务器有Mongo ...

  3. 《图解设计模式》读书笔记4-2 STRATEGY模式

    目录 示例程序 角色 想法 Strategy模式即策略模式,在编程中,策略指的就是算法.利用此模式可以整体替换算法,即使用不同方式解决同一个问题.比如设计一个围棋程序,通过切换算法可以方便地切换AI的 ...

  4. Docker 官网文档翻译汇总

    官方文档地址 Guide Docker 入门 Docker 入门教程 方向和设置 容器 服务 swarm 集群 stack 部署应用 概述 用 Docker 进行开发 在 Docker 上开发应用 应 ...

  5. 聊聊redis的监控工具

    序 本文主要研究一下redis的监控工具 redis-stat redis-stat是一个比较有名的redis指标可视化的监控工具,采用ruby开发,基于redis的info命令来统计,不影响redi ...

  6. Python笔记(十六)_else语句、with语句

    else的多种用法 1.try except + else:检测到代码无异常,才执行else 例如: def func(num): count=num//2 while count>1: if ...

  7. ELK日志分析系统之logstash7.x最新版安装与配置

    2 .Logstash的简介 2.1 logstash 介绍 LogStash由JRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上.不同于分离的代 ...

  8. Ubuntu TTy字体

    目的:修改tty终端下的字体大小,中文显示,字体美观问题 Linux版本:xubuntu14.04 当切换到tty终端模式式,中文乱码,且字体太小,影响阅读.在网上搜了一些资料,将问题及解决方案记录如 ...

  9. knn算法手写字识别案例

    import pandas as pd import numpy as np import matplotlib.pyplot as plt import os from sklearn.neighb ...

  10. Neo4j elk Elasticsearch kibana kettle

    图形数据库,用于查找犯罪或者啥的很好用:反欺诈 win安装neo4j使用查询https://www.cnblogs.com/rubinorth/p/5853204.html linux下安装neo4j ...