通过过滤器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);
        }
    }
}

热门文章

暂无图片
编程学习 ·

前端适配问题总结

前端适配问题总结视口布局的优点:宽度和高度全部自动适应!再加上rem布局的字体适应,可以完美解决各种屏幕适配问题!1.vw:1vw等于视口宽度的1%。2.vh:1vh等于视口高度的1%。3.vmin:选取vw和vh中最小的那个。4.vmax:选取vw和vh中最大的那个。vh and vw:相对于视口的高度…
暂无图片
编程学习 ·

牧牛链,牧牛帮排线

牧牛链医疗鉴证区块链 截至到目前为止,国家大数据局尚未完成对所有医疗机构内生成的医疗数据收集整理,也未完成对居民个人健康档案或病历的电子化进程。医疗机构上传数据和居民主动上传意愿不强烈。越来越多的医疗纠纷报道已经严重影响到医生群体的工作热情。许多医生对于基于…
暂无图片
编程学习 ·

lex yacc flex bison

简介 lex与yacc是两个在Unix下的分别作词法分析和语法分析的工具, Linux对应flex与bison。 Yacc 与 Lex 快速入门 flex 和bison的安装和使用 Windows下安装lex(flex)与yacc(bison)
暂无图片
编程学习 ·

Simulink中定义全局向量

Simulink中定义全局数组变量定义全局变量定义其为Data Dtore Memory创建Data Dtore Memory模块完成 最近在使用simulink时需要用到全局向量,但是在网上搜索到的都是一维的全局变量,也就是一个数,因此自己摸索了一段时间做出这篇总结。 定义全局变量 首先在matlab function中…
暂无图片
编程学习 ·

UE4中让某个UI位于窗口的最顶端

1.处于同一嵌套层级的UI 可以使用Set ZOrder 设置那个Widget位于屏幕的最前面2.创建一个user widget 叫做ui_umg,里面加上两个按钮3.创建另外一个widget 叫做ui_pic,里面加上一个image4.这步是重点,ui_umg中按钮点击的时候 使用create widget 生成一个ui_pic, 但是这个时…
暂无图片
编程学习 ·

sqlite 免费的可视化工具

1.sqliteStudio 介绍:开源,支持多平台 下载:https://github.com/pawelsalawa/sqlitestudio/releases 官网:https://sqlitestudio.pl/ 2.DB Browser 介绍:开源,支持多平台 官网:https://sqlitebrowser.org/ 下载:https://sqlitebrowser.org/dl/ 3.SQLPro 介绍:开源,只…
暂无图片
编程学习 ·

快速排序手撕模板(递归)

void quicksort(vector<int> arr,int left,int right) {if(right<left){return;}int low=left;int high=right;int base=arr[low]; //以最左边的第一个为基准数 //采用双指针方法while(low<left){while(high){if(high<=low) break;if(arr[high]>base){ //右…
暂无图片
编程学习 ·

Linux 通过关键字查询文档内容

命令grep keyword test.log -C500 --colorgrep -C500 keyword test.log --color说明:第一个命令和第二个命令都可以keyword:是要查询的关键字,关键字可以不用引号引起来test.log:是文件名称,即要查询的文件-C500:显示的行数,显示500行,可以没有--color:颜色,给关键字…
暂无图片
编程学习 ·

https://www.cnblogs.com/hdk1993/p/5853233.html

c++文件打开方式详解 csdn编译器使用方法 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与…
暂无图片
编程学习 ·

哈夫曼编码

哈夫曼编码 输入一个字符串文本 #include <stdio.h> #include <stdlib.h> #include <string.h>#define cmax 0x3f3f3f3f // 宏定义一个较大的数,作为比较数据 #define cmaxsize 10000 // 宏定义数组的长度 // ---构建哈夫曼树 // ---定义哈夫曼…
暂无图片
编程学习 ·

内网渗透 -- 获取内网浏览器历史记录等相关信息

“我喜欢你,做我女朋友可以吗?”电话的那头没有反应,男生沉不住气了,小心翼翼地问着,“你在干嘛呀?”“我在点头。”---- 网易云热评环境:小攻:Kali 2020,ip:192.168.1.133小受:win7 x86,ip:192.168.1.137一、生成木马及监听主机参考上篇文章:二、获取浏览器历史…
暂无图片
编程学习 ·

HCL实验8:NAT搭建私有网络

NAT 通过NAT技术,进行私有网络的搭建 拓扑图先对路由器的端口进行配置 R1 [H3C]sys R1 [R1]INT G0/0 [R1-GigabitEthernet0/0]ip address 192.168.56.1 24 [R1-GigabitEthernet0/0]undo shutdown [R1-GigabitEthernet0/0]quit [R1]int s1/0 [R1-Serial1/0]ip address 100.100.…
暂无图片
编程学习 ·

1252 奇数值单元格的数目(模拟)

1. 问题描述:给你一个 n 行 m 列的矩阵,最开始的时候,每个单元格中的值都是 0。另有一个索引数组 indices,indices[i] = [ri, ci] 中的 ri 和 ci 分别表示指定的行和列(从 0 开始编号)。你需要将每对 [ri, ci] 指定的行和列上的所有单元格的值加 1。请你在执行完所有 ind…
暂无图片
编程学习 ·

LeetCode-Algorithms-[Easy]509. 斐波那契数

斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 给定 N,计算 F(N)。 示例 1:输入:2 输出:1 解释:F(2) = F(1) + F…