使用HttpServletRequestWrapper重寫Request請求參數


目的: 改變請求參數的值,滿足項目需求(如:過濾請求中 lang != zh 的請求)

方法: 1.使用 HttpServletRequestWrapper重寫

 1 public class ChangeRequestWrapper extends HttpServletRequestWrapper {
 2     private Map<String, String[]> parameterMap; // 所有參數的Map集合
 3 
 4     public ChangeRequestWrapper(HttpServletRequest request) {
 5         super(request);
 6         parameterMap = request.getParameterMap();
 7     }
 8 
 9     // 重寫幾個HttpServletRequestWrapper中的方法
10 
11     /**
12      * 獲取所有參數名
13      *
14      * @return 返回所有參數名
15      */
16     @Override
17     public Enumeration<String> getParameterNames() {
18         Vector<String> vector = new Vector<String>(parameterMap.keySet());
19         return vector.elements();
20     }
21 
22     /**
23      * 獲取指定參數名的值,如果有重復的參數名,則返回第一個的值 接收一般變量 ,如text類型
24      *
25      * @param name 指定參數名
26      * @return 指定參數名的值
27      */
28     @Override
29     public String getParameter(String name) {
30         String[] results = parameterMap.get(name);
31         return results[0];
32     }
33 
34 
35     /**
36      * 獲取指定參數名的所有值的數組,如:checkbox的所有數據
37      * 接收數組變量 ,如checkobx類型
38      */
39     @Override
40     public String[] getParameterValues(String name) {
41         return parameterMap.get(name);
42     }
43 
44     @Override
45     public Map<String, String[]> getParameterMap() {
46         return parameterMap;
47     }
48 
49     public void setParameterMap(Map<String, String[]> parameterMap) {
50         this.parameterMap = parameterMap;
51     }
52 }

 


2.新增Filter
 1 public class LangFilter implements Filter {
 2     @Override
 3     public void init(FilterConfig filterConfig) throws ServletException {
 4 
 5     }
 6 
 7     @Override
 8     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
 9 
10         ChangeRequestWrapper changeRequestWrapper = new ChangeRequestWrapper((HttpServletRequest) servletRequest);
11 
12         Map<String, String[]> parameterMap = new HashMap<>(changeRequestWrapper.getParameterMap());
13 
14         String[] strings = parameterMap.get("lang");
//邏輯代碼給定默認的參數值,如果參數不為中文,則直接返回異常
15 if (strings == null || strings.length == 0) { 16 strings = new String[1]; 17 strings[0] = "zh"; 18 parameterMap.put("lang", strings); 19 changeRequestWrapper.setParameterMap(parameterMap); 20 }else{ 21 String language = strings[0]; 22 if (!language.equals("zh")) { 23 Map<String,String> error = new HashMap<>(); 24 error.put("code","500"); 25 26 ServletOutputStream outputStream = null; 27 try { 28 outputStream = servletResponse.getOutputStream(); 29 outputStream.write(JSONUtils.obj2Byte(error)); 30 } finally { 31 if (outputStream != null) { 32 outputStream.flush(); 33 outputStream.close(); 34 } 35 } 36 37 return; 38 } 39 } 40 //使用復寫后的wrapper 41 filterChain.doFilter(changeRequestWrapper, servletResponse); 42 } 43 44 @Override 45 public void destroy() { 46 47 } 48 }

     3.web.xml增加一個過濾器處理

 1   <filter>
 2         <filter-name>languageFilter</filter-name>
 3         <filter-class>com.intercepor.LangFilter</filter-class>
 4         <init-param>
 5             <param-name>encoding</param-name>
 6             <param-value>UTF-8</param-value>
 7         </init-param>
 8         <init-param>
 9             <param-name>forceEncoding</param-name>
10             <param-value>true</param-value>
11         </init-param>
12     </filter>
13 
14     <filter-mapping>
15         <filter-name>languageFilter</filter-name>
16         <url-pattern>*.do</url-pattern>
17     </filter-mapping>

所有.do的請求,都會驗證此參數

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM