Shiro入门

学习目标 认识 Shiro 的整体架构,各组件的概念 Shiro 认证,授权的过程 Shiro 自定义的 Realm,Filter Shiro Session 管理 Shiro 缓存管理 Shiro 集成 Spring Shiro 简介 Apache 的强大灵活的开源安全框架 认证、授权、企业会话管理、安全加密 Shiro 与 Spring Security 比较 Shiro 简单、灵活 可脱离 Spring 粒度较粗 Spring Security 复杂、笨重 不可脱离 Spring 粒度更细 Shiro 整体架构 Shiro 认证和授权 认证过程 创建 SecurityManager -> 主体提交认证 -> SecurityManager 认证 -> Authenticator 认证 -> Realm 验证 授权过程 创建 SecurityManager -> 主体提交授权 -> SecurityManager 授权 -> Authorizer 授权 -> Realm 获取角色权限数据 测试代码如下(这里先使用 SimpleAccountRealm 作为 Realm): ...

March 19, 2021 · 8 min

以太坊私有链搭建

1. 以太坊开发环境搭建 1.1 配置以太坊环境 1.1.1 安装 Go 环境 可在 Go 官网 https://golang.org/dl/ 直接下载相应操作系统的安装包,本人使用 MacOS 系统,故点击如下按钮下载: 根据其提示信息进行安装,无需配置环境变量,在终端中输入 go version ,若出现如下版本信息则 Go 环境安装成功。 1.1.2 安装 Node.js、NPM 由于 Node.js 的安装包已经包含了 NPM,故只需下载最新稳定版本的 Node.js 安装包即可。 同样根据提示安装,无需配置环境变量,在终端中输入 node -v 和 npm -v ,若分别出现如下 Node.js 和 NPM 的版本信息,则安装成功。 1.1.3 安装以太坊 Ethereum 由于本人使用 MacOS 系统,故使用 brew 安装,在终端中输入 brew install ethereum 即可安装。安装完成后,若输入 geth version 出现如下版本信息,则 Ethereum 安装成功。 ...

November 3, 2020 · 2 min

自己编译OpenJDK 8

想要一探 JDK 内部的实现机制,最便捷的捷径之一就是自己编译一套 JDK,通过阅读和跟踪调试 JDK 源码去了解 Java 技术体系的原理。本人选择了 OpenJDK 进行编译。 由于在编译 OpenJDK 7 时出现了如下不知如何解决的问题: llvm-gcc -m64 -m64 -L`pwd` -framework CoreFoundation -o gamma launcher/java_md.o launcher/java.o launcher/jli_util.o launcher/wildcard.o -ljvm -lm -pthread Undefined symbols for architecture x86_64: "_JNI_CreateJavaVM", referenced from: _LoadJavaVM in java_md.o "_JNI_GetDefaultJavaVMInitArgs", referenced from: _LoadJavaVM in java_md.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[8]: *** [gamma] Error 1 make[7]: *** [the_vm] Error 2 make[6]: *** [product] Error 2 make[5]: *** [generic_build2] Error 2 make[4]: *** [product] Error 2 make[3]: *** [all_product_universal] Error 2 make[2]: *** [universal_product] Error 2 make[1]: *** [hotspot-build] Error 2 make: *** [build_product_image] Error 2 个人猜想是由于我 Mac OS 系统版本太高的问题(Catalina 10.15.5),XCode 版本也是最新的 11.6。 ...

July 16, 2020 · 4 min

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