SSH的编码 和 ajax乱码问题

SSH的编码   和  乱码问题

乱码的原因是两次编码格式不一样

首先要明白过滤器是先进后出(即在jsp页面 请求action的时候 排在前面的先执行,排在后面的后执行。当服务器响应jsp的时候,排在后面的先执行,排在前面的后执行。谁在前面谁的response设置起最终作用(相同参数覆盖,不同参数都起作用),谁放在后面谁的request会起最终作用(相同参数覆盖,不同参数都起作用))

SSH的编码   和  ajax乱码问题


首先ssh编码设置

 

1)使用spring如在web.xml中写

 

<filter>

        <filter-name>encodingFilter</filter-name>

        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

        <init-param>

            <param-name>encoding</param-name>

            <param-value>utf-8</param-value>

        </init-param>

    </filter>

   

    <filter-mapping>

        <filter-name>encodingFilter</filter-name>

        <url-pattern>/*</url-pattern>

    </filter-mapping>

 

(2)使用struts

可以在 struts的默认配置文件中default.properties设置

struts.i18n.encoding=UTF-8

可以在自己的struts.xml中重新定义编码

   <constant name="struts.i18n.encoding"value="UTF-8"/>

 

 

上面两种任意一种设置都是对request起作用,对response不起作用(自己实验的结果),

请求request使用action的方法中使用resquest.getCharacterEncoding()输出为utf-8.

用response.getCharacterEncoding()输出ISO-8859-1

有人说,此时还没response,当struts2 result之后,response才会设置成utf-8.所以自己设置了个过滤器放在web.xml的最前面,当struts执行result之后,再调用此过滤器,但是还是输出ISO-8859-1)

看一下struts编码过滤器的源码,发现这么一段代码


SSH的编码   和  ajax乱码问题

可以确定执行了request.setCharacterEncoding(encoding),但是没有response.

 

这里是重点:!!!!!就算相应的编码格式是ISO-8859-1。但是我们在jsp页面获得的却不是乱码。这是因为,当响应到jsp页面后,jsp页面头有这样一段代码

<%@ page language="java"import="java.util.*" pageEncoding="utf-8"%>

这里设置了jsp页面的编码,我们知道,服务器会自动把jsp页面编译成class文件,也就是说jsp页面是服务器程序。所以这里会把响应编码设置成utf-8。

但是当使用ajax时,由于页面一开始已经加载完,然后才会调用ajax异步加载,此时数据的编码不再受页面编码的影响,所以就会出现乱码,怎么解决呢,当然不能在ajax上设置编码,因为,ajax上设置编码只会把自己(发送和接受)的数据编码,不会影响服务器的响应(response)编码,所以当用不同的编码格式通信时就会出错。

 

怎么办呢,那就使用第三种,自定义过滤器,在此过滤器中设置响应(response)的编码格式,

并把过滤器配置代码写在web.xml的最前面(放在所有过滤器前面)

 

 

(3)自定义编码过滤器。(如果想让自定义编码对于response起作用,就放在web.xml的(Struts 和spring配置)的最前面,如果想让resquest起作用就放在web.xml的(Struts 和spring配置)的最后面,不然不起作用);

这里设置response起作用

Web.xml(下面配置一定要放在配置最前面)

<filter>

         <filter-name>aa</filter-name>

         <filter-class>com.oracle.jingdong.filter.EncodingFilter</filter-class>

</filter>

 <filter-mapping>

      <filter-name>aa</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

 

 

EncodingFilter.jar

 

packagecom.oracle.jingdong.filter;

importjava.io.IOException;

importjavax.servlet.Filter;

importjavax.servlet.FilterChain;

importjavax.servlet.FilterConfig;

importjavax.servlet.ServletException;

import javax.servlet.ServletRequest;

importjavax.servlet.ServletResponse;

importjavax.servlet.http.HttpSession;

public classEncodingFilter implements Filter{

 

    public staticThreadLocal<HttpSession>  session = newThreadLocal<HttpSession>();

 

    public void destroy(){

       

    }

    public void doFilter(ServletRequest request,ServletResponse response,

            FilterChain chain) throwsIOException, ServletException {

       

         response.setContentType("text/html;charset=utf-8");

         //request.setCharacterEncoding("utf-8");

        //System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"+response.getCharacterEncoding());

         chain.doFilter(request, response);

    }

    @Override

    public voidinit(FilterConfig filterConfig) throws ServletException {

        // TODOAuto-generated method stub

       

    }

}

 

上一篇:WebService入门篇


下一篇:纯HTML+CSS+JS编写的计算器应用