SSH的编码 和 ajax乱码问题

简介: SSH的编码   和  乱码问题 乱码的原因是两次编码格式不一样 首先要明白过滤器是先进后出(即在jsp页面 请求action的时候 排在前面的先执行,排在后面的后执行。当服务器响应jsp的时候,排在后面的先执行,排在前面的后执行。谁在前面谁的response设置起最终作用(相同参数覆盖,不同参数都起作用),谁放在后面谁的request会起最终作用(相同参数覆盖,不同参数都起作用))

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

       

    }

}

 

目录
相关文章
|
5月前
|
JavaScript 前端开发 安全
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
安全开发-JS应用&原生开发&JQuery库&Ajax技术&加密编码库&断点调试&逆向分析&元素属性操作
gdy
|
编解码 JavaScript 前端开发
jQuery Ajax传值给Servlet,在Servlet里Get接受参数乱码的解决方法
  最近在学jquery ui,在做一个小功能的时候需要将前台的值获取到,通过Ajax传递给Servlet,然后再在返回数据结果,但是在Servlet接受参数的时候,通过后台打印,发现接受乱码,代码示例如下: public void doGet(HttpServletRequest reque...
gdy
1750 0
|
前端开发 应用服务中间件 网络安全
ssh整合问题总结--使用struts2+Ajax+jquery验证用户名是否已被注册
  在用户模块中的用户注册需求上,通常要进行用户名是否已被注册的验证,今天正好写了这个需求,把详细代码和所遇到的问题贴过来.在使用struts2+ajax时候,通常我们会返回json类型的数据,但是像上面的例子,我们只希望返回一个1和0有助于进行后续判断即可,没必要返回json类型,返回一个text字符串就可以了.
935 0
|
前端开发
编码gbk ajax的提交
客户端 服务器端:
556 0
|
前端开发
|
前端开发 编解码 Web App开发
12、AJAX接收responseText时返回乱码的解决
在尝试通过ajax获取别的网站的数据进行分析时,发现如果有中文,则会出问题。分析发现,AJAX在接收responseText或responseXML的值的时候是按照UTF-8的格式来解码的,如果服务器段发送的数据不是UTF-8的格式,那么接收responseText或responseXML的值有可能为乱码。
1030 0
|
JavaScript 前端开发
使用base64对图片的二进制进行编码,使其可以利用ajax进行显示
有时候我们需要动态的将图片的二进制在页面上进行显示,如我们需要弄一个验证码的功能,那么如果我们的验证码的图片在后台得到的是该图片的二进制,那么当我们需要在页面上点击一个按钮利用ajax进行切换的时候,如果在后台直接返回的是该图片的二进制,那么该图片是无法进行显示的。
823 0