关于Filter 覆盖getParameterMap 来实现功能

来源:互联网 发布:先帝知臣谨慎中考题 编辑:程序博客网 时间:2024/06/06 02:08

在获得请求中的参数时,有三种方法:getParameter(),getParameterMap(),getParameterValues()。这三种方法在底层实现中是互相调用的。所以若要彻底解决提交乱码的问题,则需要覆盖这三个方法。覆盖getParameterMap(),然后设定开关让其只执行一次,然后让getParameterValues()调用getParameterMap(),在getParameter()中调用getParameterValues(),使这三个方法都可以调用到getParameterMap()下的关键语句,即可彻底解决乱码问题


以过滤器处理乱码为例:

package cn.filter;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.Map;import java.util.Set;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;public class EncodingFilter implements Filter {@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// 解决postrequest.setCharacterEncoding("utf-8");// 解决getEncodingRequest encodingRequest = new EncodingRequest((HttpServletRequest) request);chain.doFilter(encodingRequest, response);}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}}class EncodingRequest extends HttpServletRequestWrapper {private HttpServletRequest request;private boolean hasEncode = false;public EncodingRequest(HttpServletRequest request) {super(request);this.request = request;}// @Override***************此方法无法彻底解决三种调用方法的乱码***********************// public String getParameter(String name) {// String value = request.getParameter(name);// String method = request.getMethod();// if (method.equalsIgnoreCase("post")) {// return value;// }// if (value == null) {// return null;// }//// // 解决get// try {// value = new String(value.getBytes("ISO-8859-1"), "utf-8");// } catch (UnsupportedEncodingException e) {// e.printStackTrace();// }//// return value;// }@Override//*****************关键代码:覆盖三个方法***********************public String getParameter(String name) {String[] values = getParameterValues(name);if (values == null) {return null;}return values[0];}@Overridepublic String[] getParameterValues(String name) {Map<String, String[]> parameterMap = getParameterMap();String[] values = parameterMap.get(name);return values;}@Overridepublic Map getParameterMap() {Map<String, String[]> parameterMap = request.getParameterMap();String method = request.getMethod();if (method.equalsIgnoreCase("post")) {return parameterMap;}// get提交方式 手动转码if (!hasEncode) {Set<String> keys = parameterMap.keySet();for (String key : keys) {String[] values = parameterMap.get(key);if (values == null) {continue;}for (int i = 0; i < values.length; i++) {String value = values[i];// 解决gettry {value = new String(value.getBytes("ISO-8859-1"),"utf-8");// values是一个地址values[i] = value;} catch (UnsupportedEncodingException e) {e.printStackTrace();}}// parameterMap.put(key, values);hasEncode = true;}}return parameterMap;}}


0 0