Spring Boot 中的 JWT 跨域问题

主要问题 前后端分离后,前端使用 Ajax 进行请求,存在一些跨域的问题。 基于 Spring Boot 的后端通过给 Controlle类或其中的方法添加 @CrossOrigin 注解来解决跨域问题: @CrossOrigin @RequestMapping("/user/") public class UserController { ... } 添加该注解之后,可以通过匿名访问的接口都没有跨域问题了,而需要通过 JWT 验证的接口仍然存在跨域问题。 其中,解决问题的关键在于,浏览器会在发送 Ajax 请求之前发送一个预请求,确认当前的接口是不是有效的接口,此时的请求方式是 OPTIONS 的请求方式。 因此,JWT 的过滤器需要先判断该请求是否为预请求,如果是则需要给返回的响应头中添加跨域相关的信息;如果不是,则按照一般接口进行 JWT 验证。 public class AuthFilter extends OncePerRequestFilter { ...... @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { // 处理浏览器的预请求 if (request.getMethod().equals("OPTIONS")) { response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST,GET,PUT,OPTIONS,DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Origin,X-Requested-With,Content-Type,Accept,Authorization,token"); return; } // 验证 JWT ...... } }

June 5, 2020 · 1 min

微服务容器化系列(1):服务编排前奏

服务 Docker 化 修改项目配置 由于镜像运行时 MySQL 数据库所在的主机地址是动态的,所以将项目中的 MySQL 数据库地址和 Zookeeper 注册中心地址配置为动态变量: spring: dubbo: registry: zookeeper://${zk.address}:2181 datasource: url: jdbc:mysql://{mysql.address}:3306/cinema?autoReconnect=true&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8 获取 Java 镜像 docker pull openjdk:8-jre 打包 Maven 项目 在项目根目录下,执行 Maven 的清除和打包命令(跳过测试): mvn clean && mvn package -Dmaven.test.skip=true 这样就会在 target 目录下生成 jar 包(Spring Boot 项目)。 编写 Dockerfile 在 user 子模块的根目录下,创建 Dockerfile 文件,并编辑如下,Dockerfile 文件用于构建 Docker 镜像: FROM openjdk:8-jre MAINTAINER zjxjwxk zjxjwxk@gmail.com COPY target/user.jar /user.jar ENTRYPOINT ["java", "-jar", "/user.jar"] 构建项目 Docker 镜像 docker build -t user:latest . 编写 build 脚本 在和 Dockerfile 同一目录下,创建一个 build.sh 脚本,用于打包和构建 Docker 镜像: ...

June 4, 2020 · 6 min

Hadoop 进阶篇

概要 概述 深入探索 MapReduce 过程 Hadoop 的分布式缓存 Hadoop 应用——推荐算法 HDFS HDFS 是 Hadoop 分布式文件系统的简称,由若干台计算机组成,用于存放 PB、TB 数量级以上的文件,每份文件可以有多个副本,所以 HDFS 是一个具有高冗余、高容错的文件系统。 Hadoop Hadoop 1.x Hadoop 2.x Hadoop 1.0 到 2.0 的变化:Hadoop 2.0 以后的版本移除了原有的 JobTracker 和 TaskTracker,改由 Yarn 平台的 ResourceManager 负责集群中所有资源的统一管理和分配,NodeManager 管理 Hadoop 集群中单个计算节点。 YARN 的设计减小了 JobTracker 的资源消耗,减少了 Hadoop 1.0 中发生单点故障的风险。我们还可以在 YARN 平台上运行 Spark 和 Storm 作业,充分利用资源。 深入探索 MapReduce WordCount 实例回顾 MapReduce 作业是一种大规模数据集的并行计算的编程模型。我们可以将 HDFS 中存放的海量数据,通过 MapReduce 作业进行计算,得到目标数据。 ...

May 8, 2020 · 1 min

Hadoop 基础篇

概要 大数据技术的相关概念 Hadoop 的架构和运行机制 实战:Hadoop 的安装和配置 实战:Hadoop 的开发 目标 掌握大数据存储与处理技术的原理(理论知识) 掌握 Hadoop 的使用和开发能力(实践能力) 结合书本,如《Hadoop 权威指南》 Hadoop 的前世今生 为了解决系统存在的瓶颈:存储容量、读写速率、计算效率… Google 提出了大数据技术:MapReduce、BigTable、GFS,这三样技术取得了革命性的变化: 成本降低,能用 PC 机,就不用大型机和高端存储 软件容错硬件故障视为常态,通过软件保证可靠性 简化并行分布式计算,无须控制节点同步和数据交换 但是,Google 只发表了相关的技术论文,没有开放源代码。于是,一个模仿 Google 大数据技术的开源实现出现了:Hadoop。 Hadoop 的功能和优势 Hadoop 是开源的分布式存储和分布式计算框架。 Hadoop 的组成 包含两个核心组件: HDFS:分布式文件系统,存储海量的数据 MapReduce:并行处理框架,实现任务分解和调度 Hadoop 可以用来搭建大型数据仓库,PB 级数据的存储、处理、分析、统计等业务。如:搜索引擎、日志分析、商业智能、数据挖掘。 Hadoop 的优势 高扩展 低成本 成熟的生态圈(Hive、HBase 等) Hadoop 生态系统及版本 Hadoop 生态系统 Hive:只需要编写 SQL 语句,Hive 就能够将其转化为一个 Hadoop 任务去执行,降低了使用 Hadoop 的门槛。 HBase:和传统的关系型数据库不同,HBase 放弃事务特性,追求更高的扩展;和 HDFS 不同,HBase 提供数据的随机读写和实时访问,实现对表数据的读写功能。 ZooKeeper:用于监控 Hadoop 集群的状态,管理一些配置,维护数据间节点的一致性等。 Hadoop 版本 ver1.x较为稳定且容易上手,本人将选择 ver1.x。 ...

May 6, 2020 · 9 min

Dubbo微服务影院系列(12):系统部署

运行环境 CentOS 6 云服务器 创建用户 创建一个 cinema 用户: [root@huawei ~]# useradd cinema [root@huawei ~]# passwd cinema Changing password for user cinema. New password: BAD PASSWORD: it does not contain enough DIFFERENT characters Retype new password: passwd: all authentication tokens updated successfully. 给予其权限,首先需要赋予当前用户对 /etc/sudoers 的写权限,然后在 sudoers 文件中的 root ALL = (ALL) ALL 下增加一行,赋予其在任何地方执行任何命令的权限: chmod u+w /etc/sudoers vim sudoers ## Allow root to run any commands anywhere root ALL=(ALL) ALL cinema ALL=(ALL) ALL 最后,取消当前用户的写权限: ...

May 3, 2020 · 4 min

Terminal 终端代理加速

方法1(暂时): 在终端中直接运行命令 export http_proxy=http://proxyAddres.s:port 这个办法的好处是简单直接,并且影响面很小(只对当前终端有效,退出就不行了)。 如果你用的是 s.s 代理,在当前终端运行以下命令,那么wget curl 这类网络命令都会经过 s.s 代理,port 端口号可以从 s.s 高级设置中查看,我的是1086。 export ALL_PROXY=socks5://127.0.0.1:1086 安装完软件以后,我们再执行以下命令取消终端代理 unset ALL_PROXY 方法2(永久): 把代理服务器地址写入 shell 配置文件.bashrc或者.zshrc 直接在.bashrc或者.zshrc添加下面内容 export http_proxy="http://localhost:port" export https_proxy="http://localhost:port" 以使用 s.s 代理为例,s.s 的代理端口为1086,那么应该设置为 export http_proxy="socks5://127.0.0.1:1086" export https_proxy="socks5://127.0.0.1:1086" 或者直接设置 ALL_PROXY export ALL_PROXY=socks5://127.0.0.1:1086 localhost就是一个域名,域名默认指向 127.0.0.1,两者是一样的。 然后ESC后:wq保存文件,接着在终端中执行source ~/.bashrc 这个办法的好处是把代理服务器永久保存了,下次就可以直接用了。 或者通过设置 alias 简写来简化操作,每次要用的时候输入setproxy,不用了就unsetproxy。 alias setproxy="export ALL_PROXY=socks5://127.0.0.1:1086" alias unsetproxy="unset ALL_PROXY" Git 代理 git 设置全局代理: git config --global http.proxy 'socks5://127.0.0.1:1086' git config --global https.proxy 'socks5://127.0.0.1:1086' git 仅针对 GitHub 的单独配置: ...

April 27, 2020 · 1 min

Dubbo微服务影院系列(11):服务监控

章节概要 了解 Dubbo 监控相关内容 熟练掌握 Dubbo-admin 使用 熟练掌握链路监控 完成业务系统部署 Dubbo-monitor 源码下载和打包 目前,还可以从当当网的项目 Dubbox 中获取(很久没有维护了):https://github.com/dangdangdotcom/dubbox ,在项目中执行以下命令打包并拷贝到本地仓库(跳过单元测试): mvn package -Dmaven.test.skip=true 其中,可能会遇到 Missing artifact com.alibaba:dubbo:jar:2.8.4 的坑,需要在根项目的 pom.xml 文件中添加以下 maven 插件: 这样在本地仓库就有了 ~/.m2/repository/com/alibaba/dubbo-monitor-simple/2.8.4/dubbo-monitor-simple-2.8.4-assembly.tar.gz 这个 tar.gz 包,解压它可以得到以下文件: 启动服务监控 在 conf 文件夹下,编辑 dubbo.properties,将相关参数配置如下: dubbo.container=log4j,spring,registry,jetty dubbo.application.name=simple-monitor dubbo.application.owner= #dubbo.registry.address=multicast://224.5.6.7:1234 dubbo.registry.address=zookeeper://127.0.0.1:2181 #dubbo.registry.address=redis://127.0.0.1:6379 #dubbo.registry.address=dubbo://127.0.0.1:9090 dubbo.protocol.port=7070 dubbo.jetty.port=8090 dubbo.jetty.directory=monitor dubbo.charts.directory=monitor/charts dubbo.statistics.directory=monitor/statistics dubbo.log4j.file=monitor/dubbo-monitor-simple.log dubbo.log4j.level=WARN 然后,进入 bin 目录,运行 start.sh 就可以启动 Dubbo-Monitor 了,运行在配置好的 8090 端口(需要先打开 Zookeeper)。 启动服务提供者和消费者后,可以在 Applications 中看到如下信息: 同时,可以点击 Providers 查看服务某一服务提供者的详细信息,并且可以将其取消注册: ...

April 24, 2020 · 3 min

Dubbo微服务影院系列(10):分布式事务

章节概要 事务简介 分布式事务的前世今生 分布式事务解决方案 主流分布式事务框架介绍 事务简介 事务是用来保证一组数据操作的完整性和一致性的 事务必须满足 ACID 的四大特性 事务具有四种隔离级别 事务具有七种传播行为 事务属性 原子性(Atomicity) 一致性(Consistency) 隔离型(Isolation) 持久性(Durability) 分布式事务 概念 分布式事务就是将多个节点的事务看成一个整体处理 分布式事务由事务参与者、资源服务器、事务管理器等组成 常见的分布式事务的例子:支付、下订单等 实现思路 两段式事务和三段式事务 基于 XA 的分布式事务 基于消息的最终一致性方案 TCC 编程式补偿性事务 分布式事务类型 两段式和三段式事务 两段式事务 三段式事务 基于 XA 的分布式事务 基于消息的一致性方案 TCC 补偿性事务 基于消息的一致性方案和 TCC 补偿性事务的区别 基于消息的事务是强一致性事务,会存在浪费 TCC 事务是柔性事务,在 try 阶段要对资源做预留 TCC 事务在确认或取消阶段释放资源 与基于消息的事务对比,TCC 的时效性更好 分布式事务框架 全局事务服务(Global Transaction Service,简称 GTS) 蚂蚁金服分布式事务(Distributed Transaction-eXtended,简称 DTX) 开源 TCC 框架(TCC-Transaction)(https://github.com/changmingxie/tcc-transaction) 开源 TCC 框架(ByteTCC)(https://github.com/liuyangming/ByteTCC) TCC-Transaction 分布式事务框架 Github 仓库:https://github.com/changmingxie/tcc-transaction ...

April 17, 2020 · 7 min

PAT甲级 1108 Finding Average (20分)

The basic task is simple: given N real numbers, you are supposed to calculate their average. But what makes it complicated is that some of the input numbers might not be legal. A legal input is a real number in [−1000,1000] and is accurate up to no more than 2 decimal places. When you calculate the average, those illegal numbers must not be counted in. Input Specification: Each input file contains one test case. For each case, the first line gives a positive integer N (≤100). Then N numbers are given in the next line, separated by one space. ...

April 15, 2020 · 3 min

PAT甲级 1072 Gas Station (30分)

A gas station has to be built at such a location that the minimum distance between the station and any of the residential housing is as far away as possible. However it must guarantee that all the houses are in its service range. Now given the map of the city and several candidate locations for the gas station, you are supposed to give the best recommendation. If there are more than one solution, output the one with the smallest average distance to all the houses. If such a solution is still not unique, output the one with the smallest index number. ...

April 13, 2020 · 4 min