過濾器和攔截器總結

来源:https://www.cnblogs.com/wanyankun/archive/2023/03/13/17211857.html
-Advertisement-
Play Games

1.總結內容參考:https://blog.csdn.net/dhklsl/article/details/127533485 2.下麵是本人工作項目中實戰到的案例(具體業務的實體沒必要關註) 2.1.攔截器使用 點擊查看代碼 import java.lang.invoke.MethodHandle ...


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.使用的心得:寫這個類的目的主要是將請求到測試的環境的請求,轉發到本地環境。方便自己的調式代碼。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 容器功能 1.Spring註入組件的註解 Spring中的傳統註解@Component、@Controller、@Service、@Repository,在SpringBoot中仍然有效。 2.@Configuration @Configuration是 Spring 3.0 添加的一個註解,用來代 ...
  • 我是3y,一年CRUD經驗用十年的markdown程式員👨🏻‍💻常年被譽為職業八股文選手 開源項目消息推送平臺austin倉庫地址: 消息推送平臺🔥推送下發【郵件】【簡訊】【微信服務號】【微信小程式】【企業微信】【釘釘】等消息類型。 https://gitee.com/zhongfuchen ...
  • 搞懂無鎖編程的重要一步是完全理解記憶體順序! 本教程由作者和ChatGPT通力合作完成。 都有哪幾種? c++的記憶體模型共有6種 memory_order_relaxed memory_order_consume memory_order_acquire memory_order_release me ...
  • 首先理解常亮表達式。常量表達式是指值不會改變,並且在編譯過程就能計算得到結果。 const修飾的對象無法修改,constexpr對象在編譯期間就確定且無法修改。 constexpr變數,編譯器在編譯階段驗證變數是否為一個常量表達式。 constexpr側重變數初值編譯階段確定,且無法修改。如果認定變 ...
  • 處理GB/T4754—2017國民經濟行業分類與代碼數據,劃分四級分類存入mysql資料庫【文末獲取下載方式】 第二張圖是之前的格式,今天應一位網友的要求,將其處理為如下第三張圖的格式。更貼近源文檔,方便使用。 如圖所示: 按 門類編碼 門類名稱 大類編碼 大類名稱 中類編碼 中類名稱 小類編碼 小 ...
  • 單元測試、反射 一、單元測試 1.1 單元測試快速入門 所謂單元測試,就是針對最小的功能單元,編寫測試代碼對其進行正確性測試。 我們想想,咱們之前是怎麼進行測試的呢? 比如說我們寫了一個學生管理系統,有添加學生、修改學生、刪除學生、查詢學生等這些功能。要對這些功能這幾個功能進行測試,我們是在main ...
  • 此處為一個測試項目的簡單結構,為了便於管理和使用,所以直接將需要的jar放到lib(名字隨意)文件夾下 方法一、 找到項目結構視窗並打開→打開後按圖片上順序進行點擊→而後找到自己的jar包後選中並確定 以上步驟都結束以後就可以調用包中的方法了 方法二、 打開項目結構管理以後→點擊Libraries→ ...
  • 作者:你呀不牛 鏈接:https://juejin.cn/post/7114669787870920734 前段時間,同事在代碼中KW掃描的時候出現這樣一條: 上面出現這樣的原因是在使用foreach對HashMap進行遍歷時,同時進行put賦值操作會有問題,異常ConcurrentModifica ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...