Filter过滤器处理乱码问题
2016-09-29 22:25
260 查看
当我们从表单获取数据时。
当获取到的数据是中文时,那么就可能会产生乱码。
对于Post方式提交的数据,我们可以通过直接设置request和response的编码方式来解决乱码问题。
但是Get方式提交的数据,那么就需要编码再解码的方式解决乱码问题。
比如下面这个代码,我们获取到jsp页面提交的数据。
中文的数据就产生了乱码。
我们直接在Servlet里解决的话,受用范围比较小,也麻烦。
那么我们就想了,直接在Filter里将获取到的数据处理后再发送给Servlet。
下面看Filter里我们怎样实现的。
我们来doFilter里获取到Request对象。
而我们需要在调用getParameter和getParameterValues时就解决乱码问题。
所以,我们需要实现自己的方法,利用装饰设计模式,实现MyRequest类。
代码就不拆开分析了,直接去上面找。
实现getParameter和getParameterValues方法,然后在方法里调用getParameterMap方法,对提交的数据进行编码再解码。
这几需要注意的地方,我们获取到的数组改变的值直接修改的map中的值,因此最好我们直接返回map就可以了。
String[] arr = en.getValue();
当获取到的数据是中文时,那么就可能会产生乱码。
对于Post方式提交的数据,我们可以通过直接设置request和response的编码方式来解决乱码问题。
但是Get方式提交的数据,那么就需要编码再解码的方式解决乱码问题。
比如下面这个代码,我们获取到jsp页面提交的数据。
中文的数据就产生了乱码。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("username"); String like = request.getParameterValues("like")[0]; System.out.println(name); System.out.println(like); }
我们直接在Servlet里解决的话,受用范围比较小,也麻烦。
那么我们就想了,直接在Filter里将获取到的数据处理后再发送给Servlet。
下面看Filter里我们怎样实现的。
package com.qianfeng.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 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) { // String value = req.getParameter(name); // try { // return new String(value.getBytes("ISO8859-1"),"utf-8"); // } catch (UnsupportedEncodingException e) { // e.printStackTrace(); // } // return null; // } @Override public String getParameter(String name) { Map<String,String[]> map = getParameterMap(); return 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(); System.out.println(en.getValue()); System.out.println(arr); 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; } }
我们来doFilter里获取到Request对象。
而我们需要在调用getParameter和getParameterValues时就解决乱码问题。
所以,我们需要实现自己的方法,利用装饰设计模式,实现MyRequest类。
代码就不拆开分析了,直接去上面找。
实现getParameter和getParameterValues方法,然后在方法里调用getParameterMap方法,对提交的数据进行编码再解码。
这几需要注意的地方,我们获取到的数组改变的值直接修改的map中的值,因此最好我们直接返回map就可以了。
String[] arr = en.getValue();
相关文章推荐
- BS开发技巧之四: 处理取中文参数出现乱码问题
- Python处理MLDonkey 下载中文文件乱码问题 (2)
- jsp处理cookie乱码的问题
- MySQL 5.0.16 乱码问题处理办法
- MySQL 5.0.16 乱码问题处理办法
- JAVA笔记3--如何Request,如何处理中文获取乱码问题
- Ajax中文处理乱码问题总结
- PHP中处理截取汉字,出现乱码问题的2个类
- flex处理URL中文乱码的问题
- 怎样处理乱码的问题
- Python处理MLDonkey 下载中文文件乱码问题 (2)
- 项目乱码问题和处理方案
- jsp,struts处理中文乱码问题
- 对java处理tomcat中文乱码问题的理解
- VS写的页面乱码问题的处理
- Python处理MLDonkey 下载中文文件乱码问题
- PHP中处理截取汉字,出现乱码问题的2个类
- 在java中开发Ajax过程中的乱码问题与处理
- MySQL 5.0.16 乱码问题处理办法
- 我的乱码问题处理汇总