通过过滤器Filter解决post/get请求中文编码问题示例代码

##编码过滤器

功能:将客户端发送过来的数据(尤其是中文)都转换成UTF-8,这样后续的处理就不需要做其他额外的编码转换,做到编码前后统一

实现说明:
对于post请求以及响应可以直接调用setCharacterEncoding方法设置编码格式,而对于get请求,由于get请求参数是通过路径传参,而不是通过请求实体传参,所以setCharacterEncoding方法对get请求无效; 要解决get请求编码问题,需要重写request对象的getParameter方法,手动进行编码转换。

示例代码:

package filters;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
 * 编码过滤器
 *
 * 功能:将客户端发送过来的信息(尤其是中文)都转换成UTF-8,这样后续的处理就不需要做其他额外转换
 * 实现说明:
 *     对于post请求以及响应可以直接调用setCharacterEncoding方法设置编码格式
 *     而对于get请求,由于get请求参数是通过路径传参,所以setCharacterEncoding方法对get请求无效
 *     需要重写request对象的getParameter方法,手动进行编码转换
 */
@WebFilter(filterName = "EncodingFilter", urlPatterns = {"/*"}, initParams = {@WebInitParam(name = "encoding", value = "UTF-8")})
public class EncodingFilter implements Filter {

    private FilterConfig config;

    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        String encoding = config.getInitParameter("encoding");
        if (encoding == null) {
            encoding = "UTF-8";
        }
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        //request GET
        request = new MyHttpServletRequest(request);
        //request POST
        request.setCharacterEncoding(encoding);
        //response
        response.setCharacterEncoding(encoding);
        chain.doFilter(request, response);
    }

    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }

    private class MyHttpServletRequest extends HttpServletRequestWrapper {
        private HttpServletRequest request;

        public MyHttpServletRequest(HttpServletRequest request) {
            super(request);
            this.request = request;
        }

        @Override
        public String getParameter(String name) {
            if ("get".equalsIgnoreCase(request.getMethod())) {
                String oriVal = request.getParameter(name);
                return oriVal == null ? null : new String(oriVal.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
            }
            return super.getParameter(name);
        }
    }
}

热门文章

暂无图片
编程学习 ·

PCL点云焊点提取

滚回来更新一篇文章,和各位交流一下 待处理点云: 数量级:百万 类型:零部件 描述:弯曲表面上有一些凸起在上面,需要提取凸起和平面接触的一圈点云,作为焊接的加工点参考:https://zhuanlan.zhihu.com/p/32111069其实这篇文章也算是全面了,思路和他的差不多,只是算法不太一…
暂无图片
编程学习 ·

学习Java第十六天

Java多态(下) 接口 接口定义了某一批类所要遵守的规范,接口不关心这些类的内部数据,页不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法 语法: [修饰符] interface 接口名 [ extends 父接口1,父接口2...] {零到多个常量定义...零到多个抽象方法的定义...零…
暂无图片
编程学习 ·

安卓安全那点事

本文旨在对于一个安卓app的安全知识做一个较为泛泛的总结,为开发出更安全的应用提供思路。内容比较粗略,仅起到抛砖引玉的效果,还望大家见谅。Android应用的安全 意义 在维基百科上有一个关于计算机安全的定义: 计算机安全(computer security)是计算机与网络领域的信息安…
暂无图片
编程学习 ·

超星尔雅《中庸》精读

超星学习通app《中庸》精读 答案 孟琢“四书”的形成(一)1【单选题】著作( )是一部论述了人生修养境界的道德哲学专著。 答案:《中庸》A、《周易》B、《史记》C、《诗经》D、《中庸》2【单选题】中国古代思想家( )是儒家学派的创始人,被后世尊称为万世师表。 答案:孔子A、孔…
暂无图片
编程学习 ·

如何快速把图片中的任务删掉?

(1)打开PS编辑软件,Ctrl + O打开新的图片,图片如下(2)Shift + L选择套索工具(3)使用套索工具在任务周边绕一圈(5)鼠标右键,选择填充,100%透明,确定(Enter)(6)Ctrl + D完成如下图 演示到此结束!
暂无图片
中恒嘉业 ·

Heap Sort 讲解

Heap Sort sorts a group of unordered elements using the Heap data structure. The sorting algorithm using a Min Heap is as follows: Heapify all elements into a Min HeapRecord and delete the top elementPut to top element into an array T that stores all so
暂无图片
cgfy ·

8. 源码分析之ConsumeQueue

源码分析之ConsumeQueue 消息发送时数据在ConsumeQueue的落地 ​ 连续发送5条消息,消息是不定长,首先所有信息先放入 Commitlog中,每一条消息放入Commitlog的时候都需要上锁,确保顺序的写入。 ​ 当Commitlog写成功了之后。数据…
暂无图片
coreui ·

Heap Sort 讲解

Heap Sort sorts a group of unordered elements using the Heap data structure. The sorting algorithm using a Min Heap is as follows: Heapify all elements into a Min HeapRecord and delete the top elementPut to top element into an array T that stores all so
暂无图片
未来博客 ·

Heap Sort 讲解

Heap Sort sorts a group of unordered elements using the Heap data structure. The sorting algorithm using a Min Heap is as follows: Heapify all elements into a Min HeapRecord and delete the top elementPut to top element into an array T that stores all so
暂无图片
建站日记 ·

[react] 你觉得react上手快不快?它有哪些限制?

[react] 你觉得react上手快不快?它有哪些限制? 相对vue来说不快。 限制 需要学习JSX需要工程化的配置需要对原生JavaScript有相当的掌握react只是一个UI层面的库,像vue内置了动画处理、keep-alive等功能,react则需要去找第三方库…
暂无图片
mfbz ·

AOV网是否存在回路-拓扑排序-C++

拓扑排序是对测试AOV网是否存在回路的方法! 拓扑排序的过程中,由于需要查找所有以某顶点为尾的弧,即找到该顶点的所有出边,故图要采用邻接表的存储方式。但拓扑排序较邻接表的存储方式有一点不同,由于要查找入度为0的点…
暂无图片
mfbz ·

[react] 你觉得react上手快不快?它有哪些限制?

[react] 你觉得react上手快不快?它有哪些限制? 相对vue来说不快。 限制 需要学习JSX需要工程化的配置需要对原生JavaScript有相当的掌握react只是一个UI层面的库,像vue内置了动画处理、keep-alive等功能,react则需要去找第三方库…
暂无图片
珊珊日记 ·

AOV网是否存在回路-拓扑排序-C++

拓扑排序是对测试AOV网是否存在回路的方法! 拓扑排序的过程中,由于需要查找所有以某顶点为尾的弧,即找到该顶点的所有出边,故图要采用邻接表的存储方式。但拓扑排序较邻接表的存储方式有一点不同,由于要查找入度为0的点…
暂无图片
珊珊日记 ·

8. 源码分析之ConsumeQueue

源码分析之ConsumeQueue 消息发送时数据在ConsumeQueue的落地 ​ 连续发送5条消息,消息是不定长,首先所有信息先放入 Commitlog中,每一条消息放入Commitlog的时候都需要上锁,确保顺序的写入。 ​ 当Commitlog写成功了之后。数据…