Shiro学习——Shiro与web集成
Posted sadoshi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shiro学习——Shiro与web集成相关的知识,希望对你有一定的参考价值。
前言
Shiro作为一个权限认证框架,最主要的服务对象应该就是JavaWeb。因此如何与web集成是发挥shiro作用的关键。这里以最基础的与servlet集成作为例子。
新建简单的servlet应用
这里以《Eclipse新建基于Servlet3.x的maven项目》这篇文章的方式构建基本的servlet,就不在本文叙述了。
Servlet与Shiro集成
在web.xml配置监听器和过滤器
首先在web.xml中添加如下内容:
<listener>
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>
<filter>
<filter-name>ShiroFilter</filter-name>
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ShiroFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
添加一个监听器EnvironmentLoaderListener,这个监听器会默认创建IniWebEnvironment,读取默认位置的shiro.ini文件,然后默认创建DefaultWebSecurityManager。
然后ShiroFilter这个过滤器,替我们实现web登录及权限认证过滤器的功能。可以回想一下,自己写一个登录认证功能,都会写个filter,当用户访问哪些路径时,必须是已登录的,或者必须具备某些权限。现在等于ShiroFilter实现了这个filter的功能,我们只需要配置路径即可。
配置shiro.ini
下一步是在shiro.ini中配置过滤器对应的路径
[main]
#登录认证的页面
authc.loginUrl=/login
#缺少权限时跳转的页面
roles.unauthorizedUrl=/unauthorized.jsp
[users]
zhang=123,role1
wang=456,role1,role2
li=123
[roles]
role1=user:create,update
role2=user:create,delete
[urls]
#请求login的时候不需要权限,游客身份即可(anon)
/login=anon
/login.jsp=anon
#请求/user/updatePwd.jsp的时候,需要身份认证(authc)
/*=authc
#请求/admin的时候,需要角色认证,必须是拥有admin角色的用户才行
/admin/*.jsp=roles[role2]
配置都不难理解,读者可以自行尝试一下,如果未登陆时直接访问/shiroWeb/hello会怎么样,也可以试下以zhang这个用户访问/admin路径下的页面会怎么样。上面/unauthorized.jsp页面和/admin下的页面,读者可以自行编写,没什么特殊要求。
Shiro提供了以下这些过滤器,我们用了其中的anon、authc和roles。其他的各位也可以自行尝试,如果后面有时间我也会逐个尝试并在文章中展示:
Session有效时间
对Web开发有一定了解都知道登录之后,后台会为用户保存一个session,当下次检验是否已登录时,可以根据sessionId进行判断。session是存在有效期的,有效期过了之后就要重新登录了,我们可以在web.xml中配置session有效期,在web.xml中添加这一段:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
这里指session有效期为30分钟。如果想测试一下效果的话,读者可以尝试改成1分钟。这样登录后过了一分钟再次访问shiroWeb/hello看看效果如何。
小结
Shiro与web的集成是开发javaweb应用非常重要的一环。本文的应用方式基本可以满足小型Servlet应用的需要。通常现在的javaweb开发还需要考虑到和spring的集成。另外关于session,Shiro默认使用Servlet的session,不过实际项目开发尤其是分布式应用会把session存放到redis中给分布式系统各主机访问,所以后续还要考虑Shiro和redis的集成。
以上是关于Shiro学习——Shiro与web集成的主要内容,如果未能解决你的问题,请参考以下文章