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 参数对数据进行的重新编码(解码),不同的页面可以有不同的重新编码(解码)的编码。

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

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

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

(2)POST提交的数据

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

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

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

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

(4)[Add] HttpServletRequest的常用方法

getRequestURL:返回客户端发出请求时的完整URL
getRequestURI:返回请求行中的资源名部分
getQueryString:返回请求行中的参数部分
getPathInfo:返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头
getRemoteAddr:返回发出请求的客户机的IP地址。
getRemoteHost:返回发出请求的客户机的完整主机名
getRemotePort:返回客户机所使用的网络端口号
getLocalAddr:返回WEB服务器的IP地址
getLocalName:方法返回WEB服务器的主机名

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

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

  1. javaWeb中 servlet 、request 、response

    1.Servlet (1)Servlet是JavaEE的一个动态web资源开发技 术,就是在服务器上运行的小程序,这个小程序是由服务器调用的,服务器为了能调用这个小程序,就要求这样的程序必须实现一个S ...

  2. Java Servlet(五):GenericServlet与Servlet、HttpServlet之间的关系(jdk7+tomcat7+eclipse)

    本篇主要记录下,对GenericServlet的作用理解,及其与Servlet/HttpServlet之间的关系. 示例完成业务: 1.新建一个login.jsp页面,要求改页面能输入username ...

  3. servlet(一):从Sevlet到HttpServlet

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. servlet ...

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

    Listener 我是这样理解他的,他是一种观察者模式的实现:我们在 web.xml 中配置 listener 的时候就是把一个被观察者放入的观察者的观察对象队列中,当被观察者触发了注册事件时观察者作 ...

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

    该篇文章记录了Servlet配置相关用法及Servlet在Servlet容器中生命周期方法. Tomcat是一个Servlet容器: 1.Servlet容器管理了Servlet的整个生命周期,并调用s ...

  6. Servlet的学习之Response响应对象(2)

    本篇接上一篇<Servlet的学习之Response响应对象(1)>,继续从HttpServletResponse响应对象来介绍其方法和功能. 使用setHeader方法结合HTTP协议的 ...

  7. Servlet的学习之Response响应对象(1)

    在之前学习了Servlet中的主体结构,包括Servlet的生命周期方法,和非生命周期方法能获取的一些非常重要的对象如ServletConfig.ServletContext对象等,而从这篇开始我们将 ...

  8. Java Servlet(十一):一个servlet被10个浏览器客户端访问时会创建几个servlet实例?

    一般Servlet只初始化一次(只有一个实例).对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传递给该方法.如此重复以 ...

  9. FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

随机推荐

  1. windows10下成功安装docker splash及遇到问题的解决方案

    转载出处:http://www.cnblogs.com/321lxl/p/9536616.html

  2. CVE-2018-10933 LibSSH auth bypass

    漏洞原理 认证实现错误, 认证分为多个步骤,可以直接跳到成功的步骤       A vulnerability was found in libssh's server-side state mach ...

  3. 【高维前缀和】8.15B. 组合数

    题目分析 没有接触过高维前缀和的话会有一点抽象

  4. [NOI2012]骑行川藏——拉格朗日乘子法

    原题链接 不会啊,只好现学了拉格朗日乘子法,简单记录一下 前置芝士:拉格朗日乘子法 要求\(n\)元目标函数\(f(x_1,x_2,...,x_n)\)的极值,且有\(m\)个约束函数形如\(h_i( ...

  5. Python 基础知识 (1) 持续更新

    (1)数字和表达式 当进入Python交互式的时候,Python就可以直接当成计算机使用 如 >>> 2 + 2 4 但是 当 1个整数 和 另外一个整数 相除的时候,计算的结果,只 ...

  6. python3正则表达式总结

    转自csdn,去这里看更多吧: https://blog.csdn.net/weixin_40136018/article/details/81183504 还有一个废话很多的详细系列,在这里:htt ...

  7. 使用 stringstream 进行类型转换

    如何用使用stringstream进行类型转换: 1. 下面例子为整型和sting类型的相互转换示例 整型转换为字符串类型 string NumberToString(int num){    str ...

  8. @Transactional(转)

    概述@Transactional 是声明式事务管理 编程中使用的注解 添加位置 接口实现类或接口实现方法上,而不是接口类中访问权限:public 的方法才起作用 @Transactional 注解应该 ...

  9. ubuntu服务器常用命令

    1.查看系统版本 cat /etc/issue cat /etc/lsb-release 2.查看cpu lscpu 3.查看内存 free -m 4.查看硬盘大小 fdisk -l |grep Di ...

  10. springBoot+websocket集群系列知识

    WebSocket简介和spring boot集成简单消息代理 Spring Boot 集成 websocket,使用RabbitMQ做为消息代理 Spring Websocket实现向指定的用户发送 ...