对表单form get或post提交数据乱码的终极处理方式
来源:互联网 发布:詹姆斯11年总决赛数据 编辑:程序博客网 时间:2024/06/06 19:37
我们先定义一个过滤器叫做EncodeFilter,访问资源时,先走过滤器。解决问题的前提:我们知道处理get方式提交表单要再编码再解码,处理post方式也可以这样。
哎,还是贴代码吧,语言太苍白了
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] }@Overridepublic String[] getParameterValues(String name) {Map<String,String[]> map = getParameterMap();return map.get(name);} boolean flag = true;@Overridepublic 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 {@Overridepublic void destroy() {}@Overridepublic 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);}@Overridepublic 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;}// 对需要增强方法 进行覆盖@Overridepublic 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();}@Overridepublic String getParameter(String name) {Map<String, String[]> parameterMap = getParameterMap();String[] values = parameterMap.get(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;}}
友情提示:
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>
0 0
- 对表单form get或post提交数据乱码的终极处理方式
- 终结了form表单的get和post提交方式的中文乱码现象!
- form表单的post,get提交方式分析以及产生的乱码问题
- 表单向后台提交数据,get和post的两种方式的根本区别以及如何处理乱码?
- HTML form 表单提交方式get和post的区别
- form表单get和post提交方式的不同
- form表单提交数据get,post请求的区别
- 用get方式提交form表单的中文处理方式
- 表单通过get和post方式提交数据解决乱码的方法
- get/post 提交表单乱码的问题
- asp.net JS+form表单Post和Get方式提交数据
- 找到一篇关于form以post、get方式提交数据中文乱码问题总结
- java中form以post、get方式提交数据中文乱码问题总结
- java中form以post、get方式提交数据中文乱码问题总结
- java中form以post、get方式提交数据中文乱码问题总结
- java中form以post、get方式提交数据中文乱码问题总结
- java中form以post、get方式提交数据中文乱码问题总结
- java中form以post、get方式提交数据中文乱码问题总结
- SDNU 1172.Queue nlogn的最长子序列算法
- 回调
- Python中列表与元组的使用
- 51nod-1435 位数阶乘
- Herbernate------关联映射
- 对表单form get或post提交数据乱码的终极处理方式
- Linux中链接文件的命令
- 使用elasticsearch遇到的一些问题以及解决方法(不断更新)
- Makefile嵌套学习
- Oracle数据库在Windows环境下导出并定时备份
- [数据结构]抽象数据类型&算法
- struts1的执行流程
- RecyclerView&CardView
- 第五周-raptor 给定两个正整数 输出正差值