spring之springsecurity
spring security 的作用spring security 框架提供了 认证, 授权和常见攻击防御等功能, 其中认证保支持命令式和响应式(reactive)方式。
spring security 架构spring security 对 servlet的支持是基于 servlet filter的. 下图描述了单个HTTP请求的处理程序的典型分层。
FilterChain客户端发送请求给应用时,容器会创建 filterchain 实例 其中包含 filter 实例 和 servlet。其中 servlet 基于请求 URI 处理 httpservletrequest。 在spring mvc 中, servlet是dispatchServlet实例。 servlet 负责处理单个 httpservletrequest 和 httpservletresponse。上图中的每一个filter都提供如下功能。
防止下游的 filter 或者 servlet 被调用。此时 filter 会 写 httpservletrequest。
修改 httpservletrequest 和 ht ...
juc之synchronized、Lock和volatile
问题
为什么 synchronized 编译后 存在一个 monitorenter 和两个 monitorExit?
什么是 happens-before ?
引言,描述 为什么会有并发问题?可见性、有序性、原子性?
本篇将讲述 java 中的并发关键字: synchronized 、 volidate 、 final
在构造器上添加 synchronized 无意义且会报错,因为线程调用构造器创建对象需要权限。
synchronizedsynchronized 如何保障线程安全?12345678910package com.example.securityPlus.juc;public class SynchronizedDemo2 { Object object = new Object(); public void method1() { synchronized (object) { } }}
执行 javac 编译得到 class 文件。再使用 javap -c xx. ...
java之注解
引言
什么是注解?有哪些必要知识?
内置注解?
元注解?
注解的使用场景
注意事项
java.lang.annotation.Annotation中有说明:这是所有注解类型必须继承的公共接口。
以java中提供的@Override注解为例,一个由Override标识的方法声明意为着它将重写父类中中的方法声明。
1234@Target(ElementType.METHOD)@Retention(RetentionPolicy.SOURCE)public @interface Override {}
等价于
1public interface Override extends Annotation{}
元注解什么是元注解?『它是用于修饰注解的注解,通常用在注解的定义上。例如上面Override注解上的@Target和@Retention。java 5中定义了如下四种元注解:
@Target: 定义了注解的作用目标
@Retention:定义注解的生命周期
@Documented: 注解是否应当被保留在JavaDoc中
@Inherited ...
java之异常机制
异常什么是异常?异常是指程序运行过程中出现的错误,一旦错误产生就会创建异常对象,我们需要处理这些异常对象。
异常的体系结构java中,异常对象均派生自Throwable类,java 异常的体系结构如下
Throwable有两个子类,分别为为 Error(错误) 和 Exception(异常)
Error: 表示程序中无法处理的错误,表示运行应用程序中出现了严重的错误。此类错误一般表示代码运行时JVM出现问题。当此类错误发生时,应用不应该去处理此类错误。常见的错误有:Virtual MachineError(虚拟机运行错误)、NoClassDefFoundError(类定义错误)、OutOfMemoryError。此类错误发生时,JVM将终止线程。非代码性错误。
Exception:是程序本身可以捕获并且可以处理的异常。其中可分为运行时异常(RuntimeException)和非运行时异常,也叫做受检异常
运行时异常(不受检异常): RuntimeException类及其子类表示JVM在运行期间可能出现的错误。编译器不会检查此类异常,并且不要求处理异常,比如用空值对象的引用(NullP ...
java之反射
java反射首先要知道RTTI(run-time type identification),即运行时类型识别,用于在运行时识别一个对象的类型和类信息。不同于编译期间就能确定的对象类型及类信息,java反射允许开发者在运行时发现和使用类的信息。在运行时,通过类的全限定名,可以构造出制定对象,可以调用该对象的任意属性和方法。java的反射机制主要提供以下功能:
运行时判断任意一个对象所属的类
运行时构造任意一个类对象
在运行时判断任意一个类所具有的成员变量和方法
在运行时调用任意一个对象的方法
反射基础在开始讲述java反射之前,先来看一下Class类。
1. Class 类Class 类位于java.lang中。该类的实例表示java应用运行时的类或者接口。运行时每个类对象在jvm里的表示都是一个Class对象。可以通过类名.class、类型.getClass、Class.forName('类全限定名')等方法获取Class对象。另外数组也被映射为class对象的一个类,所有具有相同元素类型和维度的数组都共享该class对象。基本类型boolean、byte、char ...
java之SPI
java类的生命周期和加载过程java类加载机制和类加载器java之双亲委派机制
SPI什么是SPI服务提供接口(SPI,Service Provider Interface) 是 JDK 内置的一种「服务提供发现机制」,是 Java 提供的一套用来被第三方实现或者扩展的 API,它可以用来启用框架扩展和替换组件(可通过 SPI 机制实现模块化)。SPI 的整体机制图如下:
由服务的提供者提供接口的具体实现,然后在classpath下的META-INF/services目录下创建一个以服务接口命名的文件,文件中的内容则是 服务提供者实现累的全限定类名。 其他服务需要使用时,通过查找这个jar包的META-INF/services中的配置文件,根据文件中的具体实现类名,加载该类并实例化。JDK中默认的查找服务所使用的的工具类是java.util.ServiceLoader。
如何使用SPI先来看一个例子,项目结构如下:
定义接口定义接口: mqray.learn.cn.service.Search
123public interface Search { Li ...
java之双亲委派机制
什么是双亲委派机制jvm对class文件采用的是按需加载的方式,当需要该类时才会将它的class文件加载到内存中。加载时采用的是双亲委派机制,即将请求交给父类处理的任务委派模式。双亲委派机制的原理图如下:
双亲委派机制的原理
类加载器收到类加载请求,先检查是否有父类加载器,若有,则将请求委托给父类加载器加载。
如果父类还有父类,则继续向上委托,直至 引导/启动类加载器 Bootstrap ClassLoader。
如果父加载器可以完成加载,则返回成功结果。否则,由子类自行加载。如果子类加载失败则会抛出ClassNotFoundException。加过过程图解如下:对应源码如下:123456789101112131415161718192021222324252627282930313233343536373839404142public abstract class ClassLoader { protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoun ...
docker之初探
编写dockerfile12345678910111213141516171819202122#1.指定基础镜像,并且必须是第一条指令FROM centos:7#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录WORKDIR /usr/java/openjdk-11/bin#4.一个复制命令,把jdk安装文件复制到镜像中,语法:ADD <src>... <dest>,注意:jdk*.tar.gz使用的是相对路径ADD openlogic-openjdk-11.0.21+9-linux-x64.tar.gz /usr/java/openjdk-11/bin#5.设置时区RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeRUN echo 'Asia/Shanghai' >/etc/timezone#6.配置环境变量ENV JAVA_HOME=/usr/java/openjdk-11/bin/openlogic-openjdk-11 ...
java之jvm日志分析及参数解释
k8s 服务质量 和 jvm参数的关系
本文使用的jdk版本为 jdk11
在Java 8及以上版本中,元空间被分配在非堆中的方法区中。因此,元空间和非堆之间的关系是,元空间是非堆中的一个子区域,用于存储类元数据。同时,非堆中还包括其他的内存区域,如方法区、虚拟机栈、本地方法栈等。
jvm配置查看所有JVM配置的默认值1java -XX:+PrintFlagsFinal -version
默认堆大小
-verbose:gc -XX:+PrintGCDetails -Xlog:gc*:stdout:time -XX:+UseConcMarkSweepGC-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof
1-verbose:gc -XX:+PrintGCDetails -Xlog:gc*:stdout:time
查看jvm使用的配置 *java -XX:+PrintCommandLineFlags -version
1234567-XX:Initi ...
java类加载机制和类加载器
什么是类加载机制编译器将java源码编译为字节码后,虚拟机将字节码读入内存进行解析、运行的过程,称之为java虚拟机的类加载机制。类加载机制中,使用类加载器完成类的加载过程。类的生命周期在上文中详细描述过,这里不赘述。详见Java类加载过程详解
什么是类加载器?通过一个类全限定名称来获取其二进制文件(.class)流的工具,被称为类加载器(classloader)
类加载器的分类java支持如下四种类加载器
启动类/引导类加载器 Bootstrap ClassLoader 由C/C++实现,嵌套在JVM内部,java程序无法直接操作此类。通过它来加载java核心类库。如JAVA_HOME/jre/lib/rt.jar、resources.jar、sun.boot.class.path路径下的包,为jvm运行提供所需要的包。 它并非继承自java.lang.ClassLoader,没有父类加载器。它负责加载扩展类加载器和应用程序类加载器,并成为其父类加载器。 处于安全考虑,启动类只加载包名为java|javax|sun开头的类。
扩展类加载器 Extensi ...