24-06-25

Mybatis的工作原理

  1. 获取SQL Session Factory对象
    解析文件的每个消息保存ziaConfiguration中,返回包含Configuration的DefaultSqlSession
  2. 获取SqlSession对象
    返回一个DefaultSqlSession对象,包括Executor和Configuartion,会创建Executor对象
  3. 获取mapper接口的代理对象
    getMapper,使用MapperProxyFactory创建一个MapperProxy的代理对象,代理对象里包含DefaultsqlSession(Executor)
  4. 执行增删改方法
    (1)调用DefalutSqlSession的增删改查(Execuot)
    (2)创建一个StatementHandler对象
    (3)调用StatementHnadler预编译参数以及设置参数值
    (4)调用StatemantHandler的增删改查方法
    (5)ResultHnadler封装结果

Mybatis 中#和$的区别?

#相当于对数据加上双引号,$相当于直接显示数据

  1. #将传入数据都当成一个字符串,会对自动加入的数据加上一个双引号,例如 order by #user#,如果传入的值是111,那么解析成sql时的值为order by "111"如果传入值是id,则解析成sql为order by "id"
  2. $将传入的数据直接显示生成在sql中,如 order by $user_id$,如果是111,那么解析成order by user_id,如果传入的值是id,则解析成order by id
  3. #方式能够很大程度防止sql注入
  4. $方式无法防止sql注入
  5. $方式一般用于传入数据库对象,例如传入表名
  6. 一般能用#,尽量别用$

使用 MyBatis 的 mapper 接口调用时有哪些要求?

  1. Mapper接口方法名和mapper.xml中定义的每个sql的id相同
  2. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql的parameterType的类型相同
  3. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
  4. Mapper.xml文件中namespace即是mapper接口的类路径

Mybatis 中一级缓存与二级缓存?

  1. 一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空
  2. 二级缓存和一级缓存机制相同,默认采用PerpetualCache,HashMap存储,不同在于存储作用域为Mapper(namespace),并且可自定义存储源,如Ehcache。作用域为namespace是指该namespace对应的配置文件中所有的select操作结果都缓存,这样不同线程之间就可以共用二级缓存。启动二级缓存:在mapper配置文件中
  3. 二级缓存可以设置返回缓存对象策略:.当readOnly=“true”时,表示二级缓存返回时给所有调用者同一个缓存对象实例,调用者使用update获取缓存实例,但这会造成其他调用者出现数据不一致情况。当为false时返回给调用者是二级缓存的拷贝,即不同调用者获取缓存对象不同的实例。这样调用者对各自缓存对象的修改不会影响到其他调用者,即是安全的,默认是false
  4. 对于缓存数据更新机制,当某个作用域进行C/U/D操作后,默认该作用域下所有select中的缓存将被clear

简单介绍一下Shiro 框架

Apache Shiro是Java的安全框架。使用shiro可以非常容易的开发出足够好的应用,其不仅可以用在javase,也可以在javaee环境。Shiro可以帮助完成:认证,授权,加密,会话管理与web集成,缓存等

三个核心组件:Subject,SecurityManager,Realms

  1. Subject:即“当前操作用户”。但在Shiro中,Subject不仅仅指人,也可以是第三方,进程,后台账户或者类似事物,它仅仅意味着“当前跟软件交互的东西”,但考虑大多数目的和用途,认为它是Shiro“用户”概念
  2. SecurityManager:Subject代表当前用户的安全操作,SecurityManager则管理所有用户的安全操作。它是Shiro框架的核心,经典Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务
  3. Realm:Realm充分充当了Shiro与应用安全数据间的桥梁或者连接器,也就是说,当对用户执行认证和授权验证时,Shiro会从应用配置的Realm中查找用户及其权限信息

Shiro 主要的四个组件

  1. SecurityManager:经典的Facade,Shiro通过它对外提供安全管理的各种服务
  2. Authenticator:对身份进行核查。通常涉及用户名和密码,这个组件负责收集principals和credentials,并将它们提交给应用系统。如果提交的credentoals与系统中国吻合,就继续访问,否则重新提交,或者直接终止访问
  3. Authorizer:身份验证通过,由这个组件对登录人员进程访问控制筛查。Shiro采用基于Realm的方法,即用户,用户组,角色和permission的聚合体
  4. SessionManager:这个组件保证异构客户端的访问,配置简单。它是基于POJO/J2SE,不跟任何客户端或者协议绑定

Shiro 运行原理

  1. Application Code:应用程序代码,如果在程序中要进行权限控制,需要调用Subject的API
  2. Subject主体:代表当前用户。所有的Subject都会绑定SecurityManager,与Subject的所有交互都会委托给SecurityManager,Subject当成一个门面,而真正执行的是security Manager
  3. SecurityManager:安全管理器,所有安全有关的操作都会与SecurityManager交互,并且它管理所有的Subject
  4. Realm:域Shiro是从Realm来获取安全数据(用户,角色,权限)。就是说SecurityManager要认证用户身份,它需要从Realm获取相应用户进行比较以确定用户身份是否合法以及确认是否可以进行操作。可以把Realm看作DataSource,即安全数据源

Shiro 的四种权限控制方式

  1. url级别权限控制
  2. 方法注解权限控制
  3. 代码级别权限控制
  4. 页面标签权限控制

授权实现的流程
(1)什么是粗颗粒和细颗粒权限
 对资源类型的管理称为粗颗粒度权限控制,即只简单控制到菜单,按钮,方法,粗粒度例子:用户具有用户管理的权限,具有导出订单明细的权限。对资源实例的控制称为细颗粒度权限控制,即控制到数据级别的权限,比如只允许修改本部门的员工信息
  粗颗粒权限:针对URL链接的控制
  细颗粒权限:针对数据级别的控制
(2)粗粒度和细粒度任何授权?
对于粗颗粒度的授权可以很容易做系统架构级别的功能,即系统功能能操作使用统一的粗颗粒度的权限管理
对于细颗粒度的授权不建议做成系统架构级别的功能,意味对数据级别是系统的业务需求,随着业务需求的变更业务功能的可能性很大,建议对数据级别的权限控制在业务级别个性化开发
  粗粒度权限:可以使用过滤器统一拦截url
  细颗粒度:在service中控制,在程序级别来构造,个性化编程

posted on 2024-06-25 16:30  强K  阅读(5)  评论(0编辑  收藏  举报