springmvc字符编码过滤器CharacterEncodingFilter的使用

字符编码过滤器CharacterEncodingFilter

一、在web.xml中的配置

 <!-- characterEncodingFilter字符编码过滤器 -->
 <filter>
  <filter-name>characterEncodingFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
   <!--要使用的字符集,一般我们使用UTF-8(保险起见UTF-8最好)-->
   <param-name>encoding</param-name>
   <param-value>UTF-8</param-value>
  </init-param>
  <init-param>
   <!--是否强制设置request的编码为encoding,默认false,不建议更改-->
   <param-name>forceRequestEncoding</param-name>
   <param-value>false</param-value>
  </init-param>
  <init-param>
   <!--是否强制设置response的编码为encoding,建议设置为true,下面有关于这个参数的解释-->
   <param-name>forceResponseEncoding</param-name>
   <param-value>true</param-value>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>characterEncodingFilter</filter-name>
  <!--这里不能留空或者直接写 ' / ' ,否者不起作用-->
  <url-pattern>/*</url-pattern>
 </filter-mapping>

二、CharacterEncodingFilter过滤器类浅析

打开该类源码,可以看到该类有三个类属性

private String encoding; //要使用的字符集,一般我们使用UTF-8(保险起见UTF-8最好)
private boolean forceRequestEncoding = false; //是否强制设置request的编码为encoding
private boolean forceResponseEncoding = false; //是否强制设置response的编码为encoding

主要方法只有一个,也就是下面这个,代码逻辑很简单,如注释所解释

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String encoding = getEncoding();
        if (encoding != null) { //如果设置了encoding的值,则根据情况设置request和response的编码
         //若设置request强制编码或request本身就没有设置编码
         //则设置编码为encoding表示的值
            if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
                request.setCharacterEncoding(encoding);
            }
         //若设置response强制编码,则设置编码为encoding表示的值
            if (isForceResponseEncoding()) { //请注意这行代码,下面有额外提醒
                response.setCharacterEncoding(encoding);
            }
        }
        filterChain.doFilter(request, response);
    }
# 额外提醒
if (isForceResponseEncoding()) {
 response.setCharacterEncoding(encoding);
}

是在

filterChain.doFilter(request, response);

之前执行的,这也就是说这段代码的作用是设置response的默认编码方式,在之后的代码里是可以根据需求设置为其他编码的,即这里设置的编码可能不是最终的编码,网上很多文档说这里设置的是最终的编码方式,这是错的。

SpringMVC配置字符编码过滤器CharacterEncodingFilter来解决表单乱码问题

1、GET请求

针对GET请求,可以配置服务器Tomcat的conf\server.xml文件,在其第一个<Connector>标签中,添加URIEncoding="UTF-8"即可,如下所示:

<Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

2、POST请求

但是,针对POST请求,仅配置Tomcat的server.xml文件中的<Connector标签不足以解决乱码问题,因此,需要利用Spring的字符编码过滤器

org.springframework.web.filter.CharacterEncodingFilter

步骤:配置所开发项目的web.xml文件,添加以下内容至文件开头处即可:

<!-- ================start 配置spring的字符编码过滤器================ -->
    <filter>
        <!-- 解决post乱码问题需要配置spring编码过滤器 -->
        <filter-name>characterEncoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
<!-- ================end 配置spring的字符编码过滤器================ -->

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • springboot全局字符编码设置解决乱码问题

    有时候我们会发现这种问题,明明已经设置了字符编码过滤器但是还会有乱码的情况出现,这个问题令我们很是头疼,我之前也遇到过这种情况.那怎么解决呢? springboot编码格式设置有三种方式,不管使用哪种方式,总有一款适合你. 1.在application.properties中设置 #编码格式 spring.http.encoding.force=true spring.http.encoding.charset=UTF-8 spring.http.encoding.enabled=true se

  • 通过原理解析Spring mvc的内置编码过滤器

    前言 在Spring mvc框架中是如何解决从页面传来的字符串的编码问题的呢? 下面我们来看看Spring框架给我们提供过滤器CharacterEncodingFilter,话不多说了,来一起看看详细的介绍吧. web.xml 中 添加如下配置: <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.Ch

  • 解决springmvc项目中使用过滤器来解决请求方式为post时出现乱码的问题

    在spring项目中,当请求方式为post时,可能在获取数据之后会有乱码的情况,其中一种解决方法就是在拿到请求参数之前设置编码格式为utf-8,如下 request.setCharacterEncoding("utf-8"); String strId = request.getParameter("id"); String strName = request.getParameter("name"); String strSex = reque

  • java springmvc乱码解决归纳整理详解

    springmvc的中文乱码问题主要有以下几种情形: 页面传值到后台: 工程编码(最后一开始建立工程就设置整个工程的编码) 页面的几种编码属性的设置 get提交方式乱码的处理 post提交方式乱码的处理 后台到数据库乱码: 数据库连接字符串指定编码格式 数据库编码属性(也是一开始设置数据库的时候就要设置好,不然要重新建数据库) 1.页面的几种编码属性 pageEncoding="UTF-8" jsp页面编码,jsp文件本身的编码 contentType="text/html;

  • springmvc字符编码过滤器CharacterEncodingFilter的使用

    字符编码过滤器CharacterEncodingFilter 一.在web.xml中的配置 <!-- characterEncodingFilter字符编码过滤器 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter

  • 基于tomcat8 编写字符编码Filter过滤器无效问题的解决方法

    同事遇到编码问题时想做一个解决全站的字符编码过滤器,过滤器类和配置如下: 过滤器类: <span style="font-size:12px;">package com.chaoxing.newspaper.web.filter; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.r

  • Java字符编码简介_动力节点Java学院整理

    1. 概述 本文主要包括以下几个方面:编码基本知识,Java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687".注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来"表示". 2. 编码基本知识 最早的编码是iso88

  • springmvc+shiro自定义过滤器的实现代码

    实现需求: 1.用户未登录,跳转到登录页,登录完成后会跳到初始访问页. 2.用户自定义处理(如需要激活),跳转到激活页面,激活完成后会跳到初始访问页. 使用到的框架 springmvc 的拦截器 shiro 自定义过滤器 实现: 1.编写拦截器通过session保存初始访问的页面地址,便于后面回跳这个页面做准备. import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.serv

  • 字符编码的处理和BeanUtils组件使用详解

    目录 1.字符编码问题解决方案 1.1.字符编码处理的实现 2.字符和谐的问题 在过滤器中设置脏数据 在处理完字符编码问题的时候进行和谐(在处理完编码之后进行调用) 3.BeanUtils组件的使用 Beanutils组件是啥? BeanUtils组件能干啥? BeanUtils组件的使用? 使用BeanUtils组件的API 4.Servlet请求参数的自动封装 5.源数据使用 5.1.数据库的元数据的使用 5.2.请求参数的元数据 5.3.结果集元数据 5.4.封装一个通用的JDBC的增删改

  • Java字符编码原理(动力节点Java学院整理)

    Java开发中,常常会遇到乱码的问题,一旦遇到这种问题,常常比较烦恼,大家都不愿意承认是自己的代码有问题.其实编码问题并没有那么神秘,那么不可捉摸,搞清Java的编码本质过程就真相大白了. 先看个图: 其实,编码问题存在两个方面:JVM之内和JVM之外. 1.Java文件编译后形成class 这里Java文件的编码可能有多种多样,但Java编译器会自动将这些编码按照Java文件的编码格式正确读取后产生class文件,这里的class文件编码是Unicode编码(具体说是UTF-16编码). 因此

  • GBK字符编码(字符集)缺陷导致web安全漏洞

    多字节编码由来 我们先来看看最常用的,最小字符集是ascii,对应的二级制可以表示为:00-7F 编码 .它也是我们计算机使用最早通用的字符集.前期几乎可以表示所有英文字符.后来,更多使用计算机国家加入后,我们就想在计算机中表示中文字符.我们知道常见中文就有7000多个字符.ascii码就只有128字符,只有0-127编码位置,远远不够用了.因此,我们就开始制作更大字符集,并且保证兼容ascii编码.要支持更多字符,选择更大字符集.我们只能用多个字节来描述一个字符了.为了很好的与ascii码,区

  • ajax代理程序,自动判断字符编码

    由于ajax在跨域的访问上有问题,目前最好的方法是做代理.写了个代理程序和心得 为了做ajax的代理,研究了下服务器端的xmlhttp并和客户端的ajax中的xmlhttp做了个比较,后台代码是asp的 服务器端的xmlhttp也就是asp小偷程序,我把代码改成了javascript. 1.在服务器端的xmlhttp.Open("GET",url,false)异步必须是关闭的,而客户端的异步是打开的,这个很好理解. 2.在服务器端的xmlhttp.Responsebody 这里用的是R

随机推荐