- 浏览: 2552245 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
nation:
你好,在部署Mesos+Spark的运行环境时,出现一个现象, ...
Spark(4)Deal with Mesos -
sillycat:
AMAZON Relatedhttps://www.godad ...
AMAZON API Gateway(2)Client Side SSL with NGINX -
sillycat:
sudo usermod -aG docker ec2-use ...
Docker and VirtualBox(1)Set up Shared Disk for Virtual Box -
sillycat:
Every Half an Hour30 * * * * /u ...
Build Home NAS(3)Data Redundancy -
sillycat:
3 List the Cron Job I Have>c ...
Build Home NAS(3)Data Redundancy
filter过滤乱码的问题
我们的系统比较乱,为了兼容老的数据库的GBK编码,我们在整个web里面使用了GBK,但是在某些ajax的时候又不免使用了utf-8,使用的jquery,jmesa等等东东里面,时不时就会有乱码问题,最后这个ecodingfilter就越写越长了,不过还是最终满足了要求,这里将代码贴出来,以备以后使用,CharactorEncodingFilter.java如下:
public class CharactorEncodingFilter implements Filter {
private final static String DEFAULT_ENCODING = "GBK";
private final static String ajaxEncoding = "UTF-8";
protected String commonEncoding;
protected FilterConfig filterConfig;
protected boolean ignore = true;
public CharactorEncodingFilter() {
super();
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.commonEncoding = filterConfig.getInitParameter("encoding");
if (this.commonEncoding == null) {
this.commonEncoding = DEFAULT_ENCODING;
}
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) {
try {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
// 接受第三方cookie
// response.addHeader("P3P","CP=CAO PSA OUR");
// response.setHeader("P3P", "CP=CAO PSA OUR");
if (ignore || (request.getCharacterEncoding() == null)) {
// post with the header named RequestType
if (request.getHeader("RequestType") != null
&& request.getHeader("RequestType").equalsIgnoreCase("ajax")) {
request.setCharacterEncoding(ajaxEncoding);
response.setCharacterEncoding(ajaxEncoding);
if (!ajaxEncoding.equalsIgnoreCase(request.getCharacterEncoding())) {
// 此处代码无法理解。哈哈。不这么写,weblogic10.3就是在ajax提交 的时候有乱码
request.setCharacterEncoding(ajaxEncoding);
response.setCharacterEncoding(ajaxEncoding);
}
response.setContentType("text/html;charset=" + ajaxEncoding);
} else if (request.getHeader("X-Requested-With") != null
&& request.getHeader("X-Requested-With").equalsIgnoreCase ("XMLHttpRequest")) {
// put this code to avoid jmesa messy code
if (request.getHeader("content-type") != null
&& request.getHeader("content-type") != "") {
request.setCharacterEncoding(ajaxEncoding);
}
// WARNING, the under line not allowed
// response.setCharacterEncoding(ajaxEncoding);
response.setContentType("text/html;charset=" + commonEncoding);
} else if (request.getHeader("user-agent") != null
&& request.getHeader("user-agent").contains("Flash")) {
// flash上传组件 带有头{user-agent:Shockwave Flash}信息
request.setCharacterEncoding(ajaxEncoding);
} else {
request.setCharacterEncoding(commonEncoding);
response.setCharacterEncoding(commonEncoding);
response.setContentType("text/html;charset=" + commonEncoding);
}
}
filterChain.doFilter(req, res);
} catch (IOException e) {
e.printStackTrace();
} catch (ServletException e) {
e.printStackTrace();
}
}
public void destroy() {
this.commonEncoding = null;
this.filterConfig = null;
}
// for debug
@SuppressWarnings({ "unused", "unchecked" })
private void showHeaders(HttpServletRequest request) {
Enumeration e = request.getHeaderNames();
while (e.hasMoreElements()) {
Object k = e.nextElement();
DevLog.debug(k + ":" + request.getHeader(k.toString()));
}
}
}
其中比较有用的还是这个
private void showHeaders(HttpServletRequest request) {
Enumeration e = request.getHeaderNames();
while (e.hasMoreElements()) {
Object k = e.nextElement();
DevLog.debug(k + ":" + request.getHeader(k.toString()));
}
}
能打印出header的信息,这样我们才能分辨出不同的请求,比如,jquery的ajax的请求,打印出的信息如下:
jquery header
k=x-requested-with v=XMLHttpRequest
k=accept-language v=en-us,zh-cn;q=0.5
k=referer v=http://localhost:8080/easyjmesa/jsp/jquery.jsp
k=accept v=*/*
k=content-type v=application/x-www-form-urlencoded
k=accept-encoding v=gzip, deflate
k=user-agent v=Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
k=host v=localhost:8080
k=content-length v=29
k=connection v=Keep-Alive
k=cache-control v=no-cache
k=cookie v=JSESSIONID=38A23568899BD404F2357DAA1174F412
jmesa的ajax请求的打印信息如下:
jmesa header
k=x-requested-with v=XMLHttpRequest
k=accept-language v=en-us,zh-cn;q=0.5
k=referer v=http://localhost:8080/easyjmesa/jsp/jmesa.jsp
k=accept v=*/*
k=accept-encoding v=gzip, deflate
k=user-agent v=Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
k=host v=localhost:8080
k=connection v=Keep-Alive
k=cookie v=JSESSIONID=38A23568899BD404F2357DAA1174F412
我就根据里面的是否有content-type这个小小区别,来判断是否要设置utf-8来解决了,jquery乱码和jmesa乱码的冲突问题。
// put this code to avoid jmesa messy code
if (request.getHeader("content-type") != null
&& request.getHeader("content-type") != "") {
request.setCharacterEncoding(ajaxEncoding);
}
其实我自己的项目都比较喜欢采用UTF-8,应该不会遇到这样的问题,但是以后也说不定用得上。呵呵。记录一下。
我们的系统比较乱,为了兼容老的数据库的GBK编码,我们在整个web里面使用了GBK,但是在某些ajax的时候又不免使用了utf-8,使用的jquery,jmesa等等东东里面,时不时就会有乱码问题,最后这个ecodingfilter就越写越长了,不过还是最终满足了要求,这里将代码贴出来,以备以后使用,CharactorEncodingFilter.java如下:
public class CharactorEncodingFilter implements Filter {
private final static String DEFAULT_ENCODING = "GBK";
private final static String ajaxEncoding = "UTF-8";
protected String commonEncoding;
protected FilterConfig filterConfig;
protected boolean ignore = true;
public CharactorEncodingFilter() {
super();
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.commonEncoding = filterConfig.getInitParameter("encoding");
if (this.commonEncoding == null) {
this.commonEncoding = DEFAULT_ENCODING;
}
String value = filterConfig.getInitParameter("ignore");
if (value == null)
this.ignore = true;
else if (value.equalsIgnoreCase("true"))
this.ignore = true;
else if (value.equalsIgnoreCase("yes"))
this.ignore = true;
else
this.ignore = false;
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) {
try {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
// 接受第三方cookie
// response.addHeader("P3P","CP=CAO PSA OUR");
// response.setHeader("P3P", "CP=CAO PSA OUR");
if (ignore || (request.getCharacterEncoding() == null)) {
// post with the header named RequestType
if (request.getHeader("RequestType") != null
&& request.getHeader("RequestType").equalsIgnoreCase("ajax")) {
request.setCharacterEncoding(ajaxEncoding);
response.setCharacterEncoding(ajaxEncoding);
if (!ajaxEncoding.equalsIgnoreCase(request.getCharacterEncoding())) {
// 此处代码无法理解。哈哈。不这么写,weblogic10.3就是在ajax提交 的时候有乱码
request.setCharacterEncoding(ajaxEncoding);
response.setCharacterEncoding(ajaxEncoding);
}
response.setContentType("text/html;charset=" + ajaxEncoding);
} else if (request.getHeader("X-Requested-With") != null
&& request.getHeader("X-Requested-With").equalsIgnoreCase ("XMLHttpRequest")) {
// put this code to avoid jmesa messy code
if (request.getHeader("content-type") != null
&& request.getHeader("content-type") != "") {
request.setCharacterEncoding(ajaxEncoding);
}
// WARNING, the under line not allowed
// response.setCharacterEncoding(ajaxEncoding);
response.setContentType("text/html;charset=" + commonEncoding);
} else if (request.getHeader("user-agent") != null
&& request.getHeader("user-agent").contains("Flash")) {
// flash上传组件 带有头{user-agent:Shockwave Flash}信息
request.setCharacterEncoding(ajaxEncoding);
} else {
request.setCharacterEncoding(commonEncoding);
response.setCharacterEncoding(commonEncoding);
response.setContentType("text/html;charset=" + commonEncoding);
}
}
filterChain.doFilter(req, res);
} catch (IOException e) {
e.printStackTrace();
} catch (ServletException e) {
e.printStackTrace();
}
}
public void destroy() {
this.commonEncoding = null;
this.filterConfig = null;
}
// for debug
@SuppressWarnings({ "unused", "unchecked" })
private void showHeaders(HttpServletRequest request) {
Enumeration e = request.getHeaderNames();
while (e.hasMoreElements()) {
Object k = e.nextElement();
DevLog.debug(k + ":" + request.getHeader(k.toString()));
}
}
}
其中比较有用的还是这个
private void showHeaders(HttpServletRequest request) {
Enumeration e = request.getHeaderNames();
while (e.hasMoreElements()) {
Object k = e.nextElement();
DevLog.debug(k + ":" + request.getHeader(k.toString()));
}
}
能打印出header的信息,这样我们才能分辨出不同的请求,比如,jquery的ajax的请求,打印出的信息如下:
jquery header
k=x-requested-with v=XMLHttpRequest
k=accept-language v=en-us,zh-cn;q=0.5
k=referer v=http://localhost:8080/easyjmesa/jsp/jquery.jsp
k=accept v=*/*
k=content-type v=application/x-www-form-urlencoded
k=accept-encoding v=gzip, deflate
k=user-agent v=Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
k=host v=localhost:8080
k=content-length v=29
k=connection v=Keep-Alive
k=cache-control v=no-cache
k=cookie v=JSESSIONID=38A23568899BD404F2357DAA1174F412
jmesa的ajax请求的打印信息如下:
jmesa header
k=x-requested-with v=XMLHttpRequest
k=accept-language v=en-us,zh-cn;q=0.5
k=referer v=http://localhost:8080/easyjmesa/jsp/jmesa.jsp
k=accept v=*/*
k=accept-encoding v=gzip, deflate
k=user-agent v=Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
k=host v=localhost:8080
k=connection v=Keep-Alive
k=cookie v=JSESSIONID=38A23568899BD404F2357DAA1174F412
我就根据里面的是否有content-type这个小小区别,来判断是否要设置utf-8来解决了,jquery乱码和jmesa乱码的冲突问题。
// put this code to avoid jmesa messy code
if (request.getHeader("content-type") != null
&& request.getHeader("content-type") != "") {
request.setCharacterEncoding(ajaxEncoding);
}
其实我自己的项目都比较喜欢采用UTF-8,应该不会遇到这样的问题,但是以后也说不定用得上。呵呵。记录一下。
发表评论
-
Update Site will come soon
2021-06-02 04:10 1679I am still keep notes my tech n ... -
Portainer 2020(4)Deploy Nginx and Others
2020-03-20 12:06 431Portainer 2020(4)Deploy Nginx a ... -
Private Registry 2020(1)No auth in registry Nginx AUTH for UI
2020-03-18 00:56 436Private Registry 2020(1)No auth ... -
Docker Compose 2020(1)Installation and Basic
2020-03-15 08:10 374Docker Compose 2020(1)Installat ... -
VPN Server 2020(2)Docker on CentOS in Ubuntu
2020-03-02 08:04 455VPN Server 2020(2)Docker on Cen ... -
Nginx Deal with OPTIONS in HTTP Protocol
2020-02-15 01:33 356Nginx Deal with OPTIONS in HTTP ... -
PDF to HTML 2020(1)pdftohtml Linux tool or PDFBox
2020-01-29 07:37 405PDF to HTML 2020(1)pdftohtml Li ... -
Elasticsearch Cluster 2019(2)Kibana Issue or Upgrade
2020-01-12 03:25 720Elasticsearch Cluster 2019(2)Ki ... -
Spark Streaming 2020(1)Investigation
2020-01-08 07:19 295Spark Streaming 2020(1)Investig ... -
Hadoop Docker 2019 Version 3.2.1
2019-12-10 07:39 295Hadoop Docker 2019 Version 3.2. ... -
MongoDB 2019(3)Security and Auth
2019-11-16 06:48 241MongoDB 2019(3)Security and Aut ... -
MongoDB 2019(1)Install 4.2.1 Single and Cluster
2019-11-11 05:07 294MongoDB 2019(1) Follow this ht ... -
Monitor Tool 2019(1)Monit Installation and Usage
2019-10-17 08:22 325Monitor Tool 2019(1)Monit Insta ... -
Ansible 2019(1)Introduction and Installation on Ubuntu and CentOS
2019-10-12 06:15 312Ansible 2019(1)Introduction and ... -
Timezone and Time on All Servers and Docker Containers
2019-10-10 11:18 332Timezone and Time on All Server ... -
Kafka Cluster 2019(6) 3 Nodes Cluster on CentOS7
2019-10-05 23:28 283Kafka Cluster 2019(6) 3 Nodes C ... -
K8S Helm(1)Understand YAML and Kubectl Pod and Deployment
2019-10-01 01:21 326K8S Helm(1)Understand YAML and ... -
Rancher and k8s 2019(5)Private Registry
2019-09-27 03:25 362Rancher and k8s 2019(5)Private ... -
Jenkins 2019 Cluster(1)Version 2.194
2019-09-12 02:53 444Jenkins 2019 Cluster(1)Version ... -
Redis Cluster 2019(3)Redis Cluster on CentOS
2019-08-17 04:07 373Redis Cluster 2019(3)Redis Clus ...
相关推荐
通过以上四个步骤,你可以有效地解决JSP中文乱码问题。当请求到达服务器时,Filter会自动设置请求和响应的字符编码,确保数据在传输过程中不发生乱码。同时,Tomcat服务器配置的`URIEncoding`确保URL中的中文字符也...
### jsp过滤器——解决中文乱码问题 #### 背景介绍 在Web应用开发过程中,特别是使用Java Server Pages (JSP)进行中文字符处理时,经常遇到的一个问题是中文字符显示为乱码。这主要是因为客户端与服务器端之间存在...
在这个文档中,我们将深入探讨如何使用Filter解决中文乱码问题。 首先,我们需要创建一个自定义的Filter类,继承自`javax.servlet.Filter`接口,并实现其中的`init`和`doFilter`方法。`init`方法在Filter初始化时...
本文将详细讲解如何利用过滤器来解决中文乱码问题。 1. **理解中文乱码** 中文乱码通常是因为字符编码不一致导致的。在计算机系统中,字符被编码成二进制表示,不同的编码标准(如GBK、UTF-8等)对同一字符有不同...
在解决中文乱码问题上,过滤器可以设置合适的字符编码,确保数据在传输过程中的正确性。 **三、JSP中文乱码过滤器的实现** 1. **创建Filter类**:首先,我们需要创建一个实现了`javax.servlet.Filter`接口的类,并...
本文将详细讲解如何利用过滤器来解决JavaWeb中的乱码问题。 首先,我们需要理解JavaWeb中的乱码产生的原因。当用户通过浏览器提交数据时,如果服务器接收到的数据编码与服务器内部处理编码不匹配,或者JSP页面的...
### Servlet过滤器解决乱码问题 在Web应用开发过程中,字符编码问题经常出现,尤其是在处理中文等多字节字符时。如果不正确地设置字符编码,可能会导致页面显示乱码。本文将详细介绍如何通过Servlet过滤器来解决这...
本篇将详细讲解如何利用这种过滤器来消除Java Web中的乱码问题。 首先,我们需要理解乱码产生的原因。在Java Web应用中,乱码通常源于字符编码不一致。例如,HTTP请求的数据可能使用UTF-8编码,而服务器默认使用GB...
要使用jsp过滤器解决中文乱码问题,我们需要定义一个过滤器类,实现Filter接口。下面是一个简单的示例代码: ```java public class EncodingFilter implements Filter { @Override public void destroy() { // ...
要解决这个乱码问题,我们可以按照以下步骤创建一个过滤器: 1. 创建Filter类:首先,我们需要创建一个实现了javax.servlet.Filter接口的类。在类中,我们需要重写doFilter()方法,这是过滤器的核心,它将在每次...
Filter(过滤器)是Servlet规范的一部分,用于在请求处理前后执行一些预处理或后处理任务,解决乱码问题就是其中之一。本篇文章将详细讲解如何使用Filter来解决中文乱码问题,并提供相关源码和配置示例。 首先,...
本篇文章将详细探讨SSH框架中的中文乱码问题,以及如何通过实现自定义过滤器(Filter)来解决这一问题。 首先,我们要理解乱码的产生原因。在HTTP请求中,数据编码格式不一致是导致乱码的主要因素。例如,客户端...
为了解决这个问题,本篇文章介绍了一种通过自定义过滤器(Filter)的方式来处理乱码问题的方法。 #### 二、知识点详解 ##### 1. 过滤器(Filter) - **概念**:过滤器是Java Web中的一个重要组件,它可以拦截用户...
本文将重点解析“关于处理中文乱码问题 Filter 代码”的相关知识点,并结合Java Servlet API进行详细讲解。 首先,我们要理解什么是Filter(过滤器)。在Java Web开发中,Filter是Servlet API的一部分,它允许我们...
下面我们将深入探讨Java中的乱码问题,以及如何通过配置过滤器来解决这个问题。 首先,我们要理解Java乱码的根源。乱码通常出现在两个主要场景:输入(如POST表单数据)和输出(如JSP页面显示)。在Java Web应用中...
通过这种方式,过滤器不仅可以解决中文乱码问题,还可以作为预防性措施,防止不安全的数据进入系统。 总结来说,JSP中的中文乱码问题可以通过设定请求的字符编码来解决,而过滤器提供了一种全局、高效的方式来处理...
在 WEB.XML文件里粘贴一下代码 可以解决乱码问题 <filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.highcom.filter.EncodingFilter</filter-class> <param-name>encoding ...
过滤器(Filter)在解决乱码问题中起到关键作用,尤其在Web应用中。过滤器是一种预处理和后处理请求及响应的机制,可以在请求到达目标资源之前或之后进行拦截。在处理乱码问题时,可以编写一个专门的字符编码过滤器...
【filter过滤器流程】 在Java Web开发中,Filter(过滤器)是用于处理HTTP请求和响应的重要组件。它遵循Servlet规范中的Filter接口,允许开发者在请求到达目标Servlet或JSP之前以及响应离开Servlet之后进行拦截和...