Apache Shiro特别对Web应用进行了支持
官方文档:传送门
用Shiro.ini当作配置文件做一个案例
1、新建Maven项目,pom文件依赖如下。
<dependencies> <!-- Apache Shiro 核心包 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version> </dependency> <!-- Apache Shiro Web 依赖包里面有一些过滤器 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.5.1</version> </dependency> <!-- Apache Shiro依赖的日志包,如果不加会报错 --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <!-- 引入servlet3.0使用注解配置servlet --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> </dependencies>
2、新建一个Servlet,用于测试:IndexServlet,配置映射路径/hello
//访问路径事/hello @WebServlet("/hello") public class IndexServlet extends HttpServlet{
//重接goGet方法,用于获取get请求 @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取get请求转发给post请求 doPost(req,resp); } @Override public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //向页面输出hallo! PrintWriter printWriter=resp.getWriter(); printWriter.write("hello!"); printWriter.flush(); } }
3、配置web.xml
<!-- 添加监听,此类要引入shiro-web依赖包,在程序启动的时候会加载。 --> <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> </filter-mapping>
1、监听器EnvironmentLoaderListener会在应用程序启动后加载/WEB-INF/shiro.ini或者classpath:shiro.ini下的配置文件(文件名只能是上面的)。
2、默认情况下,监听器会在程序加载的时候,根据获取的配置文件,初始化WebEnvironment对象,这里面包含了Shir框架必须的一些对象,包括最主要的SecurityManager对象。
3、如果向把配置文件到位置,和文件名自定义,可以使用<context-param>。
<context-param>
<param-name>shiroConfigLocations</param-name>
<!-- 配置文件资源名,如下把配置文件放在了classpath下的static目录下,命名为myshiro.ini --><param-value>classpath:static/myshiro.ini</param-value>
</context-param>上面的配置的文件路径甚至可以是一个url地址,比如官方说的url:http://confighost.mycompany.com/myapp/shiro.ini;
扫描二维码关注公众号,回复: 9591614 查看本文章4、配置文件也可以自定义,可以改成xml配置或者其他的配置文件。这里可以使用<context-param>类配置自定义的WebEnvironment。
<context-param>
<param-name>shiroEnvironmentClass</param-name><!-- 自定义的WebEnvironment实现对象,写法参照org.apache.shiro.web.env.IniWebEnvironment -->
<param-value>com.demo.MyWebEnvironment</param-value>
</context-param>
4、自定义过滤器。
public class MyFilter extends PathMatchingFilter{ private String nickname; private String age; @Override public boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { if(nickname != null) { System.out.println(nickname); }else { System.out.println("nickname 空的"); } if(age != null) { System.out.println(age); }else { System.out.println("age 空的"); } return true; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } }
上面的过滤器拦截被执行的时候会在控制台输出一些换,模拟一些操作。
还有连个变量,在配置过滤器的时候设置。
5、这里使用shrio.ini配置Shrio对象的创建,默认情况下,文件名为shiro.ini,必须放在WEB-INF目录下面,也可以自定义。
[main]
myfilter = com.demo.filter.MyFilter
myfilter.nickname = zhangsan
myfilter.age = 18
[users]
root = secret, admin
guest = guest, guest
presidentskroob = 12345, president
darkhelmet = ludicrousspeed, darklord, schwartz
lonestarr = vespa, goodguy, schwartz
[roles]
admin = *
schwartz = lightsaber:*
goodguy = winnebago:drive:eagle5
[urls]
#格式:拦截的路径=使用的过滤器
/hello/** = myfilter
/index.html = anon,roles[admin]
1、[mian]里面定义了过滤器的实例,和赋值(参照上个面的过滤器实现)。
2、[users]和[roles]两个是设置登陆和权限的,一般不怎么用。而且看字面的也好理解。官方:传送门。
3、[urls]配置了过滤链,上面的例子中配置了三个个过滤器,当访问/hello下面的所有路径的时候执行自定义的myfilter(在上面有定义),当访问/index.html的时候,执行框架中提供的anon和roles。虽然anon和roles没写在[main]中,但这是框架默认提供的。anon是org.apache.shiro.web.filter.authc.AnonymousFilter的实例名还有很多默认过滤器请参考官方文档。
4、过滤器链还有很多多写法,处理上面那种一行行写,还可以写在一行。
filter1, filter2[optional_config2], ..., filterN[optional_configN]
5、中括号中的optional_config是一个配置,如果没有可以不加。
6、定义过滤器的时候是有先后顺序的,先定义的先执行。
6、加入tomcat,启动。浏览器里输入/hello。
控制台输出:
>zhangsan
>18