二十九:application中都保存了什么东西?
1,登录用户的user对象
当前用户的一般属性,不包含关联的集合属性(为了减少session的存储量)
计算出来的用户的权限总和long[] rightSum;
当用户登录时,验证通过以后计算出来的该用户的权限,
* 如果想让用户权限的实时跟随者改变,只要在管理修改该用户的权限的时候,我们就将该用户的session给清除掉,或者将它的计算session的方法再重新执行一遍
但是我们如何在修改了用户的权限时候获得该用户的session呢?
须知session在每个访问对象中都是独立的,如果能清空了该用户的session,那么该用户需要重新登录,在操作时,特别是更新时的数据,如何保存?
* 我们可以让用户的权限在下次登录的时候生效
2,url与Right对应的map集合,主要是访问的时候,获取url的权限位和权限码,到时候去和用户中计算出来的权限总和做&运算
*如果url不是一次性添加的,而是每次点击的时候,我们添加一个url到right中,在没有修改role的情况下,这个对用户是没有影响的
如果我们给role添加了刚添加的url的right,那么用户在重新登录的时候,就会找不到application中对应的url,而我们设计的是没有url的话,我们认为该url是公共资源,这么一来所有的用户都能访问到该url,所以我们要添加过url过后,刷新application中的存放的map集合
* 如果我们删除rights表中的url后,那么用户访问了该url后,应该是在map中找不到url的,就认为是公共资源,
靠,想的太多了,只需要变化就刷新application就行了
三十:重写struts的ui标签实现细粒度的权限控制
在tomcat容器中,读取.class文件是先从用户自己写的.class中查找
而jboss中则是先查找jar包,然后再读取用户的.class文件
我们只需要将重写后的.class文件放入到jar包中就可以了
重写标签主要是重写
dostartTag
doendTag
三十一:使用spring缓存模块优化
<?xml version="1.0"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ehcache="http://www.springmodules.org/schema/ehcache" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springmodules.org/schema/ehcache http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd"> <!-- 配置ehcache缓存过期策略文件 --> <ehcache:config configLocation="classpath:ehcache.xml"/> <!-- 缓存代理 --> <ehcache:proxy id="surveyServiceCacheProxy" refId="surveyService"> <!-- 缓存数据的方法 --> <ehcache:caching methodName="get*" cacheName="surveyCache"/> <ehcache:caching methodName="load*" cacheName="surveyCache"/> <ehcache:caching methodName="find*" cacheName="surveyCache"/> <ehcache:caching methodName="is*" cacheName="surveyCache"/> <!-- 清除数据的方法 --> <ehcache:flushing methodName="save*" cacheNames="surveyCache" /> <ehcache:flushing methodName="update*" cacheNames="surveyCache" /> <ehcache:flushing methodName="delete*" cacheNames="surveyCache" /> <ehcache:flushing methodName="batch*" cacheNames="surveyCache" /> </ehcache:proxy> </beans>
ehcache.xml文件中的内容
<?xml version="1.0" encoding="utf-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /> <cache name="surveyCache" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /> </ehcache>
由于缓存代理又在spring的事务代理上加了一层,在action中导入service的时候
使用surveyServiceCacheProxy这个service,可以将代理引入进来
三十二: hibernate的缓存
内置缓存: 又叫一级缓存包含session缓存和sessionfactory缓存
特点:不能关闭,强制性的,驻留在session中,存放的是当前工作工作单元加载的对象,可以理解为是一个类中的map属性,缓存可以理解为本地的数据库(一般程序和db是分开的,需要带宽,降低网络负载和db压力),在session中的操作尽量的短(db的链接),长时间运行,也可能导致并发问题
* sessionfactory缓存: 预先生成的所有的sql语句和映射元数据,buildSessionfacotry()时生成,增删改一般直接取,除非是动态生成的sql语句
* sessionfactory中还包含了hibernate的二级缓存,本身是用hashtable实现,真正使用的时候是用第三方的二级缓存实现的,
* session中的缓存
1,增删改对象时,缓存的是持久化对象,和将要执行的sql语句
使用hql批量操作的时候,缓存的是sql语句和参数对象
2,查询,缓存的查询出来的持久化对象,并放入到快照中一份
外置缓存:二级缓存
默认是开启,可插拔的,ehcache,osCache,swarmCache ,jbossCache(分布式缓存)
三十三:数据库的锁
悲观锁: 比较悲观,不能出问题,出了问题就悲观了,在数据库中加字段(锁旗标),效率低,不过安全,不支持并发,串行化
乐观锁:支持并发,并发能解决,在数据库中加版本或者时间戳(并不一定能保证)
文章评论