【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

一、特殊名词介绍

二、背景、场景介绍

该接口是继EmbedRequestFilterProvider接口之后,对请求预处理场景需要的再次补充和完善。提供了与过滤器(javax.servlet.Filter)完全等同的效果,可以直接在插件代码中使用,不必要配置web.xml。

该接口不支持热加载。

三、接口介绍

GlobalRequestFilterProvider.java
package com.fr.decision.fun;

import com.fr.stable.fun.mark.Mutable;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;

/**
 * 全局的过滤器,该接口的实现必须重启服务器才能生效
 */
public interface GlobalRequestFilterProvider extends Mutable, Comparable<GlobalRequestFilterProvider> {

    String MARK_STRING = "GlobalRequestFilterProvider";

    int CURRENT_LEVEL = 1;

    /**
     * 过滤器的名字
     *
     * @return 过滤器名字
     */
    String filterName();


    /**
     * 匹配的地址
     *
     * @return 匹配的地址集合
     */
    String[] urlPatterns();

    /**
     * 外部的过滤器类名,需要把相应的jar包放到web服务器的classpath中
     * @return 类名
     */
    String externalFilterClassName();

    /**
     * 初始化过滤器
     * 注:该接口生效必须重启服务器
     * @param filterConfig 过滤器配置
     */
    void init(FilterConfig filterConfig) throws ServletException;

    /**
     * 过滤器的初始化参数
     * @return 参数集合
     * @since 2019-01-02
     */
    Map<String, String> initializationParameters();

    /**
     * 过滤servlet
     * @param req http请求
     * @param res http响应
     * @param filterChain 过滤链表
     */
    void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws IOException, ServletException;

    /**
     * 销毁过滤器
     */
    void destroy();
}


四、支持版本

产品线

版本

支持情况

备注

FR10.0支持
BI5.1支持
BI5.1.2支持
BI5.1.3支持

五、插件注册

plugin.xml
<extra-decision>
    <GlobalRequestFilterProvider class="your class name"/>
</extra-decision>

六、原理说明

平台服务初始化模块(DecisionServletInitializer)在启动时,会读取所有插件中实现的GlobalRequestFilterProvider接口,并依次设置到到一个Filter注入到ServletContext中

七、特殊限制说明

该接口与一般的filter一致,可以自行设置过滤任何路由,也可以用于转发或重定向等操作,但不允许用于实现新的web接口服务(虽然代码上能实现,但不符合规范)。

所有的插件实现的GlobalRequestFilterProvider接口执行顺序,通过实现compareTo接口方法指定。默认是根据filterName方法返回值的ASCII码升序排序。

其中externalFilterClassName方法,如果返回值不为空,则表示申明引用一个外部的filter。引入外部filter时,该接口的init、doFilter、destroy三个接口方法就无效了,而会直接使用外部filter对应的接口。注:引入外部filter主要指定执行顺序

同时因为引入外部filter时,就无需配置web.xml了,所以初始化的相关参数需要通过initializationParameters方法指定。而外部filter所在的JAR包,也需要放到产品的WEB-INF/lib目录下

八、常用链接

demo地址:demo-global-request-filter

插件中四种实现filter功能的接口对比

九、开源案例

免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。禁止用于任何商业用途,若作为商用一切后果责任由使用者自行承担。

open-JSD-7957

open-JSD-7944

open-JSD-7874【政务钉钉单点】

open-JSD-7814

open-JSD-7706

open-JSD-7546

open-JSD-7492

open-JSD-6952

  • No labels