您的位置:首页 > 其它

Filter过滤器处理乱码问题

2016-09-29 22:25 260 查看
当我们从表单获取数据时。

当获取到的数据是中文时,那么就可能会产生乱码。

对于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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  filter 乱码问题