在Shiro过滤器中,可以通过在过滤器中添加一个标记来防止过滤器重复执行。具体操作如下:

  1. 在过滤器类中定义一个静态变量,用于标记过滤器是否已经执行过。
public class MyFilter extends AccessControlFilter {

    private static boolean FILTER_ALREADY_EXECUTED = false;

    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
        // 判断过滤器是否已经执行过
        if (FILTER_ALREADY_EXECUTED) {
            return true;
        }
        // 执行过滤器的逻辑
        // ...

        // 标记过滤器已经执行过
        FILTER_ALREADY_EXECUTED = true;

        return true;
    }

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
        return true;
    }
}
  1. 配置过滤器时,将该过滤器配置在需要防止重复执行的位置。
<bean id="myFilter" class="com.example.MyFilter"/>

<bean id="shiroFilter" class="org.apache.shiro.web.servlet.ShiroFilterFactoryBean">
    <!-- 省略其他配置 -->
    <property name="filters">
        <map>
            <!-- 配置过滤器及其顺序 -->
            <entry key="myFilter" value-ref="myFilter"/>
        </map>
    </property>
    <property name="filterChainDefinitions">
        <value>
            <!-- 配置过滤器链 -->
            /path1 = myFilter
            /path2 = myFilter
            /path3 = myFilter
        </value>
    </property>
</bean>

这样,在过滤器执行完一次后,静态变量FILTER_ALREADY_EXECUTED会被设置为true,下次再执行该过滤器时,会直接返回true,从而防止过滤器重复执行。


原文地址: https://www.cveoy.top/t/topic/i4S2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录