• 适用编码的解决方案


    package cn.itcast.crm.web.filter;
    
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    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;
    
    /**
     * 通用编码解决方案
     * 
     */
    public class GenericEncodingFilter implements Filter {
    	@Override
    	public void destroy() {
    	}
    
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    		// 转型为与协议相关对象
    		HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    		// 对request包装增强
    		HttpServletRequest myrequest = new MyRequest(httpServletRequest);
    		chain.doFilter(myrequest, response);
    	}
    
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException {
    	}
    
    }
    
    // 自定义request对象
    class MyRequest extends HttpServletRequestWrapper {
    
    	private HttpServletRequest request;
    
    	private boolean hasEncode;
    
    	public MyRequest(HttpServletRequest request) {
    		super(request);// super必须写
    		this.request = request;
    	}
    
    	// 对需要增强方法 进行覆盖
    	@Override
    	public Map getParameterMap() {
    		// 先获得请求方式
    		String method = request.getMethod();
    		if (method.equalsIgnoreCase("post")) {
    			// post请求
    			try {
    				// 处理post乱码
    				request.setCharacterEncoding("utf-8");
    				return request.getParameterMap();
    			} catch (UnsupportedEncodingException e) {
    				e.printStackTrace();
    			}
    		} else if (method.equalsIgnoreCase("get")) {
    			// get请求
    			Map<String, String[]> parameterMap = request.getParameterMap();
    			if (!hasEncode) { // 确保get手动编码逻辑只运行一次
    				for (String parameterName : parameterMap.keySet()) {
    					String[] values = parameterMap.get(parameterName);
    					if (values != null) {
    						for (int i = 0; i < values.length; i++) {
    							try {
    								// 处理get乱码
    								values[i] = new String(values[i].getBytes("ISO-8859-1"), "utf-8");
    							} catch (UnsupportedEncodingException e) {
    								e.printStackTrace();
    							}
    						}
    					}
    				}
    				hasEncode = true;
    			}
    			return parameterMap;
    		}
    
    		return super.getParameterMap();
    	}
    
    	@Override
    	public String getParameter(String name) {
    		Map<String, String[]> parameterMap = getParameterMap();
    		String[] values = parameterMap.get(name);
    		if (values == null) {
    			return null;
    		}
    		return values[0]; // 取回参数的第一个值
    	}
    
    	@Override
    	public String[] getParameterValues(String name) {
    		Map<String, String[]> parameterMap = getParameterMap();
    		String[] values = parameterMap.get(name);
    		return values;
    	}
    
    }
    

      

  • 相关阅读:
    数论:扩展欧几里得算法
    数论:四大定理
    数论:完全数
    数论:求解不定方程和同余方程的实验范例
    Python记:列表和元组之序列相加
    动态规划入门:热血实战!
    Python记通用列表操作之切片!
    Python记:索引操作示例:将以数指定年,月,日的日期打印出来
    计算机的性能指标
    动态规划入门(2):01背包问题实践
  • 原文地址:https://www.cnblogs.com/wuxu/p/11000265.html
Copyright © 2020-2023  润新知