对表单form get或post提交数据乱码的终极处理方式
2016-09-29 19:56
916 查看
我们先定义一个过滤器叫做EncodeFilter,访问资源时,先走过滤器。解决问题的前提:我们知道处理get方式提交表单要再编码再解码,处理post方式也可以这样。
哎,还是贴代码吧,语言太苍白了
本文仅限于getParameter(),getParameterValues(),getParameterMap().
以后,当我们再次用表单什么的提交数据就可以直接和乱码什么说拜拜了,也不用再和做编码处理了处理
可以直接如下使用:
深度优化--把resposonse响应客户端也过滤了
友情提示:
1、doGet方法的调用还是要有的
哎,还是贴代码吧,语言太苍白了
package com.zgf.filter; import java.io.BufferedReader; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.Principal; import java.util.Enumeration; import java.util.Locale; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpSession; public class EncodeFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //处理post方式的乱码 //request.setCharacterEncoding("utf-8"); HttpServletRequest req = (HttpServletRequest)request; MyRequest myReq = new MyRequest(req); chain.doFilter(myReq, response); } public void destroy() { } } class MyRequest extends HttpServletRequestWrapper { ServletRequest r; private HttpServletRequest req; MyRequest(HttpServletRequest req) { super(req); this.req = req; } @Override public String getParameter(String name) { Map<String,String[]> map = getParameterMap(); if(map.containsKey(name)) return map.get(name)[0]; else return null; //map.get(name)[0]==null?"null":map.get(name)[0] } @Override public String[] getParameterValues(String name) { Map<String,String[]> map = getParameterMap(); return map.get(name); } boolean flag = true; @Override public Map<String,String[]> getParameterMap() { Map<String,String[]> map = req.getParameterMap(); if(flag){ for(Map.Entry<String, String[]> en:map.entrySet()){ String[] arr = en.getValue(); for(int i=0;i<arr.length;i++){ //数组中的每个值都要再编码再解码处理 try { arr[i] = new String(arr[i].getBytes("ISO8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } flag = false; } return map; } }
本文仅限于getParameter(),getParameterValues(),getParameterMap().
以后,当我们再次用表单什么的提交数据就可以直接和乱码什么说拜拜了,也不用再和做编码处理了处理
可以直接如下使用:
String name = request.getParameter("username"); String like = request.getParameterValues("like")[0]
深度优化--把resposonse响应客户端也过滤了
package com.zgf.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; /** * 通用解决 get 和 post乱码过滤器 * */ public class EncodeFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 处理请求乱码 HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletRequest myRequest = new MyRequest(httpServletRequest); // 处理响应乱码 response.setContentType("text/html;charset=utf-8"); 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; } }
友情提示:
1、doGet方法的调用还是要有的
doGet(request,response);2、一般可能会忽略的情况--web.xml文件配置信息
<filter> <filter-name>EncodeFilter</filter-name> <filter-class>com.zgf.filter.EncodeFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodeFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
相关文章推荐
- 终结了form表单的get和post提交方式的中文乱码现象!
- 表单向后台提交数据,get和post的两种方式的根本区别以及如何处理乱码?
- java中form以post、get方式提交数据中文乱码问题总结(转)
- java中form以post、get方式提交数据中文乱码问题总结
- form表单的post,get提交方式分析以及产生的乱码问题
- java中form以post、get方式提交数据中文乱码问题总结
- asp.net JS+form表单Post和Get方式提交数据
- java中form以post、get方式提交数据中文乱码问题总结
- 找到一篇关于form以post、get方式提交数据中文乱码问题总结
- 表单通过get和post方式提交数据解决乱码的方法
- java中form以post、get方式提交数据中文乱码问题总结
- 兼容处理前台post提交form表单和get在地址栏传递中文参数
- js form表单发送数据两种方式(post get)区别
- Android通过Get方式提交数据以及乱码处理
- 数据抓取中post与get方式的处理深入理解(不用给网页标签赋值也不用模拟提交js)
- Android通过Get方式提交数据以及乱码处理
- 用get方式提交form表单的中文处理方式
- Form表单数据传输方式之Get与Post区别
- Form表单中method=post/get两种数据传输的方式的区别
- Android传统HTTP请求get----post方式提交数据(包含乱码问题)