项目导入
zip包下载或git下载(zip下载不带git)
IDEA setting 设置代理(阿里代理)
jar下载目录更换默认目录
不能识别项目(选中pom.xml 右键 )
打包成jar包或wav包
从代码生成角度看项目结构(订单 order)
生成的html文件在WEB-INF对应的模块下(webapp/WEB-INF/view/order)
生成的js文件static目录下(webapp/static/modular/order/)
bean 在modular/system/modle/Order
数据操作 xml 及接口在 modular/system/dao/mapping 及上一级目录
接口的实现类modular/order/service
control(被html调用的增删改查)类 在modular/order/controller
-
结论
数据库映射方式采用的mybatis xml方式配置(还有一种是注解)
git远程header怎么移动?TODO
用的是mybatis-plus (中国人搞的 baomidou)
shiro 权限
Shiro如何获得输入的用户信息:(前后端关系 TODO)
Shiro如何验证用户名密码是否正确:ShiroRealm继承AuthorizingRealm 覆写doGetAuthenticationInfo方法,传入的AuthenticationToken包含用户名和密码,根据用户名查询数据库中完整用户的信息
如何知道该用户是否有相应的权限进行操作:(1).从数据库读取存储权限:同上覆写doGetAuthorizationInfo,在里面根据用户信息包含的role_id,连表sys_relation 和sys_menu通过menu_id查询出对应的用户拥有权限的url,放入集合。(2)如何判断是否拥有权限:通过Permission注解AOP拦截(Shiro自带有一个),在AOP里面进行判断
session管理:分为单机环境和多机环境,多机环境需要redis进行存储(TODO进一步博客)
cache缓存管理:EhCache,读取xml配置,通过注解@Cache(TODO 进一步博客)
记住我CookieRememberMeManager
-
代码编写ShiroConfig(配置); ShiroRealm(封装与数据库连接细节) ;GunsUserFilter(缓存等过期设置);
扩展阅读https://www.imooc.com/article/3369(session和cookie异同)
日志系统
1\. 获取时机: 对方法进行BussinessLog注解 ,通过AOP拦截
2\. 如何保存旧值:日志进行修改或编辑时要保存旧值,在跳转的时候进行值的临时保存(LogObjectHolder)
3\. 如何获取: LogObjectHolder拿的对象,反射获取属性,进行循环,在循环里拦截http请求参数,进行比较(如果碰到一些不好直观看的的值,例如性别标识,F;M表示男,F表示女,则通过字典进行查询)
日志分类:登录登出日志;业务日志;异常日志
核心技术点:1.AOP;2.保存旧值;3.把无意义的字段值映射成可读性强的值;异常统一处理(@ControllerAdvice 异常日志)
分页
MyBatis-Plus里面分装好了limit物理分页 Page注解拦截识别
物理分页(limit 数量比较大的情况)
逻辑分页(全部查询,然后进行分页识别)
缓存
用在经常使用,以及key和value每次查询的时候不变
经常用到的有Echace 和Redis
-
注解:
Cacheable : 如果有先取出缓存(select)
CachePut :放入缓存(save)
CacheEvict :删除缓存(update或delete)
Caching:
-
注解参数
Cacheable,CachePut :value,缓存名称;key缓存键值 Condition SpEL (方法之前),Usless SpEL(方法之后)
CaheEvict: value;key;Condition SpEL;等
缓存本地xml配置
-
常用的SPEL表达式
args
caches
target
targetClass
method
methodName
result
代码生成器
MyBatis数据拦截器(在不修改查询语句的情况下进行拦截查询。eg.部门查看范围,只能允许查看自己部门或者子部门的数据)
DataScope 数据范围(sql参数)
DataScopeInterceptor拦截
jwt
由服务器产生,当客户端拥有,即拥有了服务器访问的权限
-
组成:
header+payload+signature
header
-
过程:
服务端根据用户名密码,生成jwt和key返回给客户端
客户端把jwt 放入header的Authorization字段里(前面加Bearer ),然后对要传输的数据进行base64加密,最后加上key进行md5加密,形成sign前面,形如({“object”:”base64(objectJson)”,”sign”:”md5(objectJson+key)"})
-
几个关键类说明
IRequestValidator:验证身份(比如用户名,密码,验证码等)
AuthCotroller:RequestMapping,对请求进行验证,返回token和randomKey两个字段的json
-
AuthFilter:对客户端请求的jwt token进行验证过滤
- 拿出herader的Bearer字段,根据jwt判断token是否过期
-
WithSignMessageConverter:对数据进行校验,判断数据有没有被篡改
取出header Authorization字段,根据该字段拿到key
取出object字段,并和key md5计算,得到本应该的sign
和传过来的sign进行比较,如果相等数据没有被篡改,不相等,即数据被篡改了
DataSecurityAction:对数据进行加密(一方面是不可读,另外一方面是保证json字段顺序变化也认为数据篡改)
JwtTokenUtil:jwt常用的工具类
代码组成
WebConfig(注解Configuration和xml配置相似,相当于导出,可以通过@Autowired),关联AuthFilter和DataSecurity
事务
-
事务的四大特性
原子性:要不全部完成,要不全部失败
一致性:一旦全部完成或者失败。确保业务处于一致的状态(和原子性相似,着重的是状态)
隔离性:有多个事务处理同样的数据,每个事务都应该和其他事务隔离开
持久性:事务本地持久化,无论发生什么样的系统错误,都可以恢复回来
-
隔离性详解
脏读:读取未提交的数据
不可重复读:一个事务多次查询返回的结果不一致
幻读:一个事务批量修改表的所有数据,这时候另一个事务往表里增加了一条记录,导致第一个事务修改之后落了一条,就像是产生幻觉一样。
-
隔离级别
Serialozable(串行化)都不会发生
Repeatable Read(可重复读)默认,幻读可能发生
Read Commited(读已提交)脏读不会发生
Read uncommitted(读未提交)不能保证
-
传播行为(一个事务调用另外一个事务,须指定事务应该如何传播)
REOPAGATION_REQUIRED:
REOPAGATION_SUPPORTS:
REOPAGATION_MANDATORY:
REOPAGATION_REUQIRES_NEW:
REOPAGATION_SUPPORTED:
REOPAGATION_NERVER:
REOPAGATION_NESTED: