Shiro的学习 (8)

jsp中允许自定义标签,所以可以根据需求 自定义一些shiro标签。

8.5.1 定义标签类 public class MyAllRoleTag extends RoleTag { // jsp中使用:<xxx:xx/> private String name;//存储传入的角色参数 @Override public String getName() { return name; } @Override public void setName(String name) { this.name = name; } @Override protected boolean showTagBody(String name) { System.out.println("验证角色:"+name); String[] roles = name.split(","); Subject subject = getSubject(); for(String role:roles) { if(!subject.hasRole(role)){ return false; } } return true; } } 8.5.2 定义tld文件

要放在WEB-INF目录下,名称任意

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.1.2</tlib-version> <jsp-version>1.2</jsp-version> <short-name>zhj</short-name> <uri></uri> <description>Apache Shiro JSP Tag Library.</description> <tag> <!-- 标签名 <zhj:hasAllRoles .../> --> <name>hasAllRoles</name> <!-- 自定义Tag类路径 --> <tag-class>com.zhj.tag.MyAllRoleTag</tag-class> <body-content>JSP</body-content> <description>Displays body content only if the current Subject (user) 'has' (implies) all the specified roles </description> <!-- 自定义Tag中属性名:name <zhj:hasAllRoles/> --> <attribute> <name>name</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib> 8.5.3 使用 <%@ taglib prefix="zhj" uri="http://zhj.apache.org/tags" %> <!-- tld中定义的标签名:hasAllRoles, 向Tag类中传递参数:“seller,manager” --> <zhj:hasAllRoles> 有所有的角色2:manager,seller </zhj:hasAllRoles> 九、Session管理

shiro作为一款安全管理框架,对状态保持有很强的需要。

比如最常用的用户认证,就必需状态的保持,以及其他的一些功能实现的需要。

【shiro需要:认证中的 记住我中的用户名 正式登陆的用户名】【 开发者需要:其他功能中需要存入session的值 】

shiro提供了一整套session管理方案.

1. shiro的session方案和任何容器无关(如servlet容器);

2. javaSE也可以使用;相关组件都是pojo对ioc极其友好(方便的管理对象和满足依赖关系,定制参数)

3. 可以方便的扩展定制存储位置(内存,缓存,数据库等)

4. 对web透明支持:用了shiro的session后,项目中关于session的代码完全不用任何改动

5. 提供了全面的session监听机制,和session检测机制,对session可以细粒度操作

即,使用了shiro后,采用shiro的session方案是最优的方案。

9.1 配置 <!-- 会话Cookie模板 默认可省--> <bean> <!-- cookie的 key="sid" --> <property value="JSESSIONID"/> <!-- 只允许http请求访问cookie --> <property value="true"/> <!-- cookie过期时间,-1:存活一个会话 ,单位:秒 ,默认为-1--> <property value="-1"/> </bean> <bean> <property ref="sessionDAO"/> <!-- 默认为true,代表用cookie存储session的id --> <property value="true"/> <!-- 默认值和配置中给出的一致,所bean:sessionIdCookie 可以省略 --> <property ref="sessionIdCookie"/> <!-- session全局超时时间, 单位:毫秒 ,30分钟 默认值为1800000--> <property value="1800000"/> </bean> <!-- 将sessionManager关联到SecurityManager --> <bean> ... <!-- 增加配置sessionManager --> <property ref="sessionManager"/> </bean> 9.2 Session监听

session有三个核心过程:创建、过期、停止

过期:session的默认过期时间为30分钟。通过比对最近一次使用时间和当前使用时间判断

​ session不会自动报告过期,需检测器检测时,或再次访问时,才可以识别是否过期并移除。

停止:用户主动logout;主动调用session.stop(); 两种情况会将session标志为停止状态。

// 定义监听类 exentends SessionListenerAdapter public class MySessionListener extends SessionListenerAdapter{ //当有session创建时 触发 @Override public void onStart(Session session) { System.out.println("session:"+session.getId()+" start"); } //当有session停止时 触发 @Override public void onStop(Session session) { System.out.println("session:"+session.getId()+" stop"); } //当有session过期时 触发 // 但不会主动触发,需要再次访问时,即又要使用session时才会发现session过期,并触发。 @Override public void onExpiration(Session session) { System.out.println("session:"+session.getId()+" expired"); } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygjwp.html