HTTP协议及浏览器编码行为 联系客服

发布时间 : 星期六 文章HTTP协议及浏览器编码行为更新完毕开始阅读0e34aa3531126edb6f1a1046

Struts可能是时下最流行的Web框架,它推荐的MVC模式几乎是所有Web应用程序的首选。从原理上说,Struts是基于Servlet/JSP的一种扩展,就设置字符编码而言,仍然是通过Servlet编程接口来执行,其不同处主要在于设置编码的时机。

与Servlet不同,在Struts框架下,服务器端的程序入口并不在应用程序,而总是经由Struts框架,再辗转进入应用程序的操作(Action)逻辑,这对需要在第一时间设置的字符编码造成了不小的困扰。更重要的是,Struts还负责自动从HTTP请求读取表单输入,并导入ActionForm中,以供应用程序使用。所以,必须寻找到一个时机,在Struts读取HTTP请求之前完成编码设置。

纵观Struts框架,最合适设置编码的位置是ActionForm的reset()方法。该方法在每次重置ActionForm时调用,紧接着Struts就会从HTTP请求读取表单输入。下面是一个范例。

public class SampleForm extends ActionForm {

public void reset(ActionMapping mapping, HttpServletRequest request) {

// 在此设置字符编码

request.setCharacterEncoding(\

... } }

具体设置的方法与Servlet中的编码设置一样,更详细的内容可以参阅6.2.3节中的“2.设置字符编码以正确解析HTTP请求”。 2.使用过滤器的通用编码设置方法

Java社区框架种类繁多是出名的。除了Struts以外,其他的Web框架也如雨后春笋般层出不穷。每一个框架都有自己的个性和特质,实现国际化、设置编码的方法都有可能不同。逐一分析每一个框架,寻找恰当时机和位置来设置字符编码固然可行,但有没有更通用的方法,能够普遍适用于大多数Web框架呢?

答案是:有。Servlet规范V2.3引入了过滤器(Filter)机制,这是一种非常有用的工具,能够通用地设置Web层的字符编码。其原理是,通过恰当的配置,过滤器可以在所有的HTTP请求进入Servlet之前进行拦截,从而保证在调用Web框架之前(不论什么框架,其入口总是一个特定的Servlet)第一时间完成字符编码的设置。

关于过滤器的详细说明和使用方法不在本书范围之内,读者可以自行参考Servlet规范以了解更多信息。下面仅以一个示例说明如何使用一个UTF8Filter来保证所有的HTTP请求都以UTF-8编码进行解析。

首先是一个名为UTF8Filter的Java类,它实现了Filter接口,用以拦截HTTP请求,并在请求进入Servlet之前对其进行编码设置。

package filters;

import java.io.IOException; import javax.servlet.*;

public class UTF8Filter implements Filter {

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

// 进行拦截,然后设置字符编码

request.setCharacterEncoding(\

// 继续,进入 Servlet 执行阶段 chain.doFilter(request, response);

}

public void init(FilterConfig filterConfig) throws ServletException {

}

public void destroy() {

} }

UTF8Filter中实现了拦截的逻辑,至于对哪一些HTTP请求进行拦截则是在web.xml中配置的。下面的web.xml片段将UTF8Filter配置为拦截所有的HTTP请求。

UTF8Filter

filters.UTF8Filter

UTF8Filter

/*

请注意上面片段中的/*一行,模式“/*”和所有的URL都匹配,从而保证UTF8Filter拦截所有的HTTP请求。 3.小结

对于Struts框架,可以在ActionForm.reset()中设置字符编码。

用过滤器(Filter)拦截HTTP请求,在进入Web框架之前设置字符编码。