Servlet Filter实现全站统一编码,解决中文乱码问题
为了解决这一问题,我们可以在 Filter 中对获取到的请求和响应消息进行编码处理,这样就可以实现全站编码方式的统一。本节将分步骤演示如何使用 Filter 实现全站编码的统一。
1)编写 form.jsp 页面在 filterDemo01 项目的 WebContent 目录中编写一个 form.jsp 页面,该页面用于提交用户登录的表单信息,如下所示。
%@ page language= java contentType= text/html; charset=utf-8 pageEncoding= utf-8 % !DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd html head meta http-equiv= Content-Type content= text/html; charset=utf-8 title 用户登录 /title /head center h3 用户登录 /h3 /center body >在 form.jsp 中,第 14~16 行代码是一个请求方式为 GET 的超链接;第 17~35 行代码是一个 POST 提交方式 form 表单。
2)创建 Servlet在 filterDemo01 项目的 com.mengma.filter 包中创建一个名称为 CharacterServlet 的 Servlet 类,该类用于获取用户输入的请求参数,并将参数输出到控制台,其代码如下所示。
package com.mengma.filter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CharacterServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println(request.getParameter( name )); System.out.println(request.getParameter( password )); public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); }3)创建过滤器在 filterDemo01 项目的 com.mengma.filter 包中创建一个名称为 CharacterFilter 的 Filter 类,该类用于拦截用户的请求访问,并实现全站编码的统一,其具体实现代码如下所示。
package com.mengma.filter; import java.io.IOException; import java.io.UnsupportedEncodingException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; public class CharacterFilter implements Filter { public void init(FilterConfig fConfig) throws ServletException { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; // 拦截所有的请求,解决全站中文乱码,指定request和response的编码 request.setCharacterEncoding( utf-8 // 只对消息体有效 response.setContentType( text/html;charset=utf-8 // 对 request 进行包装 CharacterRequest characterRequest = new CharacterRequest(request); chain.doFilter(characterRequest,response); public void destroy() { // 继承默认包装类 HttpServletRequestWrapper class CharacterRequest extends HttpServletRequestWrapper { private HttpServletRequest request; public CharacterRequest(HttpServletRequest request) { super(request); this.request = request; // 子类继承父类一定会覆写一些方法,此处用于重写getParameter()方法 public String getParameter(String name) { // 调用被包装对象getParameter()方法,获得请求参数 String value = super.getParameter(name); if (value == null) { return null; String method = super.getMethod(); // 判断请求方式 if ( get .equalsIgnoreCase(method)) { try { value = new String(value.getBytes( iso-8859-1 ), utf-8 } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); return value; // 解决乱码后返回结果 }在 CharacterFilter 中,针对请求的方式不同,采用了不同的乱码解决方式。其中,由于 POST 方式的请求参数存放在消息体中,所以通过 setCharacterEncoding() 方法进行设置,而 GET 方式的请求参数存放在消息头中,通过 HttpServletRequestWrapper 类对 HttpServletRequest 类进行包装,并通过重写 getParameter() 的方式设置 GET 方式提交参数的编码。
需要注意的是,由于要拦截用户访问资源的所有请求,因此需要将 CharacterFilter 映射信息中 filter-mapping 元素拦截的路径设置为 /* ,如下所示:
filter filter-name CharacterFilter /filter-name filter-class com.mengma.filter.CharacterFilter /filter-class /filter filter-mapping filter-name CharacterFilter /filter-name url-pattern /* /url-pattern /filter-mapping4)运行项目并查看结果启动 Tomcat 服务器,在浏览器的地址栏中输入地址 http://localhost:8080/filterDemo01/form.jsp,此时,浏览器窗口中会显示一个用户登录的表单,在这个表单中输入用户名 张三 和密码 1234 ,如图 1 所示。
图 1 运行结果单击图 1 中的【登录】按钮提交表单,此时,MyEclipse 控制台显示的结果如图 2 所示。
图 2 控制台窗口从图 2 中可以看出,form.jsp 表单中输入的信息已经显示在了控制台窗口中,而且中文的用户名也没有出现乱码。需要注意的是,由于 form.jsp 表单的提交方式是 POST,因此可以说明使用 CharacterFilter 类可以解决 POST 提交方式的中文乱码问题。
接下来验证 GET 方式提交表单的乱码问题是否可以解决。单击图 1 中的 单击超链接登录 链接后(这种提交方式相当于 GET 方式提交信息),MyEclipse 控制台窗口显示的结果同样如图 2 所示。因此可以说明,使用 CharacterFilter 类可以解决 GET 提交方式的中文乱码问题。
22481.html
htmljavaJSPServletWeb
相关文章
- Ableton Live 11 Suite for Mac(音乐制作软件)v11.2.0中文激活版
- 华为发布「国产Copilot内核」PanGu-Coder,而且真的能用中文哦!
- Autodesk 3dmax 2023.1【附激活补丁+安装教程】中文免费版下载
- adobe cs6 系列软件通用破解补丁-Adobe CC全系列注册机-Adobe CC通用破解补丁1.1 中文免费版
- 【错误记录】IntelliJ IDEA 中 Java 代码中的中文注释报错 ( Menu / File / Settings / Editor / File Encodings 中修改工程编码 )
- 前端网页、php与mysql数据库字符编码(解决中文等乱码问题详解数据库
- spring 编码过滤器 防止中文乱码详解编程语言
- 使用git bash 执行Python中文乱码详解编程语言
- MySQL字段名中文编码实现方案(mysql中文列名)
- 查看Linux中文编码的技巧(linux编码查看)
- 深入NLP———看中文分词如何影响你的生活点滴 | 雷锋网公开课
- macOS 使用手册——25字中文文章标题(macos使用手册)
- 如何使MSSQL表支持中文(mssql表怎么支持中文)
- 编码禁止Oracle中使用中文编码(oracle中禁止中文)
- 解决oracle数据库中文编码转英文编码的问题(oracle 中文转英文)
- 里使用Oracle数据库如何设置中文编码(oracle中文设置在那)
- java中文字符串数组按照音序排列
- phpMsSqlserver时遇到的中文编码问题
- asp.net下UTF-7转GB2312编码的代码(中文)
- c#中文gbk编码查询示例代码
- python处理中文编码和判断编码示例
- PHP与MYSQL中UTF8编码的中文排序实例