1.总结内容参考:https://blog.csdn.net/dhklsl/article/details/127533485
2.下面是本人工作项目中实战到的案例(具体业务的实体没必要关注)
2.1.拦截器使用

点击查看代码
import java.lang.invoke.MethodHandles;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.logging.log4j.Logger;import org.dom4j.Document;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import com.epoint.core.utils.string.StringUtil;import com.epoint.financeproduct.dao.TBaoHanApplyDao;import com.epoint.financeproduct.domain.Tbaohanapply;import com.epoint.financeproduct.tbaohanbtdh.dao.TBaoHanApplyBTDHDao;import com.epoint.financeproduct.util.DynamicLoggerUtil;/** * 通知api路由拦截器 * @作者 jawel * @version [版本号, 2021年3月16日] * @see [相关类/方法] * @since [产品/模块版本] */public class BTDHNoticeApiRouterInterceptor implements HandlerInterceptor{    protected Logger logger = DynamicLoggerUtil.getLoggerByClass(MethodHandles.lookup().lookupClass(), DynamicLoggerUtil.LogType.COMMON);    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)            throws Exception {        Document document = BTDHApiRouterInterceptorUtil.preHandle(request, response, handler);        document.getRootElement().element("body").elementText("OrderNo");        String ApplyOrderNo =  document.getRootElement().element("body").elementText("OrderNo");        String baohanno =  document.getRootElement().element("body").elementText("PolicyNo");        logger.info("ApplyOrderNo"+ApplyOrderNo);        logger.info("baohanno"+baohanno);        //applyno和baohanno均为空,则直接通过,防止误拦截        if(StringUtil.isBlank(ApplyOrderNo) && StringUtil.isBlank(baohanno)){            return true;        }                //获取保函申请数据        TBaoHanApplyBTDHDao tBaoHanApplyDao = new TBaoHanApplyBTDHDao();        Tbaohanapply tBaoHanApply = null;        if (StringUtil.isNotBlank(ApplyOrderNo)) {            tBaoHanApply = tBaoHanApplyDao.getTBaoHanInfoByApplyorderno(ApplyOrderNo);        }        //如果通过applyno获取申请数据为空,则再通过baohanno获取数据        if (tBaoHanApply == null && StringUtil.isNotBlank(baohanno)) {            tBaoHanApply = tBaoHanApplyDao.getTBaoHanApplyByBaoHanNo(baohanno);        }        logger.info("tBaoHanApply"+tBaoHanApply.toString());        request.setAttribute("tBaoHanApply", tBaoHanApply);                // 处理拦截请求        return BTDHApiRouterInterceptorUtil.doInterceptRequest(request, response);    }    @Override    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,            ModelAndView modelAndView) throws Exception {    }    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)            throws Exception {    }}
点击查看工具类
package com.epoint.financeproduct.btdh.util;import java.io.ByteArrayInputStream;import java.io.InputStream;import java.lang.invoke.MethodHandles;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.logging.log4j.Logger;import org.dom4j.Document;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.method.HandlerMethod;import com.epoint.core.utils.config.ConfigUtil;import com.epoint.core.utils.httpclient.HttpClientUtil;import com.epoint.core.utils.string.StringUtil;import com.epoint.financeproduct.domain.Tbaohanapply;import com.epoint.financeproduct.job.DataSync2EpointFinanceProduct_Push_Data_Sec_H_Job;import com.epoint.financeproduct.util.Constant.IsOrNot;import com.epoint.financeproduct.util.DynamicLoggerUtil;import com.epoint.financeproduct.util.IDUtils;import com.epoint.financeproduct.util.InsuranceServerInfo;import com.epoint.financeproduct.util.InsuranceServerInfoUtil;import com.epoint.financeproduct.util.RequestUtils;import com.epoint.financeproduct.util.ValueProcessUtils;public class BTDHApiRouterInterceptorUtil{    private static Logger logger = DynamicLoggerUtil.getLoggerByClass(MethodHandles.lookup().lookupClass(), DynamicLoggerUtil.LogType.COMMON);        public static Document preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {        //获取RequestMapping注解        HandlerMethod method = (HandlerMethod) handler;        RequestMapping controllerRequestMapping = method.getBean().getClass().getAnnotation(RequestMapping.class);        RequestMapping methodRequestMapping = method.getMethod().getAnnotation(RequestMapping.class);        //拼接url路径        StringBuilder sb = new StringBuilder("");        sb.append(getRequestMappingValue(controllerRequestMapping));        sb.append(getRequestMappingValue(methodRequestMapping));        //获取mapping地址        String mappingUrl = sb.toString();        // 存入request区域        logger.info("mappingUrl"+mappingUrl);        request.setAttribute("mappingUrl", mappingUrl);        //获取请求参数        BTBaseService baseService = null;        try {            baseService = new BTBaseService(request, response);        }        catch (Exception e) {            logger.error("获取baseService异常", e);        }        return baseService.receivexmlString;    }        /**     *  [处理拦截请求]     *  @param request     *  @param response     *  @return     * @throws Exception      */    public static boolean doInterceptRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {        // 从request请求域获取保函申请对象        Tbaohanapply tBaoHanApply = (Tbaohanapply) request.getAttribute("tBaoHanApply");        // 从request请求域获取mappingUrl        String mappingUrl = (String) request.getAttribute("mappingUrl");        logger.info("mappingUrl"+mappingUrl);        //如果申请数据不存在,则进行转发        if (tBaoHanApply == null) {            logger.info("tBaoHanApply==kong");            // 判断下当前系统是否为119大平台,防止死循环            String isEpointProduct = ConfigUtil.getConfigValue("isepointproduct");            if (StringUtil.isNotBlank(isEpointProduct) && IsOrNot.是.value.equals(Integer.valueOf(isEpointProduct))) {                return true;            }                        //转发请求            //获取新点产品端web地址            String epointFinanceProductInterfaceUrl = DataSync2EpointFinanceProduct_Push_Data_Sec_H_Job.getEpointFinanceProductInterfaceUrl();            //如果未配置“新点金融服务支撑平台(产品端)接口地址”,或者mappingUrl为空,则直接通过            if(StringUtil.isBlank(epointFinanceProductInterfaceUrl) || StringUtil.isBlank(mappingUrl)){                return true;            }                        // 请求转发            doRequestForward(request, response, epointFinanceProductInterfaceUrl, mappingUrl);            return false;        }        else {            logger.info("tBaoHanApply==getIsPushFinanceInsurance"+tBaoHanApply.getIsPushFinanceInsurance());            // 保函申请数据存在,根据保函申请表(TBaoHanApply)上的IsPushFinanceInsurance(是否推送金融机构产品端系统)字段和FinanceInsuranceID(金融机构产品端ID)字段来判断是否转发            // 如果IsPushFinanceInsurance(是否推送金融机构产品端系统)字段的值是“IsOrNot.是.value”,说明是转发的            if (IsOrNot.是.value.equals(tBaoHanApply.getIsPushFinanceInsurance())) {                // 根据FinanceInsuranceID(金融机构产品端ID)字段值找到对应的转发服务器信息,将通知接口转发到对应的服务器上                InsuranceServerInfo insuranceServerInfo = InsuranceServerInfoUtil.getInsuranceServerInfoByID(tBaoHanApply.getPlatformcode(), tBaoHanApply.getProductcode(), tBaoHanApply.getFinanceInsuranceID());                String financeInsuranceUrl = insuranceServerInfo.getFinanceInsuranceUrl();                logger.info("financeInsuranceUrl"+financeInsuranceUrl);                logger.info("mappingUrl"+mappingUrl);                // 转发                doRequestForward(request, response, financeInsuranceUrl, mappingUrl);                return false;            }        }        return true;    }        /**     *  [转发]     *  @param request     *  @param response     *  @param financeProductInterfaceUrl     *  @param mappingUrl     *  @throws Exception     */    public static void doRequestForward(HttpServletRequest request, HttpServletResponse response, String financeProductInterfaceUrl, String mappingUrl) throws Exception {        InputStream in = (ByteArrayInputStream) request.getAttribute("inputstream");        //重置流读取位置        in.reset();        String params = ValueProcessUtils.convertInputStream2String(in);        String url = financeProductInterfaceUrl + mappingUrl;        String reqID = IDUtils.getID("REQ", 5);        logger.info("reqID=" + reqID + ",NoticeApiRouterInterceptor.url=" + url);        String resultStr = RequestUtils.httpsPostUTF8Xml(url, params);        logger.info("reqID=" + reqID + ",NoticeApiRouterInterceptor.postBody=" + resultStr);        //响应返回值        response.setHeader("Content-Type", "text/xml;charset=UTF-8");       // response.setHeader("Content-Type", "application/json;charset=utf-8");        response.getWriter().write(resultStr);    }        /**     * 获取RequestMapping的value值     *  @param requestMapping     *  @return         * @exception/throws [违例类型] [违例说明]     * @see [类、类#方法、类#成员]     */    private static String getRequestMappingValue(RequestMapping requestMapping) {        String value = "";        if (requestMapping != null && requestMapping.value() != null && requestMapping.value().length > 0) {            value = requestMapping.value()[0];        }        return value;    }}

2.2 过滤器的使用

点击查看代码
package com.epoint.financeproduct.btdh.util;import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.lang.invoke.MethodHandles;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ReadListener;import javax.servlet.ServletException;import javax.servlet.ServletInputStream;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import javax.servlet.http.HttpServletResponse;import org.apache.logging.log4j.Logger;import org.dom4j.Document;import com.epoint.core.utils.string.StringUtil;import com.epoint.financeproduct.dao.FinancePlatformProductSettingsDao;import com.epoint.financeproduct.dao.FinanceProductDao;import com.epoint.financeproduct.domain.FinancePlatformProductSettings;import com.epoint.financeproduct.domain.Financeproduct;import com.epoint.financeproduct.domain.Tbaohanapply;import com.epoint.financeproduct.tbaohanbtdh.dao.TBaoHanApplyBTDHDao;import com.epoint.financeproduct.util.Constant.IsOrNot;import com.epoint.financeproduct.util.DynamicLoggerUtil;import com.epoint.financeproduct.util.FileManage;import com.epoint.financeproduct.util.IDUtils;import com.epoint.financeproduct.util.RequestUtils;import com.epoint.financeproduct.util.ValueProcessUtils;/** * 标准版通知api路由拦截器 * @作者 jawel * @version [版本号, 2021年5月27日] * @see [相关类/方法] * @since [产品/模块版本] */public class BTDHNoticeApiRouterFilter implements Filter{    private static final Logger logger = DynamicLoggerUtil            .getLogger(MethodHandles.lookup().lookupClass().getSimpleName(), DynamicLoggerUtil.LogType.COMMON);    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)            throws IOException, ServletException {        HttpServletRequest requestWrapper = null;        out: if (request instanceof HttpServletRequest) {            try {                //requestWrapper = new BufferedServletRequestWrapper((HttpServletRequest) request);                requestWrapper = (HttpServletRequest) request;                BTBaseService baseService = new BTBaseService((HttpServletRequest) request, (HttpServletResponse) response);                Document document = baseService.receivexmlString;                document.getRootElement().element("body").elementText("OrderNo");                String ApplyOrderNo =  document.getRootElement().element("body").elementText("OrderNo");                String baohanno =  document.getRootElement().element("body").elementText("PolicyNo");                //appkey为空,则直接通过,防止误拦截                if (StringUtil.isBlank(ApplyOrderNo)) {                                        break out;                }                                // applyNo为空,则直接通过,防止误拦截                if (StringUtil.isBlank(baohanno)) {                    break out;                }                                                // 获取申请信息                //获取保函申请数据                TBaoHanApplyBTDHDao tBaoHanApplyDao = new TBaoHanApplyBTDHDao();                Tbaohanapply tBaoHanApply = null;                if (StringUtil.isNotBlank(ApplyOrderNo)) {                    tBaoHanApply = tBaoHanApplyDao.getTBaoHanInfoByApplyorderno(ApplyOrderNo);                }                if (tBaoHanApply == null) {                    break out;                }                FinanceProductDao financeProductDao = new FinanceProductDao();                Financeproduct productInfo = financeProductDao.getProductInfoByProductCode(tBaoHanApply.getProductcode());                //productInfo为空,则直接通过,防止误拦截                if (productInfo == null) {                                        break out;                }                // 获取平台产品配置信息                FinancePlatformProductSettings settings = new FinancePlatformProductSettingsDao()                        .getSettingsByPlatformCodeAndProductCode(tBaoHanApply.getPlatformcode(),                                productInfo.getProductcode());                //如果产品上配置转发到开发环境,则进行转发                if (IsOrNot.是.value.toString()                        .equals(ValueProcessUtils.getValueNoException(settings, "isredirectdev"))) {                    String requestURI = requestWrapper.getRequestURI();                    //转发请求                    //获取转发地址                    String routerDevUrl = ValueProcessUtils.getValueNoException(settings, "devrouterurl");                    //如果未配置“新点金融服务支撑平台(产品端)接口地址”,或者requestURI为空,则直接通过                    if (StringUtil.isBlank(routerDevUrl) || StringUtil.isBlank(requestURI)) {                                                break out;                    }                    String url = routerDevUrl + requestURI;                    InputStream in = requestWrapper.getInputStream();                    //获取原始报文参数                    String params = "";                    try {                        params = ValueProcessUtils.convertInputStream2String(in);                    }                    catch (Exception e) {                        logger.error("url=" + url + ">>>InputStream转String失败error", e);                    }                    String reqID = IDUtils.getID("REQ", 5);                    logger.info("BTDHNoticeApiRouterFilterreqID=" + reqID + ",NoticeApiRouterInterceptor.url=" + url);                    String resultStr = RequestUtils.httpsPostUTF8Xml(url, params);                    logger.info("BTDHNoticeApiRouterFilterreqID=" + reqID + ",NoticeApiRouterInterceptor.postBody=" + resultStr);                    //响应返回值                    HttpServletResponse newResponse = (HttpServletResponse) response;                    newResponse.setHeader("Content-Type", "text/xml;charset=UTF-8");                    //newResponse.setHeader("Content-Type", "application/json;charset=utf-8");                    newResponse.getWriter().write(resultStr);                    return;                }            }            catch (Exception e) {                logger.error("BTDHNoticeApiRouterFilter.doFilter error", e);            }        }        if (requestWrapper == null) {            chain.doFilter(request, response);        }        else {            chain.doFilter(requestWrapper, response);        }    }    @Override    public void destroy() {    }}class BufferedServletRequestWrapper extends HttpServletRequestWrapper{    private final byte[] body; // 报文    public BufferedServletRequestWrapper(HttpServletRequest request) throws IOException {        super(request);        body = FileManage.fileToByte(request.getInputStream());    }    @Override    public BufferedReader getReader() throws IOException {        return new BufferedReader(new InputStreamReader(getInputStream()));    }    @Override    public ServletInputStream getInputStream() throws IOException {        final ByteArrayInputStream bais = new ByteArrayInputStream(body);        return new ServletInputStream()        {            @Override            public int read() throws IOException {                return bais.read();            }            @Override            public boolean isFinished() {                return false;            }            @Override            public boolean isReady() {                return false;            }            @Override            public void setReadListener(ReadListener readListener) {            }        };    }}

3.使用的心得:写这个类的目的主要是将请求到测试的环境的请求,转发到本地环境。方便自己的调式代码。