フィルタパラメータの統一性チェックを使用してspringbootプロジェクトは、敏感な単語を置き換えます

  • 1.問題のシナリオ
    • 、プログラムの堅牢性を向上させたサービスにバグを減らすことができ、操作するなど、スペース、改行、に、フィルタリング敏感語となる基準は非常に人気の需要です。各インターフェース処理せずにフィルタの団結を使用して、コードの保守性を改善
  • 2.カスタマイズサーブレット入力は(のみポストタイプ)取得ストリーム、およびJSON検証パラメータを達成し、パラメータは、フィルタパラメータを除去するために戻されます
  • 3.実装カスタムHttpServletRequestWrapperクラス
    • パッケージcom.pld.content.manager.common。
      
      輸入com.alibaba.fastjson.JSON; 
      輸入com.alibaba.fastjson.JSONArray; 
      輸入com.alibaba.fastjson.JSONObject; 
      輸入org.apache.commons.io.IOUtils。
      輸入org.apache.commons.lang3.StringUtils。
      輸入org.springframework.http.HttpHeaders。
      輸入org.springframework.http.MediaType。
      
      輸入javax.servlet.ReadListener; 
      輸入javax.servlet.ServletInputStream; 
      インポートのjavax.servlet.http.HttpServletRequest; 
      輸入javax.servlet.http.HttpServletRequestWrapper; 
      輸入java.io.ByteArrayInputStream; 
      インポートにjava.io.IOException; 
      輸入java.util.HashMapを; 
      インポートするjava.util.Iterator; 
      輸入java.util.Map;
      輸入java.util.Set;
       
      / ** 
       * @author TLJ 
       * @date 2019年8月5日
       * / 
      
      ParameterRequestWrapperパブリッククラスHttpServletRequestWrapperクラス{延び
      
          プライベートマップ<文字列、文字列[]> paramsは=新しい新規HashMapを<>(); 
      
          公共ParameterRequestWrapper (HttpServletRequestのリクエスト){ 
              対応するメソッドを呼び出すために、その出力、実際に同様のクラスの新しい父親の第1の実施の形態における要求に//親クラス
              スーパー(リクエスト); 
              //パラメータテーブル地図パラメータ要求を保持するように、現在のように与えられた
              地図<文字列、文字列[]> = Requestmap request.getParameterMap(); 
              this.params.putAll(Requestmapは); 
          } 
          / ** 
           *書き換え型のgetInputStream方法ポストリクエストパラメータの値は、ストリームの前に取得する必要があります
           * / 
          @Override
          公共サーブレット入力のgetInputStream()はIOExceptionがスロー{
              新しいMyServletInputStream(ビス)を返します。
              //非JSON类型、直接返回
              場合(super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)!){ 
                  リターンsuper.getInputStream(); 
              } 
              //为空、直接返回
              列JSON = IOUtils.toString(super.getInputStream()、 "UTF-8"); 
              IF(StringUtils.isEmpty(JSON)){ 
                  super.getInputStream()を返します。
              } 
              マップの<string、オブジェクト>マップ= JSON.parseObject(JSON)。
              dealMap(マップ)
              れるByteArrayInputStreamビス=新しいれるByteArrayInputStream(JSON.toJSONString(マップ).getBytes( "UTF-8")); 
          } 
      
          プライベートボイドdealMap(MAP <文字列、OBJECT>マップ){ 
              セットの<string>セット= map.keySet()。 
              イテレータは、<文字列> ITはset.iteratorを()=; 
              パラメータ空間の//値を除去した後、バック書き換え
              (it.hasNext()){しばらく
                  ;文字キー= it.next()
                  オブジェクトの値をmap.get =ように(キー)、
                  IF(文字列instanceofの値){ 
                      値=((文字列)値).trim(); 
                  }そうIF(値JSONArrayのinstanceof){ 
                      JSONArray JSON =(JSONArray)値; 
                      !IF(json.isEmpty()){ 
                          用(INT I = 0; I <json.size(); I ++){ 
                              JSONObjectジョブ= json.getJSONObject(I); //反復jsonarray配列、JSONへの対象物の各々
                              delJSONObject(ジョブ); 
                          }
                      }  
                  }
                  map.put(キー、値)。
              } 
          } 
          プライベートボイドdelJSONObject(JSONObject jsonObject){ 
              イテレータ<のMap.Entry <文字列オブジェクト>>イテレータ= jsonObject.entrySet()反復子()。
              (iterator.hasNext()){一方
                  のMap.Entry <文字列、オブジェクト>エントリ= iterator.next()。
                  文字列キー= entry.getKey()。
                  オブジェクト値= entry.getValue()。
                  (文字列instanceofの値){もし
                      値=((文字列)値)(.trim)。
                  } 
                  jsonObject.put(キー、値)。
              } 
          } 
      
          パブリック静的無効メイン(文字列[] args){ 
              JSONObject jsonObject =新しいJSONObject()。
              jsonObject.put( "K1"、 "V1")。
              反復子<のMap.Entry <文字列オブジェクト>>イテレータ= jsonObject.entrySet()反復子()。
              (iterator.hasNext()){一方
                  のMap.Entry <文字列、オブジェクト>エントリ= iterator.next()。
                  entry.getValue(); 
                  entry.getKey(); 
              } 
      
      
          } 
          / ** 
           *重写のgetParameter参数从当前类中的マッピング获取
           * / 
          @Override 
          パブリック文字列のgetParameter(文字列名){ 
              String []型値= params.get(名); 
              IF(値== NULL || values.length == 0){ 
                  戻りヌル。
              } 
              戻り値[0]。
          } 
          / **
           *重写getParameterValues 
           * / 
          パブリック文字列[] getParameterValues(文字列名){//同上
              戻りparams.get(名); 
          } 
      
          クラスMyServletInputStreamはサーブレット入力{延び
              プライベートするByteArrayInputStreamビス。
              公共MyServletInputStream(れるByteArrayInputStreamビス){ 
                  this.bis =ビス。
              } 
              @Override 
              パブリックブールisFinished(){ 
                  trueを返します。
              } 
      
              @Override 
              パブリックブールisReady(){ 
                  trueを返します。
              } 
      
              @Override 
              公共ボイドsetReadListener(ReadListenerリスナー){ 
                  // 
              } 
              @Override 
              公共int型リード(){ 
                  戻りbis.read()。
              } 
          }
      }
      
  • カスタムフィルタを実装し、フィルタ構成
    • package com.pld.content.manager.common;
      
      import org.springframework.stereotype.Component;
      
      import javax.servlet.*;
      import javax.servlet.annotation.WebFilter;
      import javax.servlet.http.HttpServletRequest;
      import java.io.IOException;
      
      /**
       * @author tlj
       * @date 2019/8/5
       */
      
      
      @Component
      @WebFilter(urlPatterns = "/**", filterName = "ParamsFilter",dispatcherTypes=DispatcherType.REQUEST)
      public class ParamsFilter implements Filter {
      
      
          @Override
          public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
                  throws IOException, ServletException {
              ParameterRequestWrapper parmsRequest = new ParameterRequestWrapper((HttpServletRequest) arg0);
              arg2.doFilter(parmsRequest, arg1);
          }
      
          @Override
          public void destroy() {
      
          }
      
          @Override
          public void init(FilterConfig arg0) {
      
          }
      
      
      }

       

公開された14元の記事 ウォンの賞賛4 ビュー2743

おすすめ

転載: blog.csdn.net/www_tlj/article/details/98497956