<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何使用filter過濾器對入?yún)⑦M行處理(完整版)

          共 12013字,需瀏覽 25分鐘

           ·

          2021-12-09 15:12

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術/資料共享?
          關注


          閱讀本文大概需要 9?分鐘。

          來自:blog.csdn.net/Muscleheng/article/details/80067772

          遇見的問題:

          前臺把參數(shù)通過報文或者使用表單、ajax提交到后臺,如果我們的請求參數(shù)是加密的,那么我們在controller里面的每一個方法里都需要進行解密處理。如果方法太多,那就太麻煩了。

          設計方案:

          使用過濾器,在一個Filter中將 HttpServletRequest 里的所有參數(shù)都取出來分別進行過濾然后再放回到該HttpServletRequest 中行不行呢?
          通過測試后發(fā)現(xiàn)是不行的,因為HttpServletRequest 只提供了getParameter ,而沒有提供setParameter;所以,我們只能自己寫一個HttpServletRequest 方法繼承HttpServletRequestWrapper,然后覆蓋里面的方法,并且增加我們自己的setParameters方法,這樣我們就可以為所欲為了,最后再在filter中調用該類的方法對參數(shù)進行處理(獲取、修改、存儲等等)。

          解決方案:

          在請求參數(shù)到達controller之前,在filter里面進行解密;這樣,通過簡單的過濾器處理,把需要處理的請求都在過濾器里進行解密操作,這樣就等于實現(xiàn)了自動化處理。
          這里我們針對兩種不同的請求方式進行講解:
          1. 普通的表單、ajax請求;
          2. json格式的報文請求。(三步搞定)

          1.普通的表單、ajax請求;

          第一步:新建一個類
          這個類繼承自HttpServletRequestWrapper
          import?java.io.IOException;
          import?java.util.HashMap;
          import?java.util.Map;

          import?javax.servlet.http.HttpServletRequest;
          import?javax.servlet.http.HttpServletRequestWrapper;
          /**
          ?*?重寫?HttpServletRequestWrapper
          ?*?處理表單、ajax請求
          ?*?@author?zhaoheng
          ?*
          ?*/

          public?class?MyHttpServletRequestWrapper1?extends?HttpServletRequestWrapper{??
          ??
          ??//?用于存儲請求參數(shù)
          ??private?Map?params?=?new?HashMap();??
          ??//?構造方法
          ?????public?MyHttpServletRequestWrapper1(HttpServletRequest?request)?throws?IOException?{????
          ?????????super(request);
          ?????????//?把請求參數(shù)添加到我們自己的map當中
          ?????????this.params.putAll(request.getParameterMap());?
          ?????}????
          ?????
          ?????
          ?????/**
          ??????*?添加參數(shù)到map中
          ??????*?@param?extraParams
          ??????*/

          ?????public?void?setParameterMap(Map?extraParams)?{
          ?????????for?(Map.Entry?entry?:?extraParams.entrySet())?{
          ?????????????setParameter(entry.getKey(),?entry.getValue());
          ?????????}
          ?????}
          ?????
          ?????/**
          ??????*?添加參數(shù)到map中
          ??????*?@param?name?
          ??????*?@param?value
          ??????*/

          ?????public?void?setParameter(String?name,?Object?value)?{
          ?????????if?(value?!=?null)?{
          ?????????????System.out.println(value);
          ?????????????if?(value?instanceof?String[])?{
          ?????????????????params.put(name,?(String[])?value);
          ?????????????}?else?if?(value?instanceof?String)?{
          ?????????????????params.put(name,?new?String[]{(String)?value});
          ?????????????}?else?{
          ?????????????????params.put(name,?new?String[]{String.valueOf(value)});
          ?????????????}
          ?????????}
          ?????}
          ?????
          ?????/**
          ??????*?重寫getParameter,代表參數(shù)從當前類中的map獲取
          ??????*?@param?name
          ??????*?@return
          ??????*/

          ?????@Override
          ?????public?String?getParameter(String?name)?{
          ?????????String[]values?=?params.get(name);
          ?????????if(values?==?null?||?values.length?==?0)?{
          ?????????????return?null;
          ?????????}
          ?????????return?values[0];
          ?????}

          ?????/**
          ??????*?重寫getParameterValues方法,從當前類的?map中取值
          ??????*?@param?name
          ??????*?@return
          ??????*/

          ?????@Override
          ?????public?String[]?getParameterValues(String?name)?{
          ?????????return?params.get(name);
          ?????}
          }??
          通過建立這個類我們就能完成向request對象添加我們處理之后的參數(shù)了。
          第二步:通過實現(xiàn)filter接口建一個過濾器
          package?com.zhh.filter;
          import?java.io.IOException;
          import?java.util.Arrays;
          import?java.util.List;

          import?javax.servlet.Filter;
          import?javax.servlet.FilterChain;
          import?javax.servlet.FilterConfig;
          import?javax.servlet.ServletException;
          import?javax.servlet.ServletRequest;
          import?javax.servlet.ServletResponse;
          import?javax.servlet.http.HttpServletRequest;

          import?org.apache.log4j.Logger;

          import?com.zhh.util.request.MyHttpServletRequestWrapper1;

          /**
          ?*?參數(shù)處理驗過濾器(針對ajax、表單等請求) 1.獲取請求參數(shù);2.對獲取到的請求參數(shù)進行處理(解密、字符串替、請求參數(shù)分類截取等等);3.把處理后的參數(shù)放回到請求列表里面
          ?*?
          ?*?@author?zhaoheng
          ?*
          ?*/

          public?class?ValidatorFilter1?implements?Filter?{

          ?private?static?final?Logger?log?=?Logger.getLogger(ValidatorFilter1.class);

          ?/**
          ??*?需要過濾的地址
          ??*/

          ?private?static?List?urlList?=?Arrays.asList("/pastOrder/filterCsF");

          ?/**
          ??*?是否不需要過濾
          ??*?
          ??*?@param?requestUrl
          ??*????????????請求的url
          ??*?@return
          ??*/

          ?public?boolean?isPast(String?requestUrl)?{
          ??for?(String?url?:?urlList)?{
          ???if?(requestUrl.equals(url))?{
          ????return?true;
          ???}
          ??}

          ??return?false;
          ?}

          ?@Override
          ?public?void?destroy()?{
          ?}

          ?@SuppressWarnings("unchecked")
          ?@Override
          ?public?void?doFilter(ServletRequest?request,?ServletResponse?response,
          ???FilterChain?chain)
          ?throws?IOException,?ServletException?
          {
          ??log.info("過濾器2執(zhí)行開始");
          ??String?url?=?((HttpServletRequest)?request).getRequestURI().substring(((HttpServletRequest)request).getContextPath().length());

          ??//通過地址對特定的請求進行處理,如果不需要可以不用,如果不用,就會對使用的請求進行過濾
          ??if?(isPast(url))?{
          ???MyHttpServletRequestWrapper1?requestWrapper1?=?new?MyHttpServletRequestWrapper1(
          ?????(HttpServletRequest)?request);
          ???//?1.獲取需要處理的參數(shù)
          ???String?email?=?requestWrapper1.getParameter("email");
          ???//?2.把處理后的參數(shù)放回去(這里是大小轉小寫處理)
          ???requestWrapper1.setParameter("email",?email.toLowerCase());
          ???//?3.放行,把我們的requestWrapper1放到方法當中
          ???chain.doFilter(requestWrapper1,?response);
          ??}?else?{
          ???chain.doFilter(request,?response);
          ??}
          ?}

          ?@Override
          ?public?void?init(FilterConfig?arg0)?throws?ServletException?{
          ?}
          }
          第三步:過濾器的配置
          方法一、在web.xml文件里面進行簡單的配置(一般項目)
          把我們的過濾器在該文件中注冊
          ?
          ???<filter>??
          ?????<filter-name>ValidatorFilter1filter-name>??
          ?????
          ?????<filter-class>com.zhh.filter.ValidatorFilter1filter-class>??
          ?filter>??
          ?<filter-mapping>??
          ?????<filter-name>ValidatorFilter1filter-name>??
          ?????<url-pattern>/*url-pattern>??
          ?filter-mapping>??
          方法二、springboot項目的配置
          新建一個配置類,加上@Configuration注解,在方法頭加上@Bean注解
          @Configuration
          public?class?WebFileterConfig?{
          ?/**
          ?????*?配置過濾器
          ?????* order屬性:控制過濾器加載順序:數(shù)字越小,加載越早
          ?????*?@return
          ?????*/

          ????@Bean
          ????public?FilterRegistrationBean?ValidatorFilterRegistration()?{
          ????????//新建過濾器注冊類
          ????????FilterRegistrationBean?registration?=?new?FilterRegistrationBean();
          ????????//?添加我們寫好的過濾器
          ????????registration.setFilter(?new?ValidatorFilter1());
          ????????//?設置過濾器的URL模式
          ????????registration.addUrlPatterns("/*");
          ????????registration.setOrder(Integer.MAX_VALUE-10);
          ????????return?registration;
          ????}
          }
          controller 接收參數(shù)代碼:
          ?/**
          ??*?過濾方法測試
          ??*/

          ?@RequestMapping("/filterCsF2")
          ?public?void?filterCs22(String?email,String?userName){
          ??System.out.println("處理后的參數(shù):"+userName+"??"+email);
          ?}
          請求示例代碼:
          html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          <html?xmlns="http://www.w3.org/1999/xhtml">
          <head>
          <meta?http-equiv="Content-Type"?content="text/html;?charset=utf-8"?/>
          <title>請求demotitle>
          head>

          <body>

          ?<form?id="userForm"?action="#"?method="post">
          ??????? username:<input?type="text"?id?="userName"?name="userName"?value="21088888"/><br/><br>
          ??????? email:<input?type="text"?id?="email"?name="email"?value="[email protected]"/><br/><br/>
          ?? age:<input?type="text"?id?="age"?name="age"?value="18"/><br/><br/>
          ??????
          ????????<input?type="reset"?value="重置"/>  
          ????????<input?type="button"?id?="sub"?value="提交">
          ????form>

          body>
          ????<script?src="jquery.min.js">script>
          <script?type="text/javascript">
          ?
          ???$("#sub").click(
          ?function(){
          ??var?userName?=?$("#userName").val();?
          ????var?email?=?$("#email").val();?
          ??????var?age?=?$("#age").val();?
          ???$.ajax({
          ???type?:?"POST",
          ???url:'http://127.0.0.1:8080/merchant_wap/pastOrder/filterCsF2',
          ???dataType?:?"json",
          ???data?:?{
          ?????"userName":userName,
          ?????"age":age,
          ?????"email":email
          ???},
          ???success?:?function(data)?{
          ???alert("33");
          ???},
          ???error?:?function(data)?{
          ???alert("cccc"+data.email);
          ???}
          ??});
          ??}
          ???);
          script
          >
          html>
          處理結果:
          處理后的參數(shù):21088888 [email protected]
          從結果可以看出,我們成功的通過過濾器對請求的email進行大寫轉小寫處理

          2.json格式的報文請求;

          第一步:新建一個類
          這個類繼承自HttpServletRequestWrapper
          package?com.zhh.util.request;

          import?java.io.BufferedReader;
          import?java.io.ByteArrayInputStream;
          import?java.io.IOException;
          import?java.io.InputStreamReader;

          import?javax.servlet.ServletInputStream;
          import?javax.servlet.http.HttpServletRequest;
          import?javax.servlet.http.HttpServletRequestWrapper;

          import?jodd.io.StreamUtil;

          /**
          ?*?重寫?HttpServletRequestWrapper
          ?*?處理json報文請求
          ?*?@author?zhaoheng
          ?*
          ?*/

          public?class?MyHttpServletRequestWrapper?extends?HttpServletRequestWrapper{??
          ?
          ??private??byte[]?body;?//用于保存讀取body中數(shù)據(jù)???

          ?????public?MyHttpServletRequestWrapper(HttpServletRequest?request)?throws?IOException?{????
          ?????????super(request);
          ?????????//讀取請求的數(shù)據(jù)保存到本類當中
          ?????????body?=?StreamUtil.readBytes(request.getReader(),?"UTF-8");????
          ?????}
          ?????//覆蓋(重寫)父類的方法
          ?????@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();????
          ?????????????}?
          ?????????};????
          ?????}
          ????
          ?????/**
          ??????*?獲取body中的數(shù)據(jù)
          ??????*?@return
          ??????*/

          ?public?byte[]?getBody()?{
          ??return?body;
          ?}
          ?/**
          ??*?把處理后的參數(shù)放到body里面
          ??*?@param?body
          ??*/

          ?public?void?setBody(byte[]?body)?{
          ??this.body?=?body;
          ?}
          }??
          通過建立這個類我們就能完成向request對象添加我們處理之后的參數(shù)了。
          第二步:通過實現(xiàn)filter接口建一個過濾器
          package?com.zhh.filter;

          import?java.io.BufferedReader;
          import?java.io.IOException;
          import?java.util.Arrays;
          import?java.util.HashMap;
          import?java.util.List;
          import?java.util.Map;
          import?java.util.Map.Entry;

          import?javax.servlet.Filter;
          import?javax.servlet.FilterChain;
          import?javax.servlet.FilterConfig;
          import?javax.servlet.ServletException;
          import?javax.servlet.ServletRequest;
          import?javax.servlet.ServletResponse;
          import?javax.servlet.http.HttpServletRequest;

          import?org.apache.log4j.Logger;

          import?com.alibaba.fastjson.JSON;
          import?com.alibaba.fastjson.JSONObject;
          import?com.zhh.util.request.MyHttpServletRequestWrapper;

          /**
          ?*?參數(shù)校驗過濾器(針對json報文請求) 1.獲取請求參數(shù);2.對獲取到的請求參數(shù)進行處理(解密、字符串替、請求參數(shù)分類截取等等);3.把處理后的參數(shù)放回到請求列表里面
          ?*?
          ?*?@author?zhaoheng
          ?*
          ?*/

          public?class?ValidatorFilter?implements?Filter?{

          ?private?static?final?Logger?log?=?Logger.getLogger(ValidatorFilter.class);

          ?/**
          ??*?需要過濾的地址
          ??*/

          ?private?static?List?urlList?=?Arrays.asList("/pastOrder/filterCs");
          ?/**
          ??*?是否需要過濾
          ??*?
          ??*?@param?requestUrl
          ??*????????????請求的url
          ??*?@return
          ??*/

          ?public?boolean?isPast(String?requestUrl)?{
          ??for?(String?url?:?urlList)?{
          ???if?(requestUrl.equals(url))?{
          ????return?true;
          ???}
          ??}
          ??return?false;
          ?}

          ?@Override
          ?public?void?destroy()?{
          ??log.info("過濾器執(zhí)行結束");
          ?}

          ?@SuppressWarnings("unchecked")
          ?@Override
          ?public?void?doFilter(ServletRequest?request,?ServletResponse?response,
          ???FilterChain?chain)
          ?throws?IOException,?ServletException?
          {
          ??log.info("過濾器1執(zhí)行開始");
          ??String?url0?=?((HttpServletRequest)?request).getRequestURI();
          ??String?url1?=?((HttpServletRequest)?request).getContextPath();
          ??System.out.println("完整地址:"+url0);
          ??System.out.println("返回當前頁面所在的應用的名字:"+url1);
          ??System.out.println("返回當前頁面所在的應用的名字長度:"+url1.length());
          ??
          ??//?獲取請求地址
          ??String?url?=?((HttpServletRequest)?request).getRequestURI().substring(((HttpServletRequest)request).getContextPath().length());
          ??System.out.println("截取后的地址:"+url);
          ??
          ??if?(isPast(url))?{
          ???//處理json報文請求
          ???MyHttpServletRequestWrapper?requestWrapper?=?new?MyHttpServletRequestWrapper(
          ?????(HttpServletRequest)?request);
          ???//?讀取請求內容
          ???BufferedReader?br;
          ???br?=?requestWrapper.getReader();
          ???String?line?=?null;
          ???StringBuilder?sb?=?new?StringBuilder();
          ???while?((line?=?br.readLine())?!=?null)?{
          ????sb.append(line);
          ???}
          ???//?將json字符串轉換為json對象
          ???JSONObject?jsonObject?=?JSONObject.parseObject(sb.toString());

          ???Map?map?=?new?HashMap();
          ???//?把json對象轉換為Map集合
          ???map?=?JSON.toJavaObject(jsonObject,?Map.class);
          ???for?(Entry?entry?:?map.entrySet())?{
          ????//?把郵箱地址轉換為小寫
          ????if?(entry.getKey().equals("email"))?{
          ?????map.put(entry.getKey(),?entry.getValue().toString()
          ???????.toLowerCase());
          ????}
          ???}
          ???
          ???//?把參數(shù)轉換之后放到我們的body里面
          ???String?json?=?JSON.toJSONString(map);
          ???requestWrapper.setBody(json.getBytes("UTF-8"));
          ???//?放行?
          ???chain.doFilter(requestWrapper,?response);
          ??}?else?{
          ???chain.doFilter(request,?response);
          ??}
          ?}

          ?@Override
          ?public?void?init(FilterConfig?arg0)?throws?ServletException?{

          ?}

          }
          第三步:
          方法一、在web.xml文件里面進行簡單的配置
          把我們的過濾器在該文件中注冊
          ?
          ???<filter>??
          ?????<filter-name>ValidatorFilterfilter-name>?
          ???????
          ?????<filter-class>com.zhh.filter.ValidatorFilterfilter-class>??
          ?filter>??
          ?<filter-mapping>??
          ?????<filter-name>ValidatorFilterfilter-name>??
          ?????<url-pattern>/*url-pattern>??
          ?filter-mapping>??
          方法二、springboot項目的配置
          新建一個配置類,加上@Configuration注解,在方法頭加上@Bean注解
          @Configuration
          public?class?WebFileterConfig?{
          ?/**
          ?????*?配置過濾器
          ?????* order屬性:控制過濾器加載順序:數(shù)字越小,加載越早
          ?????*?@return
          ?????*/

          ????@Bean
          ????public?FilterRegistrationBean?ValidatorFilterRegistration()?{
          ????????//新建過濾器注冊類
          ????????FilterRegistrationBean?registration?=?new?FilterRegistrationBean();
          ????????//?添加我們寫好的過濾器
          ????????registration.setFilter(?new?ValidatorFilter());
          ????????//?設置過濾器的URL模式
          ????????registration.addUrlPatterns("/*");
          ????????registration.setOrder(Integer.MAX_VALUE-10);
          ????????return?registration;
          ????}
          }
          controller 接收參數(shù)代碼:
          /**
          ??*?過濾方法測試
          ??*?@RequestBody?User?user?該注解用于接收json請求的參數(shù)
          ??*?@return
          ??*/

          ?@ResponseBody
          ?@RequestMapping(value?=?"/filterCs")
          ?public?User?filterCs(@RequestBody?User?user){
          ??System.out.println(user.toString());
          ??return?user;
          ?}
          請求報文示例:
          我這里使用的是postman工具進行json參數(shù)請求
          {
          ?"email":?"[email protected]",
          ?"userName":"20181100",
          ?"age":"18"
          }
          返回結果:
          {
          ?"email":?"[email protected]",
          ?"userName":"20181100",
          ?"age":"18"
          }
          通過該過濾器,把email轉換從小寫成功。
          通過以上操作,我們就成功的創(chuàng)建了一個過濾器。

          推薦閱讀:

          我被開除了。。只因為看了罵公司的帖子

          本機號碼一鍵登錄原理與應用

          最近面試BAT,整理一份面試資料《Java面試BATJ通關手冊》,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數(shù)據(jù)庫、數(shù)據(jù)結構等等。

          獲取方式:點個「在看」,點擊上方小卡片,進入公眾號后回復「面試題」領取,更多內容陸續(xù)奉上。

          朕已閱?

          瀏覽 56
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  午夜美女内射黄操操射精网站大胸操逼 | 乱伦激情 | 日本a视频 | 操我AV | 国产熟女一区二区 |