发表于: 2019-11-16 18:54:58
1 1196
今天做了什么
Shiro
历史:
In 2003, there weren’t many general-purpose security alternatives for Java application developers - we were pretty much stuck with the Java Authentication and Authorization Service, otherwise known as JAAS. There were a lot of shortcomings with JAAS - while its authentication capabilities were somewhat tolerable, the authorization aspects were obtuse and frustrating to use. Also, JAAS was heavily tied to Virtual Machine-level security concerns, for example, determining if a class should be allowed to be loaded in the JVM. As an application developer, I cared more about what an application end-user could do rather than what my code could do inside the JVM.
So looking at the security landscape of early 2003, you can quickly realize that there was nothing that could satisfy all of those requirements in a single, cohesive framework. Because of that, JSecurity, and then later, Apache Shiro, was born.
简介:
Shiro是一个功能强大且易于使用的Java安全框架,提供了认证,授权,加密,和会话管理
如同spring security 一样都是一个权限安全框架,但是与Spring Security相比,在于他使用了和比较简洁易懂的认证和授权方式。
三大核心组件:
Subject:即当前用户,在权限管理的应用程序里往往需要知道谁能够操作什么,谁拥有操作该程序的权利,shiro中则需要通过Subject来提供基础的当前用户信息,Subject 不仅仅代表具体某个用户,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。类似于一个门面.
包含两个信息:
Principals: 身份,可以是用户名,邮件,手机号码等等,只要能用来标识一个登陆主体身份的东西都可以
Credentials: 凭证(比如你说你叫张三,你凭什么说叫张三,你这个时候会拿出身份证说你就是叫张三,这个凭证和身份证差不多),常见有密码,数字证书等等
SecurityManager:即所有Subject的管理者,这是Shiro框架的核心组件,可以把他看做是一个Shiro框架的全局管理组件,用于调度各种Shiro框架的服务。类比于MVC中的前端控制器.
Realms:Realms则是用户的信息认证器和用户的权限认证器, A Realm acts as the ‘bridge’ or ‘connector’ between Shiro and your application’s security data.我们需要自己来实现Realms来自定义的管理我们自己系统内部的权限规则。 In this sense a Realm is essentially a security-specific DAO: it encapsulates connection details for data sources and makes the associated data available to Shiro as needed.
主要功能:
分别是认证,授权,加密和会话管理.
Shiro provides the application security API to perform the following aspects (I like to call these the 4 cornerstones of application security):
Authentication - proving user identity, often called user ‘login’.
Authorization - access control
Cryptography - protecting or hiding data from prying eyes
Session Management - per-user time-sensitive state
收获
数据库设计
阶段:
1.需求分析
2.概念结构设计
行为,实体,关系,规则
3.逻辑结构设计
4.物理结构设计
两种存储引擎
一般情况下,InnoDB都是正确的选择,除非说需要用到些InnoDB不具备的特性,优先选择InNoDD。对于一个数据库来说,一般都是选择性地使用InnoDB和MyISAM。
在需要用到事务处理和崩溃恢复方面,那必定是选择InnoDB,那什么时候考虑使用MyISAM呢,在可以不考虑事务处理,对于崩溃恢复的代价可以承受的,需要更好的读操作,那么应该选择MyISAM,总做周知的是MyISAM在读的性能比InnoDB更快,如一些配置文件,就可以考虑使用MyISAM。
注意事项:
避免null
选择合理数据类型
分库分表:
水平分库
以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。提高了系统的绝对并发量. 但还没有明显的业务归属来垂直分库。
垂直分库
以表为依据,按照业务归属不同,将不同的表拆分到不同的库中. 系统绝对并发量上来了,并且可以抽象出单独的业务模块。
水平分表
以字段为依据,按照一定策略(hash、range等),将一个表中的数据拆分到多个表中。
单表的数据量少了,单次SQL执行效率高,自然减轻了CPU的负担。
垂直分表
以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。
垂直分表的拆分原则是将热点数据(可能会冗余经常一起查询的数据)放在一起作为主表,非热点数据放在一起作为扩展表。这样更多的热点数据就能被缓存下来,进而减少了随机读IO。拆了之后,要想获得全部数据就需要关联两个表来取数据 。但记住,千万别用join,因为join不仅会增加CPU负担并且会讲两个表耦合在一起(必须在一个数据库实例上)。关联数据,应该在业务Service层做文章,分别获取主表和扩展表数据然后用关联字段关联得到全部数据。
JVM
JVM内存模型是什么?分成了几个区?各自的作用和意义是什么,如果让你来设计,你会对Java的内存模型做哪种优化?
程序计数器
当前线程所执行的字节码的行号指示器。分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
虚拟机栈
虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。
动画是由一帧一帧图片连续切换结果的结果而产生的,其实虚拟机的运行和动画也类似,每个在虚拟机中运行的程序也是由许多的帧的切换产生的结果,只是这些帧里面存放的是方法的局部变量,操作数栈,动态链接,方法返回地址和一些额外的附加信息组成。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
本地方法栈
与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native 方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如Sun HotSpot 虚拟机)直接就把本地方法栈和虚拟机栈合二为一。
Java堆
堆是Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。但是随着JIT 编译器的发展与逃逸分析技术的逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么“绝对”了。
如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java 堆中还可以细分为:新生代和老年代;
新生代:程序新创建的对象都是从新生代分配内存,新生代由Eden Space和两块相同大小的Survivor Space(通常又称S0和S1或From和To)构成,可通过-Xmn参数来指定新生代的大小,也可以通过-XX:SurvivorRation来调整Eden Space及SurvivorSpace的大小。
老年代:用于存放经过多次新生代GC仍然存活的对象,例如缓存对象,新建的对象也有可能直接进入老年代,主要有两种情况:1、大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。2、大的数组对象,且数组中无引用外部对象。
方法区
方法区在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存逻辑区中。类型信息是由类加载器在类加载时从类文件中提取出来的。类(静态)变量也存储在方法区中。
简单说方法区用来存储类型的元数据信息,一个.class文件是类被java虚拟机使用之前的表现形式,一旦这个类要被使用,java虚拟机就会对其进行装载、连接(验证、准备、解析)和初始化。而装载(后的结果就是由.class文件转变为方法区中的一段特定的数据结构。这个数据结构会存储如下信息:
类型信息,方法信息,字段信息,其他信息.
类变量被类的所有实例共享,即使没有类实例时你也可以访问它。这些变量只与类相关,所以在方法区中,它们成为类数据在逻辑上的一部分。在JVM使用一个类之前,它必须在方法区中为每个non-final类变量分配空间。
方法区主要有以下几个特点:
1、方法区是线程安全的。由于所有的线程都共享方法区,所以,方法区里的数据访问必须被设计成线程安全的。例如,假如同时有两个线程都企图访问方法区中的同一个类,而这个类还没有被装入JVM,那么只允许一个线程去装载它,而其它线程必须等待
2、方法区的大小不必是固定的,JVM可根据应用需要动态调整。同时,方法区也不一定是连续的,方法区可以在一个堆(甚至是JVM自己的堆)中自由分配。
3、方法区也可被垃圾收集,当某个类不在被使用(不可触及)时,JVM将卸载这个类,进行垃圾收集
问题
明天计划
继续学习Java虚拟机.
评论