您的位置:首页 > 编程语言 > Java开发

javaWed项目中用过滤器实现转码功能,敏感词汇过滤更能,处理Get和Post接收数据中的中文乱码问题以及敏感词汇的处理

2016-10-09 08:49 921 查看
通过过滤器可以解决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");


每次都得这样处理,很麻烦,因此我们需要写一个用来转码的过滤器

转码处理原理:在客户端每次发起请求时,都会先调用过滤器,通过过滤器践行分析,分别对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>


欢迎大神来提意见!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息