Servlet 中 CharacterEncodingFilter 失效?

# 问题

Spring 提供了CharcterEncodingFilter,专门解决字符串编码的问题。

诡异的是,在类 AbstractAnnotationConfigDispatcherServletInitializer 方法 getFilters 设置了 CharcterEncodingFilter,结果字符集还是乱码

# 排查

首先检查是否是上传的值编码错误:通过 Chrome Debug 工具,传出的值经过解码,是正确的。

再考虑是否是 request 解码错误。request.getCharacterEncoding() 的返回值为 "utf-8"。解码也是没问题。

# 核心

契机:我有一天想从 Eclipse 转入 IDEA,便把项目重新导入一遍。导入的过程中我会想起,一开始是没有问题,后来加了一个模块就开始有问题了。后来想想这个模块是 Spring Security。

在 Servlet 中,Filter 是一个链,而 Spring Security 是第一个过滤链。字符编码必须在第一个链过滤,因为解码之后就不再解码了(直解码一次,之后就返回第一次解码的内容)。

# 解决

在 Security 模块注册 CharcterEncodingFilter。

public class TeachingTestSecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

    @Override
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) {
        FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("encodingFilter", new CharacterEncodingFilter());
        characterEncodingFilter.setInitParameter("encoding", "UTF-8");
        characterEncodingFilter.setInitParameter("forceEncoding", "true");
        characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
    }   

}
时间: 2024-08-15 12:37:18

Servlet 中 CharacterEncodingFilter 失效?的相关文章

servlet中输出流失效问题

问题: servlet中out.pritnt()失效. 原因: 因为同时出现了请求转发,无论请求转发是在out前还是后,都会覆盖掉out. 解决办法: 1.用session保存信息 2.给请求转发单独一个类(这也是为什么需要bean) 注意: 一开始不理解为什么要引入bean,现在知道了,*一个servlet平均下来只能实现一个功能*,这就导致了一些基础代码的重复使用,所以以类形式先封装好bean,用的时候直接调用. 原文地址:https://www.cnblogs.com/zsboke/p/1

转: servlet中的service, doGet, doPost方法的区别和联系

大家都知道在javax.servlet.Servlet接口中只有init, service, destroy方法 但是我们在继承HttpServlet的时候为何一般重写doGet和doPost方法呢 下面我们看一下Servlet源代码: 注意: JDK只是定义了servlet接口,而实现servlet接口的比如tomcat, jboss等服务器 下面我们找到tomcat源代码, 可以到官网下载, 目前最新版本是7.0.53 找到javax.servlet.http.HttpServlet类, 下

Servlet中会话之cookie(7)

1.(1).用户输出URL地址,有效访问某个网站,在该网站上的一系列有效操作,随后关闭浏览器的整个过程,叫一次会话 (2).会话主要解决服务端如何保存每个客户端对应的私有信息. (3).会话主要有二种: a>Cookie技术[客户端技术] b>Session技术 两者的不同就是:session会随着浏览器关闭而失效,但cookie会一直存放在客户端机器上,除非超出Cookie的生命周期. 2.Cookie技术    (1)Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给

编写一个简单登录验证需要记录日志,Servlet中的Cookie

登录验证并记录日志 之前介绍了如何使用Server.mysql.tomcat等知识点编写了一个简单的登录验证.但是现在有了一个新的需求,我想要在登录成功的时候往数据库记录一条日志,登录失败的时候也要记录一下.这个日志要记录用户名.用户的IP地址.登录的时间.还有成功或失败的状态标识. 所以现在需要增加一个表格,用于存储日志信息,如图: 因为大部分思路和之前的写登录验证差不多,只是多了个记录日志,所以我这里就不赘述实现的思路了,直接上代码. 1. 首先需要使用html编写出页面,代码示例: CSS

Servlet中保存的cookie值读取不到

在设计登录时记住密码功能时,很多时候回使用cookie,在Servlet中保存cookie时,再次访问登录页面,没有读取到保存的cookie值,代码如下: 1 Cookie idCookie = new Cookie("id",String.valueOf(user.getId())); 2 Cookie nameCookie = new Cookie("username",URLEncoder.encode(user.getName(), "utf-8&

JSP+Servlet中使用jspsmartupload.jar进行图片上传下载

JSP+Servlet中使用cos.jar进行图片上传 upload.jsp <form action="FileServlet" method="post" enctype="multipart/form-data"> <input type="file" name="myfile"> <input type="text" name="cmt&q

Servlet中service方法

在学习Servlet的过程中,我们大多时候编码都是直接继承HttpServlet这个类,并且重写doGet ,doPost,但是查看Api时我们会发现Servlet接口 ,GenericSevlet抽象类 以及HttpServlet类中都有service方法,那么为什么我们继承HttpSevlet类时不要重写service 而要重写doGet doPost呢?service的作用是什么捏?? 正如上文中所说的,Servlet中,service方法是一直存在的,因为最高层的接口Servlet(像H

Servlet中读取参数的几种方式

为每一Servlet设置初始化参数 可以为每一个Servlet在对应的web.xml中的Servlet节点下编写初始化参数,格式如下: <init-param> <param-name>userName</param-name> <param-value>admin</param-value> </init-param> 然后在servlet中用如下代码获取相应的参数: ServletConfig config = this.getS

jsp/servlet中的编码问题

首先声明以下只是我个人的看法,有部分观点与网上人云亦云的观点不一样,不过凡事必恭亲,我还是相信自己测试的结果 推荐一个很好地URL编码详解http://www.ruanyifeng.com/blog/2010/02/url_encoding.html 与网上的共识是 JSP中 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"