用裝飾者模式,來配置過濾器增強request的編碼問題
阿新 • • 發佈:2018-12-30
使用裝飾著模式需要有三個步驟,
- 裝飾者和被裝飾者實現相同的介面
- 裝飾者內部包含被裝飾者的引用
- 重寫被裝飾者的同名方法,進行功能增強
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;
}
}