SSH的编码 和 ajax乱码问题

SSH的编码   和  乱码问题

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

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



首先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编码过滤器的源码,发现这么一段代码



可以确定执行了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

       

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

life1024

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值