009 自定义过滤器

时间:2022-12-10 21:44:25

一 .概述

  在上面的一节之中,我们介绍了过滤器的基本使用,另外使用了内置的过滤器.

  但是有的时候内置的过滤器并不能满足我们的需求.

  我们就需要使用自定的过滤器.

  在上一节之中,我们说过想要实现自定义的过滤器就需要继承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的过滤链.