使用Filter过滤器+重写Request完美解决乱码问题

一:原理

  • 1.对于Post方式提交的数据,我们可以通过直接设置request和response的编码方式来解决乱码问题;但是Get方式提交的数据,那么就需要编码再解码的方式解决乱码问题。
  • 2.我们一般对于GET请求获取参数有两个常用方法: request.getParameter(String name)是获得相应名的数据,如果有重复的名,则返回第一个的值 . 接收一般变量 ,如text类型。 request.getParameterValues(String name)是获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkobx类型 。
  • 3.所以我们的思路就是重写上述这两个方法,达到解决GET取参乱码问题。

二:代码

package cn.zyzpp.filter;

import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

/**
 * 指定过滤器的名称以及过滤的内容
 * 单个页面可用urlPatterns="/advice"
 * 多个页面可用urlPatterns={"/advice","/advice"}
 * @author www.zyzpp.cn
 *
 */
@WebFilter(filterName="filter", urlPatterns="/*")
public class FilterImpl implements javax.servlet.Filter {

    private String encoding="UTF-8";

    public FilterImpl() {

    }

    public void destroy() {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {   

        //1 解决中文乱码问题:1)只能解决POST乱码2)响应乱码
        request.setCharacterEncoding(encoding);
        response.setContentType("text/html;charset="+encoding);  

        //2 创建自定义的Request对象 :解决get乱码
        MyRequest myRequest = new MyRequest((HttpServletRequest) request);  

        //3 放行  
        chain.doFilter(myRequest, response);  

    }

    public void init(FilterConfig fConfig) throws ServletException {

    }

}

  • 继承HttpServletRequestWrapper类 , 重写getParameter()和 getParameterValues()方法
package cn.zyzpp.filter;

import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
 * 继承HttpServletRequestWrapper
 * 重写getParameter()和 getParameterValues()方法
 * @author www.zyzpp.cn
 */
public class MyRequest extends HttpServletRequestWrapper {

    public MyRequest(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);
        if (super.getMethod().equalsIgnoreCase("GET")&&value!=null) {
            try {
                value = new String(value.getBytes("ISO-8859-1"), "utf-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return value;
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (super.getMethod().equalsIgnoreCase("GET")&&values!=null) {
            try {
                int i=0;
                for (String value : values) {
                    values[i++] = new String(value.getBytes("ISO-8859-1"), "utf-8");
                }   
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        }
        return values;
    }

}

本篇博客借鉴于: http:// blog.csdn.net/melissa_heixiu/article/details/52705457 http:// blog.csdn.net/csdn_gia/article/details/54094426 可以看到,第一篇博客的思想是利用的req.getParameterMap()来获取到单个或多个参数;第二篇博客较简单,重写了request.getParameter()。 笔者比着葫芦画瓢,增加了request.getParameterValues()方法,并解决了参数为空导致的自定义Request类空指针异常。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏函数式编程语言及工具

Scalaz(59)- scalaz-stream: fs2-程序并行运算,fs2 running effects in parallel

    scalaz-stream-fs2是一种函数式的数据流编程工具。fs2的类型款式是:Stream[F[_],O],F[_]代表一种运算模式,O代表Str...

1946
来自专栏逍遥剑客的游戏开发

在C#中派生C++的抽象类

2204
来自专栏积累沉淀

CXF 发布 Web Service

使用CXF框架开发 ①.CXF : xfire–>xfire + celtrix 做web service开发的开源框架 ②.开发Server端: 加入...

2406
来自专栏Android Note

Kotlin中run, with, let, also and apply使用方法

1102
来自专栏风中追风

写一个自己的springMVC

今天我们来实现一个简单的springMVC框架,可以理解为 springMVC1.0这个版本,只是功能比较简单而已;

36114
来自专栏Java帮帮-微信公众号-技术文章全总结

第二十一天 IO-递归&字节流&字符流【悟空教程】

递归就是“在一个方法内可以再次调用自身”,如下,method方法又调用了method方法。

1063
来自专栏青青天空树

java导出Excel文件

  最近在java上做了一个EXCEL的导出功能,写了一个通用类,在这里分享分享,该类支持多sheet,且无需手动进行复杂的类型转换,只需提供三个参数即可:

4861
来自专栏Venyo 的专栏

.NET MVC 过滤器执行顺序

以下内容抄自博客园: .net Mvc 过滤器执行顺序: IAuthorizationFilter(OnAuthorization)----->IActionF...

3307
来自专栏流柯技术学院

testng对失败时截图处理

 3.也就是说我们只需要在onTestFailure方法里面调用ScreenShot类里面的takeScreenshot方法即可,但是我们注意到ScreenSh...

1501
来自专栏Python自动化测试

Python学习之time模块(十)

time模块提供了各种与时间有关的功能,想了解该模块的详细信息的可以参考官方的文档:

1434

扫码关注云+社区

领取腾讯云代金券