1. 程式人生 > >用裝飾者模式,來配置過濾器增強request的編碼問題

用裝飾者模式,來配置過濾器增強request的編碼問題

使用裝飾著模式需要有三個步驟,

  1. 裝飾者和被裝飾者實現相同的介面
  2. 裝飾者內部包含被裝飾者的引用
  3. 重寫被裝飾者的同名方法,進行功能增強
package com.store.filter;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

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

//裝飾者和被裝飾者實現相同的介面,這裡本應該implements HttpServletRequest,
//然而HttpServletRequestWrapper類採用了配置器設計模式, //重寫了HttpServletRequest的所有方法,以便於對接下來,增強HttpServletRequest二進一步開發, //所以這裡extends HttpServletRequestWrapper ,如果implements HttpServletRequest還要重寫 //HttpServletRequest中所有的方法,這也是裝飾者模式的弊端, //如果增強類中的一個方法,需要將類中的所有方法進行重寫 public class MyHttpServletRequst extends HttpServletRequestWrapper
{
private HttpServletRequest request; //裝飾者內部包含被裝飾者的引用 public MyHttpServletRequst(HttpServletRequest request) { super(request); this.request = request; } //重寫被裝飾者的同名方法,進行功能增強 @Override public Map<String, String[]> getParameterMap() { Map<String, String[]> map = new
HashMap<>(); boolean hasEncode = false; if (!hasEncode) { if ("get".equalsIgnoreCase(request.getMethod())) { map = request.getParameterMap(); String newKey = null; String newValue = null; try { for (String key : map.keySet()) { newKey = new String(key.getBytes("ISO-8859-1"), "UTF-8"); String[] values = map.get(key); for (int i = 0; i < values.length; i++) { newValue = new String(values[i].getBytes("ISO-8859-1"), "UTF-8"); values[i] = newValue; } } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else if ("post".equalsIgnoreCase(request.getMethod())) { try { request.setCharacterEncoding("UTF-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } map = request.getParameterMap(); } hasEncode = true; } return map; } @Override public String getParameter(String name) { Map<String, String[]> map = getParameterMap(); String[] strings = map.get(name); if (strings == null) { return null; } else { return strings[0]; } } @Override public String[] getParameterValues(String name) { Map<String, String[]> map = getParameterMap(); String[] strings = map.get(name); return strings; } }