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
}
}