• Tomcat中,使用原生Servlet中的request和response对象处理请求和响应时的乱码问题


    处理请求和响应时的乱码问题

    request和response中处理乱码的方法

    解决发起POST请求时请求体含有中文时,后端服务器接收数据时乱码问题: 通过request对象设置请求体的字符集request.setCharacterEncoding("UTF-8")

    • 对于Tomcat9及其之前版本,浏览器发起POST请求时服务器接收中文时会出现乱码问题
    • 对于Tomcat10及其之后版本, request请求体当中数据的字符集默认就是UTF-8,浏览器发起POST请求和GET请求都不会出现乱码问题

    解决发起GET请求时请求行含有中文乱码问题: 需要修改CATALINA_HOME/conf/server.xml配置文件,在Connector标签写一个URIEncoding属性指定URI的字符集

    • 对于Tomcat9和8版本, 不写URIEncoding属性指定URI的字符集时,默认按照UTF-8字符集处理数据,所以发起GET请求时服务器接收中文不会出现乱码问题
    • Tomcat8之前的版本发起GET请求时请求行含有中文会出现乱码问题,需要在Connector标签写一个URIEncoding属性指定URI的字符集
    <Connector URIEncoding="UTF-8" port="8080" />
    
    • 1

    解决响应体含有中文时,浏览器接收数据时乱码问题: 通过response对象设置响应体的字符集response.setContentType("text/html;charset=UTF-8")

    • 对于Tomcat9及其之前版本,当浏览器发起POST请求和GET请求时服务器响应的数据含有中文时,浏览器都会出现乱码问题
    • 对于Tomcat10及其之后版本, 当浏览器发起POST请求和GET请求时服务器响应的数据含有中文时,浏览器都不会出现乱码问题

    request对象对象的常用方法

    方法名功能
    String getRemoteAddr();获取客户端的IP地址
    void setCharacterEncoding(String)设置请求体的字符集 , 处理POST请求的乱码问题
    String getContextPath()获取应用的根路径(底层还是调用ServletContext对象的方法)
    String getMethod()获取请求方式
    String getRequestURI()获取请求的URI (带项目名)
    String getServletPath()获取Servlet 的路径 (项目名后面的路径)
    public class TestServlet extends HttpServlet{
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
            // 获取客户端的IP地址
            String remoteAddr = request.getRemoteAddr();
            // 处理POST请求的乱码问题: 设置请求体的字符集
            request.setCharacterEncoding("UTF-8");
            // 解决Tomcat9及其之前版本响应乱码问题
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
    		out.print("你好Servlet");
            // 获取应用的根路径
            String contextPath = request.getContextPath();
            // 获取请求方式
            String method = request.getMethod();
            // 获取请求的URI,/aaa/testRequest(aaa是项目名)
            String uri = request.getRequestURI();  
            // 获取Servlet路径,/testRequest(不带项目名)
            String servletPath = request.getServletPath(); 
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    public class TestServlet extends HttpServlet{
    	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{
            // 获取客户端的IP地址
            String remoteAddr = request.getRemoteAddr();
            // 处理POST请求的乱码问题: 设置请求体的字符集
            request.setCharacterEncoding("UTF-8");
            // 解决Tomcat9及其之前版本响应乱码问题
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
    		out.print("你好Servlet");
            // 获取应用的根路径
            String contextPath = request.getContextPath();
            // 获取请求方式
            String method = request.getMethod();
            // 获取请求的URI,/aaa/testRequest(aaa是项目名)
            String uri = request.getRequestURI();  
            // 获取Servlet路径,/testRequest(不带项目名)
            String servletPath = request.getServletPath(); 
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    『C++之STL』双端队列 - deque
    系列十四、Redis的集群(一)
    一个简单的HTML篮球网页【学生网页设计作业源码】
    如何优雅的在本地调试npm包
    Echarts自定义柱状图
    python 空间滤波
    虚拟机数据恢复:Stellar Data Recovery for Virtual Machine
    商业化广告--体系学习-- 8 -- 业务实战篇 -- 计价与效果(上):如何制定合理的计价方式?
    gcd(最大公约数)和lcm(最小公倍数)的代码
    05_Bootstrap插件02
  • 原文地址:https://blog.csdn.net/qq_57005976/article/details/133709135