Servlet(2):Requset/Response Encoding and Filter

Requset/Response Encoding

表单提交分GET和POST,接下来分开讨论。

(1)GET/URL提交的数据

在 Tomcat中,默认情况下使用"URIEncoding"的值(tomcat8.0后是UTF-8,之前是ISO-8859-1)对URL提交的数据和表单中GET方式提交的数据进行解码。由于浏览器已经进行了一次编码(UTF-8),所以后台什么都不需要做。

 1     @Override
 2     protected void doGet(HttpServletRequest request, HttpServletResponse response)
 3             throws ServletException, IOException {
 4
 5         // 不需要设置 request.setCharacterEncoding()
 6         // request.setCharacterEncoding("UTF-8");
 7         // 设置response的Character
 8         response.setContentType("text/html");
 9         response.setCharacterEncoding("UTF-8");
10         // 也可以直接写成
11         // response.setContentType("text/html;charset=UTF-8");
12     }

URIEncoding 是对所有 GET 方式的请求的数据进行统一的重新编码(解码),而 useBodyEncodingForURI 则是根据响应该请求的页面的request.setCharacterEncoding 参数对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。

所以,如果要修改编码格式,可以使用下面两个方法:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK" />
response.setContentType("text/html;charset=GBK");

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true" />
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");

(2)POST提交的数据

由于"URIEncoding"只对GET方式有效,所以POST时必须设置request.setCharacterEncoding

request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

(3)综合以上讨论,如果使用Tomcat8以上,UTF-8编码的项目,则不需要修改server.xml,再在每个servlet中加上下面代码即可。

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");

Filter

Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

上面的如果每个Servlet中都添加Encode的代码会非常麻烦,可以用Filter解决。以下是代码。

 1 package com.mytest.servlettest.servlet;
 2
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5
 6 import javax.servlet.ServletException;
 7 import javax.servlet.annotation.WebServlet;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11
12 /**
13  * Servlet implementation class Login
14  */
15 @WebServlet("/login")
16 public class Login extends HttpServlet {
17
18     private static final long serialVersionUID = 1L;
19
20     /**
21      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
22      */
23     @Override
24     protected void doGet(HttpServletRequest request, HttpServletResponse response)
25             throws ServletException, IOException {
26
27         response.setContentType("text/html");
28
29         PrintWriter out = response.getWriter();
30         out.println("<!DOCTYPE html>");
31         out.println("<html>");
32         out.println("<head>");
33         out.println("<title>Login Page</title>");
34         out.println("</head>");
35         out.println("<body>");
36         out.println("<form action=\"welcome\" method=\"POST\">");
37         out.println("帐号: <input type=\"text\" name=\"userId\"/><br/>");
38         out.println("密码: <input type=\"password\" name=\"password\"/><br/>");
39         out.println("<input type=\"submit\" value=\"提交\"/>");
40         out.println("</body>");
41         out.println("</html>");
42
43         System.out.println("[login]" + request.getCharacterEncoding());
44         System.out.println("[login]" + response.getCharacterEncoding());
45     }
46
47     /**
48      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
49      */
50     @Override
51     protected void doPost(HttpServletRequest request, HttpServletResponse response)
52             throws ServletException, IOException {
53         doGet(request, response);
54     }
55 }
 1 package com.mytest.servlettest.servlet;
 2
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5
 6 import javax.servlet.ServletException;
 7 import javax.servlet.annotation.WebServlet;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11
12 /**
13  * Servlet implementation class Welcome
14  */
15 @WebServlet("/welcome")
16 public class Welcome extends HttpServlet {
17
18     private static final long serialVersionUID = 1L;
19
20     /**
21      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
22      */
23     @Override
24     protected void doGet(HttpServletRequest request, HttpServletResponse response)
25             throws ServletException, IOException {
26
27         response.setContentType("text/html");
28
29         String userId = request.getParameter("userId");
30         String password = request.getParameter("password");
31
32         PrintWriter out = response.getWriter();
33         out.println("<!DOCTYPE html>");
34         out.println("<html>");
35         out.println("<head>");
36         out.println("<title>Login Page</title>");
37         out.println("</head>");
38         out.println("<body>");
39         if ("123".equals(password)) {
40             out.println("欢迎您, " + userId);
41         } else {
42             out.println("您的帐号或密码错误!");
43         }
44         out.println("<a href = \"login\">返回</a>");
45         out.println("</body>");
46         out.println("</html>");
47
48         System.out.println("[welcome]" + request.getCharacterEncoding());
49         System.out.println("[welcome]" + response.getCharacterEncoding());
50     }
51
52     /**
53      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
54      */
55     @Override
56     protected void doPost(HttpServletRequest request, HttpServletResponse response)
57             throws ServletException, IOException {
58         doGet(request, response);
59     }
60 }
 1 package com.mytest.servlettest.filter;
 2
 3 import javax.servlet.*;
 4 import java.io.IOException;
 5
 6 /**
 7  * Created by Administrator on 2017/9/4.
 8  */
 9 public class CharacterEncodingFilter implements Filter {
10
11     private String encoding;
12
13     public void setEncoding(String encoding) {
14         this.encoding = encoding;
15     }
16
17     @Override
18     public void init(FilterConfig filterConfig) throws ServletException {
19         encoding = filterConfig.getInitParameter("encoding");
20         if (encoding == null || encoding == "") {
21             encoding = "UTF-8";
22         }
23     }
24
25     @Override
26     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
27         servletRequest.setCharacterEncoding(encoding);
28         servletResponse.setCharacterEncoding(encoding);
29         filterChain.doFilter(servletRequest, servletResponse);
30     }
31
32     @Override
33     public void destroy() {
34     }
35 }
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 4          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 5          id="WebApp_ID" version="3.1">
 6     <filter>
 7         <filter-name>characterEncodingFilter</filter-name>
 8         <filter-class>com.mytest.servlettest.filter.CharacterEncodingFilter</filter-class>
 9         <init-param>
10             <param-name>encoding</param-name>
11             <param-value>UTF-8</param-value>
12         </init-param>
13     </filter>
14     <filter-mapping>
15         <filter-name>characterEncodingFilter</filter-name>
16         <url-pattern>/*</url-pattern>
17     </filter-mapping>
18     <welcome-file-list>
19         <welcome-file>login</welcome-file>
20     </welcome-file-list>
21 </web-app>

推荐使用Spring的CharacterEncodingFilter

 1 <filter>
 2     <filter-name>characterEncodingFilter</filter-name>
 3     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
 4     <init-param>
 5         <param-name>encoding</param-name>
 6         <param-value>UTF-8</param-value>
 7     </init-param>
 8     <init-param>
 9         <param-name>forceEncoding</param-name>
10         <param-value>true</param-value>
11     </init-param>
12 </filter>
13 <filter-mapping>
14     <filter-name>characterEncodingFilter</filter-name>
15     <url-pattern>/*</url-pattern>
16 </filter-mapping>  

CharacterEncodingFilter

时间: 2024-08-11 05:43:25

Servlet(2):Requset/Response Encoding and Filter的相关文章

javaWeb中 servlet 、request 、response

1.Servlet (1)Servlet是JavaEE的一个动态web资源开发技 术,就是在服务器上运行的小程序,这个小程序是由服务器调用的,服务器为了能调用这个小程序,就要求这样的程序必须实现一个Servlet接口或去继承 Servlet的实现类GenericServlet或HttpServlet. (2)在web应用的配置文件web.xml中配置Servlet的对外访问路径,再将整个web应用交给虚拟机管理. (3)Servlet的调用过程: ①服务器根据请求的包的host找到要访问的虚拟主

Servlet编程:(1)如何使用Servlet

如何开发一个Servlet Servlet的映射路径 Servlet缺省路径 Sevlet的生命周期 Servlet的自动加载 有参的init方法和无参的init方法 Servlet的多线程并发问题 ServletConfig对象 ServletContext对象 1.如何开发一个Servlet 步骤: 1)编写java类,继承自javax.servlet.http.HttpServlet类 2)覆写doGet和doPost方法 3)Servlet程序交给tomcat服务器运行!! 3.1)将S

Servlet中listener(监听器)和filter的总结

Listener 我是这样理解他的,他是一种观察者模式的实现:我们在 web.xml 中配置 listener 的时候就是把一个被观察者放入的观察者的观察对象队列中,当被观察者触发了注册事件时观察者作出相应的反应.在 jsp/servlet 中具体的实现是在 web.xml 中注册 Listener ,由 Container 在特定事件发生时呼叫特定的实现 Listener 的类. 总体上说 servlet 中有主要有 3 类事件既: Servlet 上下文事件.会话事件与请求事件总共有 8 个

Java Servlet(二):servlet配置及生命周期相关(jdk7+tomcat7+eclipse)

该篇文章记录了Servlet配置相关用法及Servlet在Servlet容器中生命周期方法. Tomcat是一个Servlet容器: 1.Servlet容器管理了Servlet的整个生命周期,并调用servlet的生命周期的方法. 2.Servlet容器不只是Servlet的生命周期,而且还是Jsp,Filter,Listener,Tag等生命周期管理容器. Servlet的注册与运行 1.Servlet程序必须通过Servlet容器来启动运行,并且存储目录有特殊要求,通常servlet编译好的

Servlet中Request和Response 详解

一.Response 1.Resonse的继承结构:   ServletResponse--HttpServletResponse 2.Response代表响应,于是响应消息中的 状态码.响应头.实体内容都可以由它进行操作,由此引伸出如下实验: 3.利用Response输出数据到客户端  response.getOutputStream().write("中文".getBytes())输出数据,这是一个字节流,是什么字节输出什么字节,而浏览器默认用平台字节码打开服务器发送的数据,如果服

Servlet中Request与Response应用

一.Response 1.Resonse的继承结构:   ServletResponse--HttpServletResponse 2.Response代表响应,于是响应消息中的状态码.响应头.实体内容都可以由它进行操作,由此引伸出如下实验: 3.利用Response输出数据到客户端  response.getOutputStream().write("中文".getBytes())输出数据,这是一个字节流,是什么字节输出什么字节,而浏览器默认用平台字节码打开服务器发送的数据,如果服务

javaWeb核心技术第七篇之HTTP、Tomcat、Servlet、Request和Response

- Web服务器 - 概念: - web资源: "英文直译"网"的意思 资源:一切数据文件 web资源:通过网络可以访问到的资源,通常指的是一切放在服务器上的文件" - web资源的分类: - 静态的web资源: " 内容是一成不变的" - 动态的web资源: " 内容有可能在不同的时间或者不同的人访问的时候会发生改变的" - web技术分类 - 静态的web技术 " 例如: html css js .....&qu

笔试算法题(43):布隆过滤器(Bloom Filter)

议题:布隆过滤器(Bloom Filter) 分析: BF由一个很长的二进制向量和一系列随机映射的函数组成,通过多个Hash函数将一个元素映射到一个Bit Array中的多个点,查询的时候仅当所有的映射点都为1才能判断元素存在于集合内:BF用于检索一个元素是否在一个集合中,记忆集合求交集:优点是空间 和时间效率都超过一般查询算法,缺点是有一定的误判概率和删除困难: 如下图,使用三个哈希函数对每个元素进行映射,这样每个元素对应HashTable中的三个位置,如果查找w是否在HashTable中则仍

MAVEN Error: Using platform encoding (GBK actually) to copy filtered resources.....

环境:Maven3.2.5+MyEclipse 2015CI 现象:在Maven编译过程中出现错误信息:Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent! 附:此时Mavenproject配置例如以下: 1.project属性,编码设置为UTF-8: 2.pom.xml属性 <plugin> <artifactId>maven-com