CORS 是一个 W3C 标准,全称叫做"跨域资源共享"(Cross-Origin resource sharing); 在详细介绍 CORS 之前先简单介绍下什么是同源政策,这样才能了解到 CORS 的由来|必要性。

浏览器同源政策

"同源政策"是浏览器安全的基石,目前所有浏览器都实行这个政策。

含义

所谓"同源",是指以下三个相同:

  • 协议相同
  • 域名相同
  • 端口相同

举个例子:

当前网址被请求页面地址是否跨域(不同源)原因
http://www.wu-yikun.top/page.htmlhttp://www.wu-yikun.top/main.html同协议(http)、同域名(www.wu-yikun.top)、同端口(80
http://www.wu-yikun.top/page.htmlhttps://www.wu-yikun.top/other.html协议不同(httphttps
http://www.wu-yikun.top/page.htmlhttp://www.wu-yikun.com/page.html域名不同(www.wu-yikun.topwww.wu-yikun.com
http://www.wu-yikun.top/page.htmlhttp://www.wu-yikun.top:8090/other.html端口不同(80 与 8090)

现在再来看这副图,是不是一目了然了?

目的

节选自"阮一峰"老师的文章

同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。

设想这样一种情况:A 网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取 A 网站的 Cookie,会发生什么?

很显然,如果 Cookie 包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。

由此可见,"同源政策"是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。

限制

随着互联网的发展,同源政策越来越严格。如果非同源,以下几种行为会受到限制。

  • CookieLocalStorageIndexDB 无法读取
  • DOM 无法获取
  • AJAX 请求无法发送

光是一个 AJAX 请求无法发送就可以遏制不少合理的用途了。

接下来介绍如何实现跨域资源共享以避免同源政策。

CORS 详解

简介

CORS 需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,在 CORS 通信过程中,浏览器会自动完成,无需用户参与,所以要想实现 CORS 通信,关键是使得服务器支持 CORS 接口,便可跨源通信。

CORS 两类请求

浏览器将 CORS 请求分为两类:简单请求非简单请求

简单请求

只要同时满足以下两大条件,就属于简单请求:

  • 请求方法是以下三种类型之一
    • HEAD
    • GET
    • POST
  • HTTP 头信息不超出以下几种字段
    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type: 只限于 application/x-www-form-urlencodedmultipart/form-datatext/plain 三者之一

凡是不同时满足以上两个条件的就属于非简单请求。

如下就是一个 CORS 简单请求:

以下是浏览器发送给服务器的请求报文:

GET /resources/public-data/ HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Connection: keep-alive
Origin: https://foo.example

请求首部字段 Origin 表明该请求来源于 http://foo.example,再看看响应报文:

HTTP/1.1 200 OK
Date: Mon, 01 Dec 2021 00:23:53 GMT
Server: Apache/2
Access-Control-Allow-Origin: *
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/xml[XML Data]

本例中,服务端返回的 Access-Control-Allow-Origin: * 表明该资源可以被任意外域访问。

Access-Control-Allow-Origin: *

使用 Origin 和 Access-Control-Allow-Origin 就能完成最简单的访问控制。如果服务端仅允许来自 https://foo.example 的访问,该首部字段的内容如下:

Access-Control-Allow-Origin: https://foo.example

非简单请求

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是 PUTDELETE,或者 Content-Type 字段类型是 application/json

非简单请求的 CORS 请求的一大特点,就是会在正式通信前增加一次 HTTP 查询请求,称为"预检"请求(Preflight request)。该"预检"请求的方法为 OPTIONS,"预检"请求的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。

如下是一个需要执行预检请求的 HTTP 请求:

如下所述,实际的 POST 请求不会携带 Access-Control-Request-* 首部,它们仅仅适用于 OPTIONS 请求。

下面是服务端和客户端完整的信息交互。

首先是预检请求

OPTIONS /doc HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Connection: keep-alive
Origin: https://foo.example
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type

浏览器检测到,从 JavaScript 中发起的请求需要被预检。从上面的报文中,我们看到,第 1~10 行发送了一个使用 OPTIONS 方法 的“预检请求”。OPTIONS 是 HTTP/1.1 协议中定义的方法,用以从服务器获取更多信息。该方法不会对服务器资源产生影响。 预检请求中同时携带了下面两个首部字段:

  • Access-Control-Request-Method: POST
  • Access-Control-Request-Headers: X-PINGOTHER, Content-Type

首部字段 Access-Control-Request-Method 告知服务器,实际请求将使用 POST 方法。

首部字段 Access-Control-Request-Headers 告知服务器,实际请求将携带两个自定义请求首部字段:X-PINGOTHERContent-Type

服务器据此决定,该实际请求是否被允许。

预检响应

HTTP/1.1 204 No Content
Date: Mon, 01 Dec 2021 01:15:39 GMT
Server: Apache/2
Access-Control-Allow-Origin: https://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
Access-Control-Max-Age: 86400
Vary: Accept-Encoding, Origin
Keep-Alive: timeout=2, max=100
Connection: Keep-Alive

(1)服务器的响应携带了 Access-Control-Allow-Origin: https://foo.example,从而限制请求的源域。

(2)同时,携带的 Access-Control-Allow-Methods 表明服务器允许客户端使用 POSTGET 方法发起请求(与 Allow 响应首部类似,但其具有严格的访问控制)。

(3)首部字段 Access-Control-Allow-Headers 表明服务器允许请求中携带字段 X-PINGOTHERContent-Type。如果浏览器请求包括Access-Control-Request-Headers字段,则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串,表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。

(4)最后,首部字段 Access-Control-Max-Age 表明该响应的有效时间为 86400 秒,也就是 24 小时。在有效时间内,浏览器无须为同一请求再次发起预检请求。请注意,浏览器自身维护了一个 最大有效时间,如果该首部字段的值超过了最大有效时间,将不会生效。

预检请求完成之后,发送实际请求

POST /doc HTTP/1.1
Host: bar.other
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:71.0) Gecko/20100101 Firefox/71.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Connection: keep-alive
X-PINGOTHER: pingpong
Content-Type: text/xml; charset=UTF-8
Referer: https://foo.example/examples/preflightInvocation.html
Content-Length: 55
Origin: https://foo.example
Pragma: no-cache
Cache-Control: no-cache

实际响应报文

HTTP/1.1 200 OK
Date: Mon, 01 Dec 2021 01:15:40 GMT
Server: Apache/2
Access-Control-Allow-Origin: https://foo.example
Vary: Accept-Encoding, Origin
Content-Encoding: gzip
Content-Length: 235
Keep-Alive: timeout=2, max=99
Connection: Keep-Alive
Content-Type: text/plain

上面头信息中,Access-Control-Allow-Origin 字段是每次响应都必须包含的。

Spring Boot 解决跨域问题

讲了这么多,来点实际场景感受一下。

是不是觉得有种某名的"亲切感"?以下我们就来解决这种无力感吧。

通过 Filter 过滤器手动设置响应头

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@Component
@Slf4j
@WebFilter(urlPatterns = {"/*"}, filterName = "corsFilter")
public class CorsFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("启动跨域过滤器");}@Overridepublic void doFilter(ServletRequest request, ServletResponse resp, FilterChain chain) throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) resp;// 手动设置响应头解决跨域访问response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");// 设置过期时间response.setHeader("Access-Control-Max-Age", "86400");response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization, uuid");// 支持 HTTP 1.1response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");// 支持 HTTP 1.0. response.setHeader("Expires", "0");response.setHeader("Pragma", "no-cache");// 编码response.setCharacterEncoding("UTF-8");chain.doFilter(request, resp);}@Overridepublic void destroy() {log.info("销毁跨域过滤器");}
}

使用 @CrossOrigin 注解(局部跨域)

@CrossOrigin 注解源码:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {@AliasFor("origins")String[] value() default {};@AliasFor("value")String[] origins() default {};String[] allowedHeaders() default {};String[] exposedHeaders() default {};RequestMethod[] methods() default {};String allowCredentials() default "";long maxAge() default -1L;
}

使用 @CrossOrigin 注解:

@CrossOrigin(origins = "*", allowedHeaders = "*", maxAge = 86400)
@PostMapping("/login")
public String login(@RequestBody User user) {TODO..
}

不过通过 @CrossOrigin 注解的源代码注定了它只能针对单个接口进行跨域配置,即局部跨域。虽然它比如上的 Filter 过滤器更简便,但这明显不是我们想要的,实际开发中也很少使用该注解。

实现 WebMvcConfigurer 接口

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")// 表明允许哪些域访问, 简单点可为 *.allowedOrigins("http://localhost:3000").allowedHeaders("*").allowedMethods("*")// allowCredentials(true): 表示附带身份凭证// 一旦使用 allowCredentials(true) 方法,则 allowedOrigins("*") 需要指明特定的域,而不能是 *.allowCredentials(true).maxAge(86400);}
}

以上这种方式在没有定义拦截器(Interceptor)的时候,使用起来一切正常,但如果你有一个全局的拦截器,比如检测用户登录的拦截器:

public class AuthenticationInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {// 从 http 请求头中取出 tokenString token = httpServletRequest.getHeader("token");// 检查是否登录if (token == null) {throw new InvalidTokenException(ResultCode.INVALID_TOKEN.getCode(), "登录信息已过期,请重新登录");}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

当自定义拦截器返回 true 时,一切正常,但是当拦截器抛出异常(或者返回 false)时,后续的 CORS 配置将不会生效。

为什么拦截器抛出异常 CORS 不生效呢?可以看看 GitHub 上提出的这个 issue:

when interceptor preHandler throw exception, the cors is broken #9595

大致内容如下:

有人提交了一个 issue,说明如果在自定义拦截器的 preHandler 方法中抛出异常的话,通过 CorsRegistry 设置的全局 CORS 配置就失效了,但是 Spring Boot 的成员不认为这是一个 BUG🐛。

然后提交者举了个具体的例子:

他先定义了 CorsRegistry,并添加了一个自定义的拦截器,拦截器中抛出异常:

然后发现 AbstractHandlerMapping 在添加 CorsInterceptor 的时候,是将 Cors 的拦截器加在拦截器链的最后:

那就会造成上面所说的问题:在自定义拦截器中抛出异常之后,CorsInterceptor 拦截器就没有机会执行向 response 中设置 CORS 相关响应头。

issuer 也给出了解决的方案,就是将用来处理 CORS 的拦截器 CorsInterceptor 夹在拦截器链的第一个位置:

这样的话,一旦请求来了之后,第一个拦截器就会为 response 设置相应的 CORS 响应头(例如: Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers),后续如果其他自定义拦截器抛出异常,也不会有任何影响了!

感觉这是一个可行的解决方案,但是 Spring Boot 的成员认为这并不是 Spring Boot 的 Bug,而是 Spring Framework 的 Bug,所有将这个 issue 关闭了。

注入 CorsFilter 过滤器

使用过滤器就可以避免拦截器全局跨域配置冲突问题。代码如下:

@Configuration
public class CorsFilterConfiguration {@Beanpublic CorsFilter corsFilter() {// 创建 CorsConfiguration 对象后添加配置CorsConfiguration corsConfiguration = new CorsConfiguration();// 设置放行哪些原始域corsConfiguration.addAllowedOrigin("*");// 放行哪些原始请求头部信息corsConfiguration.addAllowedHeader("*");// 放行哪些请求方法corsConfiguration.addAllowedMethod("*");// 添加映射路径UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", corsConfiguration);return new CorsFilter(source);}}

⭐为什么过滤器可以避免冲突而拦截器不行呢?

因为过滤器依赖于 Servlet 容器,基于函数回调,它可以对几乎所有请求进行过滤。而拦截器是依赖于 Web 框架(如 Spring MVC 框架),基于反射通过 AOP 的方式实现的。

触发顺序如下所示:

因为过滤器在触发上是先于拦截器的,但是如果有多个过滤器的话,也需要将 CorsFilter 设置为第一个过滤器才行。

解决 CORS 跨域的其他角度|思路

服务端支持 CORS

🤨你在期待什么?

刚刚所讲的 [Spring Boot 解决跨域问题](#Spring Boot 解决跨域问题) 就是在阐述如何在服务端实现 CORS 跨域资源共享。

以上四种方法亲测有效!如有疑问,评论区见

😉若你使用 Spring 框架而非 Spring Boot,我也找到了一篇官方文档供你们参考:CORS support in Spring Framework

JSONP

利用 <script> 标签没有跨域限制的漏洞,网页跨域得到从其他来源动态产生的 JSON 数据。JSONP 请求一定需要对方的服务器做支持才可以。

注:有三个标签本身就允许跨域加载资源。

  • <img src="xxx">
  • <link href="xxx">
  • <script src="xxx">

JSONP 与 AJAX 相同,都是客户端向服务器发送请求,从服务器端获取数据的方式。但 AJAX 属于同源策略,JSONP 属于非同源策略(支持跨域请求)。

优点:简单、兼容性好,可用于解决主流浏览器的跨域数据访问的问题。

缺点:仅支持 GET 方法,具有局限性,不安全可能会遭受 XSS 攻击。

反向代理服务器

同源策略是浏览器需要遵守的标准,而如果是服务器向服务器请求则无需遵循同源策略了。所以通过反向代理服务器就可以有效地解决跨域问题了,代理服务器需要做如下几件事:

  1. 接受客户端请求
  2. 将请求转发给实际的服务器
  3. 将服务器的响应结果返回给客户端

Nginx 就是类似的反向代理服务器,跨域通过配置 Nginx 代理来解决跨域问题。

Reference

  • developer.mozilla.org/zh-CN/docs/…
  • www.cnblogs.com/lenve/p/105…
  • www.ruanyifeng.com/blog/2016/0…
  • juejin.cn/post/700057…
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. PCIE详解

    本博客整理自网络&#xff0c;仅供学习参考&#xff0c;如有侵权&#xff0c;联系删除。邮箱&#xff1a;rom100163.com。 原文链接&#xff1a;[转]老男孩读pcie - yimuxi - 博客园 一.从PCIe速度说起 PCIe发展到现在&#xff0c;从PCIe 1.0&#xff0c;PCIe 2.0&#xff0c…...

    2024/4/28 2:24:33
  2. 《IDEA Plugin 开发手册》• 小傅哥.pdf | 4章12节,完稿发版

    作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 一、前言 &#x1f4a5;为什么&#xff1f;写写快乐的热门文章不好吗&#xff01; 从开始准备成体系的编写 IDEA Plugin 知识内…...

    2024/4/28 13:13:33
  3. 微信小程序源码获取方式

    1.登录微信&#xff0c;从微信访问小程序之后会在微信文件目录生成微信小程序的加密包&#xff08;C:\Users\Administrator\Documents\WeChat Files\Applet&#xff09;&#xff0c;路径可右键微信中的图片获取 2.解密工具 https://pan.baidu.com/s/1OEp0_CSdXYYSZzQIc4Pshw 提…...

    2024/4/27 22:38:42
  4. LeetCode Day7【数据结构】有效的数独,矩阵置零

    LeetCode Day7【数据结构】有效的数独,矩阵置零36 Valid Sudoku有效的数独73 Set Matrix Zeroes矩阵置零36 Valid Sudoku有效的数独 题目 暴力循环找重复&#xff0c;按照题目要求的三个条件一个个找&#xff0c;代码&#xff1a; class Solution {public boolean isValidSud…...

    2024/4/28 7:13:12
  5. 服务拆分及远程调用

    服务拆分及远程调用 服务拆分 服务拆分注意事项&#xff1a; 单一职责&#xff1a;不同微服务&#xff0c;不要重复开发相同业务数据独立&#xff1a;不要访问其它微服务的数据库面向服务&#xff1a;将自己的业务暴露为接口&#xff0c;供其它微服务调用 远程调用 步骤一 注…...

    2024/4/28 6:06:38
  6. Hadoop生态圈(十四)- HDFS小文件解决方案

    目录前言1. Hadoop Archive归档1.1 创建Archive1.2 查看Archive1.2.1 查看归档之后的样子1.2.2 查看归档之前的样子1.3 提取Archive1.4 Archive使用注意事项2. Sequence File2.1 Sequence File介绍2.2 Sequence File优缺点2.3 Sequence File格式2.3.1 未压缩格式2.3.2 基于reco…...

    2024/4/27 22:34:12
  7. C语言二:C常量、整数常量、浮点常量、字符常量、转义序列、字符串常量、定义常量、C存储类(auto、register、static、extern)

    C常量 常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据类型&#xff0c;比如整数常量、浮点常量、字符常量&#xff0c;或字符串字面值&#xff0c;也有枚举常量。 常量就像是常规的变量&#xff0c;只不…...

    2024/4/14 21:40:07
  8. 服务器安全管理

    服务器安全分为内部和外部安全。 外部的话是来防入侵、防cc、ddos攻击&#xff0c;内部的话是防木马病毒的执行。自安全策略、补丁、弱口令安全检测、防病毒、资源监控、文件目录保护、定期杀毒这些都是服务安全所包含的范畴。 深信达MCK主机加固系统&#xff0c;构建独立的身…...

    2024/4/14 6:30:56
  9. [PyQt5】一个小软件的制作过程02 | 页面跳转

    【PyQt5】一个小软件的制作01 | Qt Designer设计界面 本软件界面功能的实现主要是基于pycharm完成的&#xff0c;其中包括页面的跳转、各按钮功能实现、获得页面填写内容、显示图片、查找信息、删除信息等等。这一篇主要讲的是页面跳转&#xff0c;其余功能会在后续文章中记录。…...

    2024/4/23 13:54:50
  10. 绿色环保:实现智能手机可持续发展-德勤(附下载)

    导读&#xff1a;作为全球最受欢迎的消费电子设备&#xff0c;智能手机有望在2022年迎来45亿用户。据预测&#xff0c;2022年二氧化碳总当量的83%将来自14亿台新智能手机的生产、运输和首年使用。和其它行业一样&#xff0c;智能手机行业实现脱碳目标通常要求企业改变经商方式。…...

    2024/4/20 12:14:31
  11. 关于结构体的内容

    关于结构体的内容 结构体使用类似于C语言的语法来定义 结构体使用struct关键字声明。结构体内的成员可以是任何数据类型&#xff0c;包括用户自定义类型和其他的结构体类型。 struct{int a,b; //32位变量opcode_t opcode;//用户定义类型logic [23:0] adress;//24位变量bit er…...

    2024/4/14 6:30:51
  12. Google IO 2018开发者大会:Android P,金三银四旗开得胜

    从google IO开发者大会上来看&#xff0c;Android带来的第一个特性就是——电池的优化 Adaptive Battery 在Android P中&#xff0c;Adaptive Battery&#xff08;自适应电池&#xff09;&#xff0c;该功能可以通过人工智能技术监控用户的电量消耗情况&#xff0c;减少应用程…...

    2024/4/19 16:13:06
  13. NXP S32K146 FLEXI2C底层驱动+IAM-20680(一)

    IAM-20680 概述&#xff1a; IAM-20680是一个用于汽车应用的6轴运动跟踪设备&#xff0c;它将一个3轴陀螺仪和一个3轴加速度计结合在一个小型3x3x0.75mm(16针LGA)包中。它还具有一个512字节的FIFO&#xff0c;可以降低串行总线接口上的流量&#xff0c;然后进入低功耗模式&…...

    2024/4/14 6:31:11
  14. 区块链游戏开发工作室 区块链游戏开发时间

    ​splinterlands区块链游戏开发&#xff0c;upland区块链游戏开发&#xff0c;CryptoBlades区块链游戏开发&#xff0c;SecondLive区块链游戏开发&#xff0c;PROSPECTORS区块链游戏开发&#xff0c;Office Land区块链游戏开发&#xff0c;Farmers World区块链游戏开发&#xf…...

    2024/4/26 12:20:01
  15. 《Python编程从入门到实践》袁国忠 译 P1~P200学习笔记

    《Python编程从入门到实践》袁国忠 译 P1~P200 学习笔记 《Python编程从入门到实践》袁国忠 译 P1~P200之前两天在学习时做的笔记总结&#xff0c;在这里也记录一下&#xff0c;方便以后查阅&#xff0c;同时也希望能帮助到更多的童鞋&#xff01; 一、基本数据类型的运算 pri…...

    2024/4/21 5:12:29
  16. PowerMock集成单元测试

    目录 一、什么是Mock? 二、为什么使用PowerMock&#xff1f; 三、PowerMock的常用注解及常用方法 四、如何使用PowerMock进行单元测试&#xff1f; 一、什么是Mock? mock是在测试过程中&#xff0c;对于一些不容易构造/获取的对象&#xff0c;创建一个mock对象来模拟对象…...

    2024/4/16 14:12:49
  17. 新年新气象 给你的banner换个皮肤吧

    PK创意闹新春&#xff0c;我正在参加「春节创意投稿大赛」&#xff0c;详情请看&#xff1a;春节创意投稿大赛 新年新气象&#xff0c;别光顾着打扮自己&#xff0c;也要打扮下自己吃饭的家伙SpringBoot的banner 你在SpringBoot服务每次启动的时候是不是都能看到下面输出的日…...

    2024/4/26 6:27:27
  18. 商科Assignment内容分析

    在英国学习的小伙伴们&#xff0c;平时要面对各式各样的Assignment头都大了&#xff0c;就不要说商科领域的Assignment难度系数更高&#xff0c;很多小伙伴们碰上商科领域的Assignment&#xff0c;大概脚趾抠地&#xff0c;头发都抓没了吧&#xff1f; 那英国商科Assignment到底…...

    2024/4/14 6:31:11
  19. jQuery 分页kkpager

    github参考地址&#xff1a;https://github.com/pgkk/kkpager 需要在GitHub上下载文件引入css&#xff0c;js <link href"./pagesrc/kkpager_orange.css" rel"stylesheet" /> <script src"./pagesrc/kkpager.js"></script>其…...

    2024/4/14 6:31:06
  20. 企业建站公司必须要了解的几个注意事项

    术业有专攻&#xff0c;专业的事情肯定是要交给专业的人去做&#xff0c;就拿网站建设来说&#xff0c;大部分企业是没有网站建设团队&#xff0c;当他们对网站有需求时&#xff0c;肯定是要去网上找一家专业网站建设公司&#xff0c;委托他们帮企业建设网站。不过呀你在网站建…...

    2024/4/20 5:28:38

最新文章

  1. 专栏目录【政安晨的机器学习笔记】

    目录 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本篇是作者政安晨的专栏《政安晨的机器学习笔记》的…...

    2024/4/28 22:23:14
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 大数据学习十三天(hadhoop基础2)

    一: MapReduce概述(了解) MapReduce是hadoop三大组件之一,是分布式计算组件 Map阶段 : 将数据拆分到不同的服务器后执行Maptask任务,得到一个中间结果 Reduce阶段 : 将Maptask执行的结果进行汇总,按照Reducetask的计算 规则获得一个唯一的结果 我们在MapReduce计算框架的使用过…...

    2024/4/27 22:50:25
  4. 【C++】map set 底层刨析

    文章目录 1. 红黑树的迭代器2. 改造红黑树3. map 的模拟实现4. set 的模拟实现 在 C STL 库中&#xff0c;map 与 set 的底层为红黑树&#xff0c;那么在不写冗余代码的情况下使用红黑树同时实现 map 与 set 便是本文的重点。 1. 红黑树的迭代器 迭代器的好处是可以方便遍历&…...

    2024/4/25 6:15:29
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/28 13:52:11
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/28 13:51:37
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/28 15:57:13
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57