package com.igeek.shop.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
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 javax.servlet.http.HttpServletRequestWrapper;
/**
*
* @author www.igeehome.com
*
* TODO 字符处理
*
* 2018年8月25日上午11:35:14
*/
public class CharEncodingFilter implements Filter {
private String charSet = "ISO8859-1";
/**
* Default constructor.
*/
public CharEncodingFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
//System.out.println("request----:"+ (req instanceof RequestFacade));
//将req进行封装扩展
req = new GeekRequest(req);
//System.out.println(new GeekRequest((Request)request));
//调整编码
//判断请求方法
String method = req.getMethod();
if("POST".equalsIgnoreCase(method)){
//修改编码
req.setCharacterEncoding(charSet);
}
//无论如何都要放行
chain.doFilter(req, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
//获取配置的字符集
String encoding = fConfig.getInitParameter("charSet");
if(encoding!=null && !"".equals(encoding)){
charSet = encoding;
}
}
/**
*
* @author www.igeehome.com
*
* TODO 扩展request
*
* 2018年8月25日下午2:17:48
*/
class GeekRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
private String method = "GET";
/**
* @param request
*/
public GeekRequest(HttpServletRequest request) {
super(request);
this.request = request;
method = request.getMethod();
}
@Override
public String getParameter(String name) {
if(method.equalsIgnoreCase("GET")){
//解码
String value = this.request.getParameter(name);
try {
value = new String(value.getBytes("ISO8859-1"),charSet);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return value;
}
return super.getParameter(name);
}
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> params = new HashMap<>();
//原生request中取出的map不可修改
Map<String, String[]> parameterMap = this.request.getParameterMap();
//统一解码
for(String key : parameterMap.keySet()){
//取一组value出来
String[] values = parameterMap.get(key);
for(int i = 0;i<values.length;i++){
//逐个解码
try {
values[i] = new String(values[i].getBytes("iso8859-1"),charSet);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
//将解码之后的值再次放入map中
params.put(key, values);
}
return params;
}
}
}