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

通过过滤器可以解决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>

欢迎大神来提意见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值