使用filter解决request.getParameter的中文乱码问题
注意:一般一个站点的所有页面的编码,包括数据库编码都要保持一致,下面默认的编码都是UTF-8
----------------------------------例1:直接提交到jsp页面----------------------------------
input_info.html
<!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>Insert title here</title>
</head>
<body>
<form action="display_info.jsp" method="post">
<!-- 输入中文来测试 -->
请输入要显示的内容:<input type="text" name="info">
<input type="submit" value="显示">
</form>
</body>
</html>
display_info.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>Insert title here</title>
</head>
<body>
<!--
注意这里并没有调用request.setCharacterEncoding(),
你把CharacterEncodingFilter关闭了试试,看看结果有什么
不一样
-->
<%
String str = (String) request.getParameter("info");
%>
<h1><%=str%></h1>
</body>
</html>
CharacterEncodingFilter.java
charset参数是从web.xml中配置好的,这里读取进来
public final class CharacterEncodingFilter implements Filter {
private String encoding = null;
private boolean enable = false;
public void destroy() {
this.encoding = null;
}
/**
* 完成request.setCharacterEncoding(encoding);
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (this.enable) {
String encoding = this.selectEncoding(request);
if (encoding != null && !encoding.equals("")) {
request.setCharacterEncoding(encoding);
}
}
// Pass control on to the next filter
chain.doFilter(request, response);
// After other filters are done:
if (this.enable) {
String encoding = this.selectEncoding(request);
if (encoding != null && !encoding.equals("")) {
// response.setCharacterEncoding(encoding); // 实验证明这货没起什么作用,所以,不要也行
}
}
}
/**
* 读取encoding参数以及enable参数,enable参数与encoding的功能无关,只是用来启用或者停用这个filter的
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.encoding = filterConfig.getInitParameter("encoding");
if (!Charset.isSupported(encoding)) {
encoding = null; // 如果不支持的话,只能选择默认的encoding了,这个filter就不起作用
}
// 读取enable参数
String enableString = filterConfig.getInitParameter("enable");
if (enableString.equalsIgnoreCase("true")) {
this.enable = true;
} else {
this.enable = false;
}
}
}
web.xml
<filter>
<filter-name>charset-encoding</filter-name>
<filter-class>org.foo.filterdemo.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>enable</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charset-encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
--------例2:提交到Servlet,Serlvet再设置为request的attribute,再提交到jsp页面--------
AttributeSetterServlet.java
public class AttributeSetterServlet extends HttpServlet {
/**
* Generated serialVersionUID
*/
private static final long serialVersionUID = 8458482445490259121L;
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 在这里也没有调用request.setCharacterEncoding(),
// 你把CharacterEncodingFilter关闭了试试,看看结果有什么
// 不一样
String attr = req.getParameter("attr");
if (attr != null) {
// System.out.println(this + ", " + attr); // @Debug
attr += " -- 这是一个小尾巴";
req.setAttribute("attr", attr);
req.getRequestDispatcher("display_attribute.jsp").forward(req, resp);
}
}
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
}
}
input_attribute.html
<!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>Insert title here</title>
</head>
<body>
<form action="AttributeSetterServlet" method="post">
<!-- 输入中文来测试 -->
请输入要设置的attribute:<input type="text" name="attr">
<input type="submit" value="显示">
</form>
</body>
</html>
display_attribute.jsp
<%@ page language="java" contentType="text/html"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<h1>设置的attribute是:<%=request.getAttribute("attr")%></h1>
</body>
</html>
web.xml中添加如下代码:
<servlet>
<servlet-name>attribute-setter-servlet</servlet-name>
<servlet-class>
org.foo.servletdemo.AttributeSetterServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>attribute-setter-servlet</servlet-name>
<url-pattern>/AttributeSetterServlet</url-pattern>
</servlet-mapping>
使用filter解决request.getParameter的中文乱码问题的更多相关文章
- 解决Request中参数中文乱码问题
1.使用配置过滤器的方式解决 在web.xml中增加过滤器: <!--配置解决中文乱码的过滤器--> <filter> <filter-name>character ...
- tomcat7解决jsp参数传递的中文乱码问题
解决jsp参数传递的中文乱码问题 制作人:全心全意 在jsp页面中,通过参数传递传递中文时,在显示参数值时中文内容变成了乱码.这是因为请求参数的文字编码方式与页面中的不一致造成的,所有的request ...
- SpringMVC学习系列-后记 解决GET请求时中文乱码的问题
SpringMVC学习系列-后记 解决GET请求时中文乱码的问题 之前项目中的web.xml中的编码设置: <filter> <filter-name>CharacterEnc ...
- 解决gitk显示文件内容中文乱码
解决gitk显示文件内容中文乱码 1.git config 命令 设置git gui的界面编码 git config --global gui.encoding utf-8 2.修改配置文件 在~\e ...
- 解决PLSQL Developer 插入中文 乱码问题(转)
原文地址:解决PLSQL Developer 插入中文 乱码问题 PLSQL Developer 插入中文 乱码问题,如图 这个是由于oracle服务器端字符编码 和 Oracle 客户端 字 ...
- 解决windows下vim中文乱码
解决windows下vim中文乱码 windows安装了vim8,也就是gvim后,打开带有中文的文档,显示中文是乱码. 毕竟有许多文档我是用utf-8编码的,所以解决的办法是设置一下编码为utf-8 ...
- fedora23解决gedit和vim中文乱码的问题
fedora23解决gedit和vim中文乱码的问题 a, an, the这些不定/定 冠词并不是在所有的名词 前面都要加. 只有在语义上需要时,才加. 名词的单数/复数 前面不加 冠词的 例子多的是 ...
- 解决 SecureCRT 和 SecureFX 中文乱码
引言 最近老是有小伙伴给我发消息说,下载的 SecureCRT 和 SecureFX 安装打开后连接了自己的服务器或虚拟机后会出现中文乱码,每次都要给一一回复,我倒没事,主要是有时候因为工作的原因,所 ...
- request、response 中文乱码问题与解决方式
request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码: response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码: ...
随机推荐
- iOS: 详细的正则表达式
一.简单的正则规则 1.由数字.26个英文字母或者下划线组成的字符串: ^[-9a-zA-Z_]{,}$ 2.非负整数(正整数 + 0 ): ^/d+$ 3. 正整数: ^[-]*[-][-]*$ 4 ...
- iOS:CoreData数据库的使用一(创建单个数据库表)
CoreData数据库框架:mac系统自带的数据库,它是苹果公司对sqlite进行封装而来的,既提供了对数据库的主要操作,也提供了具体的视图关系模型. 需要用到三个对象: 1•Managed Obje ...
- oc 第五天(内存管理)
OC的重点: 内存管理 1 基本原理 OC的内存回收机制是和JAVA的自动回收机制是不同的,它有两种模式,或者准确的说是同 一种模式的两种不同体现,下面简单总结下. 1手动内存回收 ...
- exchange 升级顺序导致的邮件被发不出的问题?
最近在做一个项目POC,准备升级过程目前的2007 环境到exchange 2010,由于客户环境是exchange 2007 sp1 不满足升级的基本条件,我们必须将exchange 2007 sp ...
- python2 python3编码问题记录
最近在服务器上跑脚本,linux自带的是python 2.x,中文显示经常有问题,通过下面两篇终于弄懂了. https://www.cnblogs.com/575dsj/p/7112767.html ...
- 服务 进程守护 MarsDaemon 简介
MarsDaemon 基本功能 https://github.com/Marswin/MarsDaemon It is a lite library, you can make your projec ...
- RHEL7.0 配置网络IP的三种方法
导读 RHEL7里面的网卡命名方式从eth0,1,2的方式变成了enoXXXXX的格式. en代表的是enthernet (以太网),o 代表的是onboard (内置),那一串数字是主板的某种索引编 ...
- 设计模式之Programming to an Interface, not anImplementation 程序指向接口,而不是实现
Class inheritance is basically just a mechanism for extending an application's functionality by reus ...
- NSURLConnection经常使用的代理方法
NSURLConnection的代理Protocol定义有三类:NSURLConnectionDelegate.NSURLConnectionDataDelegate和NSURLConnectionD ...
- D3js-对柱状图的增,删,排序
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...