servlet过多时,写一个过滤器专门处理,从而不用频繁地用request
设置;
web.xml中对应的配置
<filter>
<display-name>CharEncordingFilter</display-name>
<filter-name>CharEncordingFilter</filter-name>
<filter-class>com.sea.filter.CharEncordingFilter</filter-class>
<init-param>
<param-name>charSet</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharEncordingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
//过滤器核心代码
public class CharEncordingFilter implements Filter {
private String charSet = "ISO8859-1";
public CharEncordingFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
//将req进行封装扩展
req = new SeaRequest(req);
//判断请求方法
String method = req.getMethod();
if ("post".equalsIgnoreCase(method)) {
//修改编码
req.setCharacterEncoding(charSet);
}
//无论如何都要放行
chain.doFilter(req, response);
}
public void init(FilterConfig fConfig) throws ServletException {
//获取配置的字符集
String encoding = fConfig.getInitParameter("charSet");
if (encoding != null && !"".equals(encoding)) {
charSet = encoding;
}
}
class SeaRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
private String method = "get";
public SeaRequest(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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return value;
}
return super.getParameter(name);
}
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> params = new HashMap<>();
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//将解码之后的值再次放入map中
params.put(key, values);
}
return params;
}
}
}