一 .概述
在上面的一节之中,我们介绍了过滤器的基本使用,另外使用了内置的过滤器.
但是有的时候内置的过滤器并不能满足我们的需求.
我们就需要使用自定的过滤器.
在上一节之中,我们说过想要实现自定义的过滤器就需要继承AccessControllerFilert.
本节我们就实现一个自定义的过滤器.
二 .自定义过滤器
我们实现一个访问该URL就记录日志的过滤器.
public class LogFilter extends AccessControlFilter{ //当访问该URL之后就记录日志 @Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception { String[] strs = (String[]) mappedValue; System.out.println("记录日志了"); System.out.println(strs[0]); if("123".equals(strs[0])) { return true; } return false; } //上面的方法返回true,就不会执行下面的方法. @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { System.out.println("进入了我的方法之中了..."); return false; } }
上面我们定义了一个日志Filter,其中当url的参数为123的时候拒绝访问.
配置方式:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"></property> <!-- 配置登录页面 --> <property name="loginUrl" value="/login"></property> <!-- 配置未授权页面的路径 --> <property name="unauthorizedUrl" value="/unan.jsp"></property> <!-- 配置登录成功的页面 --> <property name="successUrl" value="/WEB-INF/success.jsp"></property> <!-- 配置过滤器链 这是shiro的web配置的核心 --> <property name="filterChainDefinitions"> <value> /login=anon /authc=authc /user=roles[admin] /user/add=perms[admin:add] /log1=log[123] /log2=log[234] </value> </property> <property name="filters"> <map> <entry key="log" value-ref="logFilter"></entry> </map> </property> </bean>
我们配置到ShiroFilter的Filter之中,是一个map的结构.
我们的测试方式:
@RequestMapping("/log1") public String log1() { return "log1"; } @RequestMapping("/log2") public String log2() { return "log2"; }
当我们访问log1的时候,允许访问.
当我们访问log2的时候,拒绝访问.
三 .总结
我们在实际的情况下,实际上不太喜欢自定义过滤器的,因为我们使用自定义的过滤器之后
维护的成本就变高了.
因为这一个过滤器的逻辑就需要学习.
同时我们配置过滤器链的时候也出现了一个问题,
那就是当我们的过滤器链变成的时候,我们的配置文件就无限制的增多,不利于维护.
另外我们还希望动态的改变URL的过滤链.