Spring 与 SpringBoot 配置跨域的几种方式
前言
跨域介绍
什么是跨域:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一项不同,都属于跨域造成的原因:由于浏览器的同源策略,即 A 网站只能访问 A 网站的内容,不能访问 B 网站的内容特别注意:跨域问题只存在于浏览器,也就是说当前端页面访问后端的接口时,返回值是有的,只是服务器没有在请求头指定跨域的信息,所以浏览器自动把返回值给” 屏蔽了”解决跨域:经过上面的了解,可以得出几个解决跨域的方法(这里暂不考虑前端的实现方案),一是服务端指定跨域信息,二是在 Web 页面与后端服务之间加一层服务来指定跨域信息,比如代理服务 Nginx
提示
更多关于跨域的详细介绍内容,可以看 这里。
Java 多线程编程之三 volatile 与 JMM 内存模型
大纲
- Java 多线程编程之一 Java 内存模型浅析
- Java 多线程编程之二 synchronize 锁对象竞争
- Java 多线程编程之三 volatile 与 JMM 内存模型
- Java 多线程编程之四 CAS、ABA 问题、锁
- Java 多线程编程之五 AQS 底层源码深度剖析
- Java 多线程编程之六 集合类的线程安全问题
- Java 多线程编程之七 队列、线程池、线程通信
- Java 多线程编程之八 Fork/Join 框架使用
- Java 多线程编程之九 ThreadLocal 使用
JMM 内存模型介绍
JMM 的概述
JMM 是 Java 内存模型 (Java Memory Model),本身是一种抽象的概念,实际上并不存在。它描述的是一组规则或规范,通过这组规范定义了程序中各个变量 (包括实例字段,静态字段和构成数组对象的元素) 的访问方式。
- JMM 中关于同步的规定
- 线程加锁前,必须读取主内存的最新值,并存储在自己的工作内存
- 线程解锁前,必须把共享变量的值刷新回主内存
- 加锁和解锁必须是同一把锁
由于 JVM 运行程序的实体是线程,而每个线程在创建时 JVM 都会为其创建一个工作内存 (有些地方称为栈空间),工作内存是每个线程的私有数据区域,而 Java 内存模型(JMM)中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作 (读取、赋值等) 必须在工作内存中进行,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,各个线程中的工作内存中存储着主内存中的变量副本拷贝,因此不同的线程间无法访问对方的工作内存,线程间的通信 (传值) 必须通过主内存来完成。线程、工作内存、主内存工作交互图 (基于 JMM 规范),如下:
Java 多线程编程之二 synchronize 锁对象竞争
大纲
- Java 多线程编程之一 Java 内存模型浅析
- Java 多线程编程之二 synchronize 锁对象竞争
- Java 多线程编程之三 volatile 与 JMM 内存模型
- Java 多线程编程之四 CAS、ABA 问题、锁
- Java 多线程编程之五 AQS 底层源码深度剖析
- Java 多线程编程之六 集合类的线程安全问题
- Java 多线程编程之七 队列、线程池、线程通信
- Java 多线程编程之八 Fork/Join 框架使用
- Java 多线程编程之九 ThreadLocal 使用
synchronized 的三种使用方式
- synchronized 修饰普通方法时,是实例锁(对象锁),锁住的是当前实例对象
- synchronized 修饰静态方法时,是类锁,锁住的是当前类的 Class 对象(反射)
- synchronized 同步代码块,锁住的是 synchronized 后面紧接着的小括号内的对象
特别注意
- 无论如何使用 synchronized 进行加锁,都是控制某个方法或代码块的访问,而不是控制整个类。
- synchronized 修饰普通方法与同步代码块
synchronized(this){}的效果是一样的,锁住的都是当前实例对象。 - synchronized 修饰静态方法与同步代码块
synchronized(Object.class){}的效果是一样的,锁住的都是当前类的 Class 对象。
博客导流微信公众号
前言
博客将流量导向微信公众号很简单,可以使用 TechGrow 的免费导流工具实现,用户扫码关注微信公众号后可以解锁全站文章,让微信公众号的粉丝数躺着增长。整个过程只需六步就可以搞定,适用于各类主流的博客,本文以 Hexo 的 NexT 主题博客举例。
提示
- TechGrow 开放平台的 官方文档
- 若使用的是 Hexo 静态博客,建议直接安装 hexo-readmore 插件,详细教程可点击这里
- 若使用的是 VuePress v1 静态博客,建议直接安装 vuepress-plugin-readmore-popular 插件,详细教程可点击这里
- 若使用的是 VuePress v2 静态博客,建议直接安装 vuepress-plugin-readmore-popular-next 插件,详细教程可点击这里
Vue 页面读取并展示 Markdown 文件
前言
如何在 Vue 中读取项目本地的 MarkDown 文件并展示在网页上呢?查阅资料后发现,一般的方案是在 Vue 页面中引入 Markdown 编辑器,然后利用编辑器的预览功能来展示 MarkDown 文件的内容。推荐使用开源的 MarkDown 编辑器 mavonEditor 或者 vue-meditor。
vue-meditor 介绍
简介
Docker 构建 Frp 镜像
构建 Frps 镜像
- Dockerfile 编写
1 | FROM amd64/alpine:3.10 |
Linux 移植 Windows 的 C++ 代码
conio.h 头文件
移植简述
conio.h 不是 C 标准库中的头文件,在 ISO 和 POSIX 标准中均没有定义。conio 是 Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作,比如 getch() 函数等等。大部分 DOS、Windows、Phar Lap、DOSX,OS/2 等平台上的 C 编译器提供了此头文件,UNIX 和 Linux 平台的 C 编译器本身通常不包含此头文件。另外在项目开发中,平时主要是使用 conio.h 这个头文件中的 getch() 函数,即读取键盘字符但是不显示出来(without echo),但是含有 conio.h 的代码在 Linux 下无法直接编译通过,因为 Linux 没有这个头文件。但 Linux 平台下完全可以使用 ncurses 替代 conio.h 头文件,ncurses 支持的 API 可以阅读 官方文档。值得一提的是,ncurses 在 Linux 平台实现了 getch()、scanw()、getstr() 等函数。
