如何使用filter過濾器對入?yún)⑦M行處理(完整版)
閱讀本文大概需要 9?分鐘。
來自:blog.csdn.net/Muscleheng/article/details/80067772
遇見的問題:
設(shè)計方案:
解決方案:
普通的表單、ajax請求; json格式的報文請求。(三步搞定)
1.普通的表單、ajax請求;
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 ();??
??//?構(gòu)造方法
?????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);
?????}
}??
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ù)放回去(這里是大小轉(zhuǎn)小寫處理)
???requestWrapper1.setParameter("email",?email.toLowerCase());
???//?3.放行,把我們的requestWrapper1放到方法當中
???chain.doFilter(requestWrapper1,?response);
??}?else?{
???chain.doFilter(request,?response);
??}
?}
?@Override
?public?void?init(FilterConfig?arg0)?throws?ServletException?{
?}
}
?
???<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>??
@Configuration
public?class?WebFileterConfig?{
?/**
?????*?配置過濾器
?????* order屬性:控制過濾器加載順序:數(shù)字越小,加載越早
?????*?@return
?????*/
????@Bean
????public?FilterRegistrationBean?ValidatorFilterRegistration()?{
????????//新建過濾器注冊類
????????FilterRegistrationBean?registration?=?new?FilterRegistrationBean();
????????//?添加我們寫好的過濾器
????????registration.setFilter(?new?ValidatorFilter1());
????????//?設(shè)置過濾器的URL模式
????????registration.addUrlPatterns("/*");
????????registration.setOrder(Integer.MAX_VALUE-10);
????????return?registration;
????}
}
?/**
??*?過濾方法測試
??*/
?@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]
2.json格式的報文請求;
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;
?}
}??
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í)行結(jié)束");
?}
?@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("返回當前頁面所在的應(yīng)用的名字:"+url1);
??System.out.println("返回當前頁面所在的應(yīng)用的名字長度:"+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);
???//?讀取請求內(nèi)容
???BufferedReader?br;
???br?=?requestWrapper.getReader();
???String?line?=?null;
???StringBuilder?sb?=?new?StringBuilder();
???while?((line?=?br.readLine())?!=?null)?{
????sb.append(line);
???}
???//?將json字符串轉(zhuǎn)換為json對象
???JSONObject?jsonObject?=?JSONObject.parseObject(sb.toString());
???Map?map?=?new?HashMap ();
???//?把json對象轉(zhuǎn)換為Map集合
???map?=?JSON.toJavaObject(jsonObject,?Map.class);
???for?(Entry?entry?:?map.entrySet())?{
????//?把郵箱地址轉(zhuǎn)換為小寫
????if?(entry.getKey().equals("email"))?{
?????map.put(entry.getKey(),?entry.getValue().toString()
???????.toLowerCase());
????}
???}
???
???//?把參數(shù)轉(zhuǎn)換之后放到我們的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?{
?}
}
?
???<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>??
@Configuration
public?class?WebFileterConfig?{
?/**
?????*?配置過濾器
?????* order屬性:控制過濾器加載順序:數(shù)字越小,加載越早
?????*?@return
?????*/
????@Bean
????public?FilterRegistrationBean?ValidatorFilterRegistration()?{
????????//新建過濾器注冊類
????????FilterRegistrationBean?registration?=?new?FilterRegistrationBean();
????????//?添加我們寫好的過濾器
????????registration.setFilter(?new?ValidatorFilter());
????????//?設(shè)置過濾器的URL模式
????????registration.addUrlPatterns("/*");
????????registration.setOrder(Integer.MAX_VALUE-10);
????????return?registration;
????}
}
/**
??*?過濾方法測試
??*?@RequestBody?User?user?該注解用于接收json請求的參數(shù)
??*?@return
??*/
?@ResponseBody
?@RequestMapping(value?=?"/filterCs")
?public?User?filterCs(@RequestBody?User?user){
??System.out.println(user.toString());
??return?user;
?}
{
?"email":?"[email protected]",
?"userName":"20181100",
?"age":"18"
}
{
?"email":?"[email protected]",
?"userName":"20181100",
?"age":"18"
}
評論
圖片
表情
