通过过滤器可以解决servlet的get和post方法提交数据中的中文乱码问题
- 通常我们是这么处理中文乱码问题的:
- 处理post方式提交的数据乱码:
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
- get方式传递
- 传输方
String name = URLEncoder.encode("张三","UTF-8");
- 接收方
String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");
- 传输方
- 处理post方式提交的数据乱码:
每次都得这样处理,很麻烦,因此我们需要写一个用来转码的过滤器
转码处理原理:在客户端每次发起请求时,都会先调用过滤器,通过过滤器践行分析,分别对Get和Post方式进行转码。
敏感词汇处理原理:将转码后的字符串去与存有敏感词汇的库进行遍历比较,如果包含,就替换成 * 。
代码如下:
servlet代码:
package com.gpf.util;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
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.HttpServletResponse;
/**
* 过滤器,进行转码(解决中文问题)、过滤敏感字
* @author 朝九晚十
*
*/
public class EncordeFilter implements Filter {
List<String> list ;
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
//System.out.println("过滤器正在过滤");
//转型
final HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
//处理Post方式提交的数据乱码问题
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//创建一个request对象的代理对象
HttpServletRequest proxy = (HttpServletRequest) Proxy.newProxyInstance(request.getClass().getClassLoader(),//获取到目标对象类加载器
new Class[]{HttpServletRequest.class},//目标对象的接口
new InvocationHandler() { //处理器
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnValue = null;
//获取方法名字
String methodName = method.getName();
if("getParameter".equals(methodName)){
//接收方法参数
String value = request.getParameter(args[0].toString());
//判断是get还是post
String methodSubmit = request.getMethod();
if("GET".equals(methodSubmit)){
//进行非空判断
if(!("".equals(value))&&value!=null){
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
}
}
//进行敏感字符过滤
for(String str : list){
if(value.contains(str)){
value = value.replace(str, "*");
}
}
return value;
}else{
//调用他的基础方法
returnValue = method.invoke(request,args);
}
return returnValue;
}
});
chain.doFilter(proxy, response);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("过滤器初始化。。。。");
list = new ArrayList<String>();
list.add("恐");
list.add("怖");
list.add("织");
list.add("组");
list.add("诈");
list.add("骗");
}
@Override
public void destroy() {
//System.out.println("过滤器销毁。。。。");
}
}
过滤器是需要在web.xml进行部署的。
注意!
filter部署必须在servlet部署的前面!
web.xml代码如下:
<filter>
<filter-name>EncordeFilter</filter-name>
<filter-class>com.gpf.util.EncordeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncordeFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
欢迎大神来提意见!