您的位置:首页 > 其它

对表单form get或post提交数据乱码的终极处理方式

2016-09-29 19:56 916 查看
我们先定义一个过滤器叫做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]      
    }

@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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息