- 浏览: 27888 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
cevin15:
<div class="quote_title ...
使用过滤器Filter解决tomcat默认编码配置下的传值乱码 -
jak&jin:
学习了,小强写的文章很不错~~ ,保存起来再说
使用过滤器Filter解决tomcat默认编码配置下的传值乱码 -
aki319:
...
Html的一些小经验
最近又拿起jsp+servlet来做项目,遇到了乱码的问题。解决方案很多,这次决定用过滤器来解决传值过程中的乱码问题。当然前提是tomcat没修改过connector配置项中的URIEncoding,即使用tomcat默认的编码配置。
在表单中使用“method”这个属性来指定提交表单时使用的http请求方式。默认是Get方式。
使用Get方式,提交的参数放在请求的url后面,浏览器会对url进行转义。所以,在服务端要用以下代码取得正确的参数,“utf-8”是我使用的页面字符编码。
如果使用的是Post方式,则提交的参数将放在请求的消息体中。这种情况下,只要指定字符串编码就可以了。
好,下面说一下我使用过滤器解决传值乱码的例子。
首先,写个继承HttpServletRequestWrapper的类,扩展一下servlet提供的request的功能。
在上面的类中,我们其实就完成了一件事。在我们使用getParameter(),getParameterValues()取得参数前,先对参数进行了我们之前所说到的第一个动作。
接着,编写一个过滤器。
这里,我们使用过滤器完成了两个动作。首先,如果请求是Post方式的,则request.setCharacterEncoding(encode);如果请求是Get方式的,则使用我们进行了扩展的Request代替原来的Request,这样就做到了对参数进行转码再取值。
接下来,在web.xml中要配置我们的这个过滤器。
在Filter中有个encode参数,用来指定我们所使用的字符编码。
本来以为问题到此就圆满解决了。谁知道,又发现个问题。怎么描述呢?写个例子吧!
纠结了一个下午,跟朋友是各种讨论。终于发现了问题所在。
好,知道问题的所在就可以对症下药了。在我们后台对参数进行解码前,如果能得知参数的编码格式就可以进行正确的解码了。以下,是使用正则表达式对参数进行编码的判断。
在对字符串进行解码前,用正则表达式先进行一下encode的判断。
OK,问题解决~
以上,就是我个人使用过滤器解决tomcat默认编码配置下传值乱码的一个例子。如果有说错误导人的地方,可以在留言中说下。
呃,杰哥...
在表单中使用“method”这个属性来指定提交表单时使用的http请求方式。默认是Get方式。
使用Get方式,提交的参数放在请求的url后面,浏览器会对url进行转义。所以,在服务端要用以下代码取得正确的参数,“utf-8”是我使用的页面字符编码。
String str = new String(request.getParameter("str").getBytes("iso-8859-1"),"utf-8");
如果使用的是Post方式,则提交的参数将放在请求的消息体中。这种情况下,只要指定字符串编码就可以了。
request.setCharacterEncoding(encode);
好,下面说一下我使用过滤器解决传值乱码的例子。
首先,写个继承HttpServletRequestWrapper的类,扩展一下servlet提供的request的功能。
public class Request extends HttpServletRequestWrapper { private String encode; public Request(HttpServletRequest request, String encode) { super(request); this.encode = encode; } public String toChi(String para) { try { byte[] bytes = para.getBytes("iso-8859-1"); return new String(bytes, encode); } catch (Exception ex) { } return null; } private HttpServletRequest getHttpServletRequest() { return (HttpServletRequest) super.getRequest(); } public String getParameter(String name) { return toChi(getHttpServletRequest().getParameter(name)); } public String[] getParameterValues(String name) { String values[] = getHttpServletRequest().getParameterValues(name); if (values != null) { for (int i = 0; i < values.length; i++) { values[i] = toChi(values[i]); } } return values; } }
在上面的类中,我们其实就完成了一件事。在我们使用getParameter(),getParameterValues()取得参数前,先对参数进行了我们之前所说到的第一个动作。
接着,编写一个过滤器。
public class EncodeFilter implements Filter{ private String encode; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpreq = (HttpServletRequest) request; if (httpreq.getMethod().equals("POST")) { request.setCharacterEncoding(encode); } else { request = new Request(httpreq, encode); } chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException { encode = filterConfig.getInitParameter("encode"); } }
这里,我们使用过滤器完成了两个动作。首先,如果请求是Post方式的,则request.setCharacterEncoding(encode);如果请求是Get方式的,则使用我们进行了扩展的Request代替原来的Request,这样就做到了对参数进行转码再取值。
接下来,在web.xml中要配置我们的这个过滤器。
<filter> <filter-name>encodeFilter</filter-name> <filter-class>com.ieread.search.filter.EncodeFilter</filter-class> <init-param> <param-name>encode</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodeFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
在Filter中有个encode参数,用来指定我们所使用的字符编码。
--------------------------------------------事情还有后续----------------------------------------
本来以为问题到此就圆满解决了。谁知道,又发现个问题。怎么描述呢?写个例子吧!
http://www.baidu.com/s?wd= 这是百度的一个搜索地址,你在wd后面随便填,百度都能正确解码。 http://localhost:8015/search/search?userLevel=41001&keyword= 这是我的,在keyword后面随便填,chrome上面也可以正确解码,但是ie和火狐不行。
纠结了一个下午,跟朋友是各种讨论。终于发现了问题所在。
引用
浏览器发送请求时,不管有没有把一个 byte 的数据编成 %xx 的形式,这都不是导致乱码的问题。
问题是出在如果没有预先按某个字符集编成字节,再把各字节转成 %xx 形式的话, 浏览器在发出请求时,一个汉字,是按 GBK 发送 2byte 的数据, 还是按UTF-8发送 3byte 的数据呢
各个浏览器间,不统一。
服务器在接收字节数据后,如果解码使用的字符集与客户端发送的不一致,就导致乱码。
问题是出在如果没有预先按某个字符集编成字节,再把各字节转成 %xx 形式的话, 浏览器在发出请求时,一个汉字,是按 GBK 发送 2byte 的数据, 还是按UTF-8发送 3byte 的数据呢
各个浏览器间,不统一。
服务器在接收字节数据后,如果解码使用的字符集与客户端发送的不一致,就导致乱码。
好,知道问题的所在就可以对症下药了。在我们后台对参数进行解码前,如果能得知参数的编码格式就可以进行正确的解码了。以下,是使用正则表达式对参数进行编码的判断。
Pattern p = Pattern.compile("^(?:[\\x00-\\x7f]|[\\xfc-\\xff]" + "[\\x80-\\xbf]{5}|[\\xf8-\\xfb][\\x80-\\xbf]{4}|" + "[\\xf0-\\xf7][\\x80-\\xbf]{3}|[\\xe0-\\xef][\\x80-\\xbf]" + "{2}|[\\xc0-\\xdf][\\x80-\\xbf])+$"); Matcher ma = p.matcher(para); if(!ma.find()){ encode = "gbk"; }else{ encode = "utf-8"; }
在对字符串进行解码前,用正则表达式先进行一下encode的判断。
OK,问题解决~
以上,就是我个人使用过滤器解决tomcat默认编码配置下传值乱码的一个例子。如果有说错误导人的地方,可以在留言中说下。
评论
2 楼
cevin15
2011-09-23
jak&jin 写道
学习了,小强写的文章很不错~~ ,保存起来再说
呃,杰哥...
1 楼
jak&jin
2011-09-23
学习了,小强写的文章很不错~~ ,保存起来再说
发表评论
-
shell的学习笔记
2013-08-17 13:02 790最近在找工作,前些天被问起shell的问题。发现这块真是自己的 ... -
jwebap,监控web应用的jdbc,http请求,java类
2012-12-05 18:11 852最近在用jwebap。一个用来检测web应用的jdbc链接,h ... -
Tomcat的一些琐事
2012-08-29 17:58 894记录一些tomcat相关的操作问题,备忘 Tomcat “指 ... -
MySql 根据某个字段合并某一列数据
2012-06-06 09:40 0查询语句 SELECT productId, GROUP_CO ... -
Spring框架用注解进行事务控制
2012-05-18 18:07 1428今天纠结了一天呀~~就为了个注解事务控制。 其实很久以前就用过 ... -
oracle.sql.CLOB 转 String
2012-04-27 18:24 1980最近在用oracle数据库,有个oracle.sql.CLOB ... -
对内容列表按英文字母进行排序
2012-01-12 16:45 2197实现对内容列表,比如说种类,地方名按英文字母进行排序。效果如下 ... -
web开发常用组件备忘
2011-11-15 18:49 1285分享一些web开发经常用到的组件,也给自己做个备忘。 1、K ... -
IndexWriter.DeleteDocument与IndexReader.DeleteDocument区别
2011-10-31 15:28 1185转自http://www.cnblogs.com/zengen ... -
J2EE数据验证的一些开发建议
2011-08-30 17:03 1712说在前面:非原创。 输入数据验证:虽然为了用户的方便,可以提 ... -
用cookie实现简单的单点登录功能
2011-08-10 17:35 2777看到篇博文,是关于单点登录的。 引用编写你自己的单点登录(SS ... -
web应用dao层的开发经验小结
2011-07-05 13:08 1229框架用多了,也有些腻。虽然struts2,spring,hib ... -
使用oscache加速你的web程序
2011-06-28 15:31 1297网上找了一下关于web开发方面可使用的缓存技术,发现oscac ... -
Html的一些小经验
2011-06-15 14:03 926写篇文章记录一下做web过程的一些小经验。打算以后想到就补充这 ... -
【转载】MySQL索引类型一览 让MySQL高效运行起来
2011-05-24 11:20 957在网上看到篇介绍MySql索引的文章,觉得不错。转到自己博客, ... -
Tomcat设置网页超链接默认打开映射
2011-05-17 10:42 1237Tomcat设置网页超链接默认打开映射,可以修改tomcat/ ... -
关于Spring的事务管理,基于XML
2011-04-02 14:45 952在Spring中常用的事务传播行为 PROPAGATION ... -
Linux下Tomcat相关的一些命令
2011-03-29 20:29 921启动tomcat: ./startup.sh 关闭tomc ... -
String 与 InputStream互相转换
2011-01-28 11:46 1009String与InputStream互转 1. String ... -
MySql数据在控制台里的导入和导出
2010-12-16 10:35 1678在windows系统下需要进入mysql安装目录中的bin目录 ...
相关推荐
【如何配置Filter过滤器处理JSP中文乱码】 在开发Java Web应用时,尤其是在处理包含中文字符的请求时,可能会遇到中文乱码的问题。解决这个问题的一种常见方法是使用Filter过滤器。以下是配置Filter过滤器处理JSP...
解决 Tomcat 下中文乱码问题 在本文中,我们将讨论如何解决 Tomcat 下中文乱码问题。该问题是由于 Tomcat 默认的字符编码设置不正确引起的。我们将通过设置 Connector 元素的 URIEncoding 属性和在过滤器中设置字符...
### 使用过滤器解决中文乱码问题 在Web开发过程中,经常遇到的一个问题是中文或其它非ASCII字符的乱码问题。这种现象通常出现在浏览器接收的数据与实际编码格式不匹配时。解决此类问题的一种常见方法是使用过滤器...
为了解决这个问题,我们可以利用Java的Servlet过滤器(Filter)机制来处理请求。 1. **创建过滤器**: 在Java Web应用中,过滤器是实现特定功能的一段代码,可以在请求到达目标Servlet之前或之后进行预处理和后...
- 在`web.xml`中注册这个过滤器,并配置初始化参数`encoding`为`UTF-8`,这样所有经过该过滤器的请求都会被设置为UTF-8编码。 ```xml <filter> <filter-name>SetCharacterEncodingFilter</filter-name> <filter...
解决方法是创建一个Servlet过滤器(Filter),在请求到达目标Servlet之前,设定请求的字符编码。以下是一个简单的过滤器示例,用于设置请求的字符编码为UTF-8: ```java public class SetCharacterEncodingFilter ...
- Tomcat的日志输出默认使用平台默认编码,可能导致乱码。可以通过修改`logging.properties`文件,为`java.util.logging.ConsoleHandler.encoding`设置为`UTF-8`。 - 如果使用的是自定义日志框架,如Log4j,需在...
综上所述,通过合理设置JSP页面编码、配置请求过滤器以及进行必要的编码转换,可以有效解决Tomcat环境下中文乱码的问题。在实际应用中,还需要根据具体情况选择合适的解决方案,并注意保持前后端编码的一致性。
这个过滤器会确保所有请求和响应都使用UTF-8编码,从而避免乱码问题。 总之,处理乱码问题需要从多方面考虑,包括但不限于编写乱码过滤类和调整系统配置。通过合理的编码策略和配置,我们可以有效地避免和解决乱码...
Struts框架中的ActionForm乱码问题以及Servlet全局过滤器的转义编码处理是Java Web开发中常见的字符编码问题。在开发基于Struts的Web应用时,乱码主要出现在三个方面:页面显示乱码、参数传递乱码以及国际化资源文件...
以上示例使用Spring框架提供的`CharacterEncodingFilter`过滤器来强制所有请求都使用UTF-8编码。这种方法更加灵活,可以根据具体的应用场景来定制。 #### 三、验证修改结果 修改完成后,可以通过以下几种方式来...
在 Tomcat 服务器中,可以使用以下过滤器来解决中文乱码问题: ```java package com; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet....
【filter过滤器流程】 在Java Web开发中,Filter(过滤器)是用于处理HTTP请求和响应的重要组件。它遵循Servlet规范中的Filter接口,允许开发者在请求到达目标Servlet或JSP之前以及响应离开Servlet之后进行拦截和...
对于POST提交的表单,可以通过创建一个Servlet过滤器(Filter)来解决乱码问题。过滤器会在请求被处理前执行,可以在这里更改请求参数的编码。以下是一个简单的`SetCharacterEncodingFilter`示例: ```java ...
过滤器(Filter)在Java Web应用中扮演了重要角色,它可以用来解决这个问题。过滤器是Servlet API的一部分,允许我们在数据请求到达目标资源之前或之后进行拦截和处理,包括对字符编码的转换,从而避免乱码的出现。 ...
**方法一:实现过滤器(FILTER)设置GBK编码** 1. 参考Tomcat的Servlet-Examples目录下的示例,将 `%TOMCAT安装目录%/WEBAPPS/SERVLET-EXAMPLES/WEB-INF/CLASSES/FILTERS/SETCHARACTERENCODINGFILTER.CLASS` 拷贝到...
如果你的项目包含`web.xml`,确保其中的`<filter>`和`<filter-mapping>`标签用于字符编码过滤器,如`CharacterEncodingFilter`,确保设置正确的编码,例如: ```xml <filter> <filter-name>encodingFilter</...
基于tomcat8 编写字符编码Filter过滤器无效问题的解决方法 在基于tomcat8 的Web应用程序中,字符编码问题是常见的问题之一。特别是在处理POST请求时,中文字符可能会出现乱码的情况。为了解决这个问题,我们可以...
使用过滤器统一设置编码 - 创建一个过滤器类`SetCharacterEncodingFilter`,该过滤器会在请求到达控制器之前设置正确的编码。 - 配置过滤器类: ```java package com.ruder.filters; import java.io....
在Web应用中,由于编码不一致,中文字符可能会出现乱码,而通过自定义过滤器可以有效地解决这个问题。 首先,让我们了解过滤器的工作原理。在Java Web应用中,过滤器通过实现javax.servlet.Filter接口并重写其...