`
sillycat
  • 浏览: 2541928 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

filter过滤乱码的问题

    博客分类:
  • JAVA
阅读更多
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,应该不会遇到这样的问题,但是以后也说不定用得上。呵呵。记录一下。


分享到:
评论

相关推荐

    如何配置Filter过滤器处理JSP中文乱码

    通过以上四个步骤,你可以有效地解决JSP中文乱码问题。当请求到达服务器时,Filter会自动设置请求和响应的字符编码,确保数据在传输过程中不发生乱码。同时,Tomcat服务器配置的`URIEncoding`确保URL中的中文字符也...

    jsp 过滤器——解决中文乱码问题

    ### jsp过滤器——解决中文乱码问题 #### 背景介绍 在Web应用开发过程中,特别是使用Java Server Pages (JSP)进行中文字符处理时,经常遇到的一个问题是中文字符显示为乱码。这主要是因为客户端与服务器端之间存在...

    Filter中文乱码问题.doc

    在这个文档中,我们将深入探讨如何使用Filter解决中文乱码问题。 首先,我们需要创建一个自定义的Filter类,继承自`javax.servlet.Filter`接口,并实现其中的`init`和`doFilter`方法。`init`方法在Filter初始化时...

    使用过滤器解决中文乱码问题

    本文将详细讲解如何利用过滤器来解决中文乱码问题。 1. **理解中文乱码** 中文乱码通常是因为字符编码不一致导致的。在计算机系统中,字符被编码成二进制表示,不同的编码标准(如GBK、UTF-8等)对同一字符有不同...

    jsp中文乱码过滤器

    在解决中文乱码问题上,过滤器可以设置合适的字符编码,确保数据在传输过程中的正确性。 **三、JSP中文乱码过滤器的实现** 1. **创建Filter类**:首先,我们需要创建一个实现了`javax.servlet.Filter`接口的类,并...

    利用过滤器解决JavaWeb(JSP)的乱码问题

    本文将详细讲解如何利用过滤器来解决JavaWeb中的乱码问题。 首先,我们需要理解JavaWeb中的乱码产生的原因。当用户通过浏览器提交数据时,如果服务器接收到的数据编码与服务器内部处理编码不匹配,或者JSP页面的...

    servlet过滤器解决乱码问题

    ### Servlet过滤器解决乱码问题 在Web应用开发过程中,字符编码问题经常出现,尤其是在处理中文等多字节字符时。如果不正确地设置字符编码,可能会导致页面显示乱码。本文将详细介绍如何通过Servlet过滤器来解决这...

    java中文过滤器消除乱码问题

    本篇将详细讲解如何利用这种过滤器来消除Java Web中的乱码问题。 首先,我们需要理解乱码产生的原因。在Java Web应用中,乱码通常源于字符编码不一致。例如,HTTP请求的数据可能使用UTF-8编码,而服务器默认使用GB...

    jsp用过滤器解决中文乱码问题的方法.docx

    要使用jsp过滤器解决中文乱码问题,我们需要定义一个过滤器类,实现Filter接口。下面是一个简单的示例代码: ```java public class EncodingFilter implements Filter { @Override public void destroy() { // ...

    过滤器实现get请求乱码问题

    要解决这个乱码问题,我们可以按照以下步骤创建一个过滤器: 1. 创建Filter类:首先,我们需要创建一个实现了javax.servlet.Filter接口的类。在类中,我们需要重写doFilter()方法,这是过滤器的核心,它将在每次...

    Filter解决中文乱码

    Filter(过滤器)是Servlet规范的一部分,用于在请求处理前后执行一些预处理或后处理任务,解决乱码问题就是其中之一。本篇文章将详细讲解如何使用Filter来解决中文乱码问题,并提供相关源码和配置示例。 首先,...

    ssh框架乱码过滤器Filter

    本篇文章将详细探讨SSH框架中的中文乱码问题,以及如何通过实现自定义过滤器(Filter)来解决这一问题。 首先,我们要理解乱码的产生原因。在HTTP请求中,数据编码格式不一致是导致乱码的主要因素。例如,客户端...

    过滤乱码解决了

    为了解决这个问题,本篇文章介绍了一种通过自定义过滤器(Filter)的方式来处理乱码问题的方法。 #### 二、知识点详解 ##### 1. 过滤器(Filter) - **概念**:过滤器是Java Web中的一个重要组件,它可以拦截用户...

    关于处理中文乱码问题 Filter 代码

    本文将重点解析“关于处理中文乱码问题 Filter 代码”的相关知识点,并结合Java Servlet API进行详细讲解。 首先,我们要理解什么是Filter(过滤器)。在Java Web开发中,Filter是Servlet API的一部分,它允许我们...

    java配置过滤器,解决乱码

    下面我们将深入探讨Java中的乱码问题,以及如何通过配置过滤器来解决这个问题。 首先,我们要理解Java乱码的根源。乱码通常出现在两个主要场景:输入(如POST表单数据)和输出(如JSP页面显示)。在Java Web应用中...

    jsp 过滤器中文乱码的处理

    通过这种方式,过滤器不仅可以解决中文乱码问题,还可以作为预防性措施,防止不安全的数据进入系统。 总结来说,JSP中的中文乱码问题可以通过设定请求的字符编码来解决,而过滤器提供了一种全局、高效的方式来处理...

    过滤器实现对乱码问题的解决

    在 WEB.XML文件里粘贴一下代码 可以解决乱码问题 <filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.highcom.filter.EncodingFilter</filter-class> <param-name>encoding ...

    中文乱码问题的解决方案以及过滤器

    过滤器(Filter)在解决乱码问题中起到关键作用,尤其在Web应用中。过滤器是一种预处理和后处理请求及响应的机制,可以在请求到达目标资源之前或之后进行拦截。在处理乱码问题时,可以编写一个专门的字符编码过滤器...

    filter过滤器流程及中文乱码解决和客户端IP地址控制

    【filter过滤器流程】 在Java Web开发中,Filter(过滤器)是用于处理HTTP请求和响应的重要组件。它遵循Servlet规范中的Filter接口,允许开发者在请求到达目标Servlet或JSP之前以及响应离开Servlet之后进行拦截和...

Global site tag (gtag.js) - Google Analytics