標籤:erro col byte 項目需求 family ons 請求 rri filter
目的: 改變請求參數的值,滿足項目需求(如:過濾請求中 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 @Override17 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 @Override29 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 @Override40 public String[] getParameterValues(String name) {41 return parameterMap.get(name);42 }43 44 @Override45 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 //使用複寫後的wrapper41 filterChain.doFilter(changeRequestWrapper, servletResponse);42 }43 44 @Override45 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的請求,都會驗證此參數
使用HttpServletRequestWrapper重寫Request請求參數