JavaWeb学习-Servlet系列-12-HttpServletResponse编码设置

前面文章我们介绍了HttpServletResponse的响应消息行和响应消息头的一部分方法的练习,这篇,来介绍响应信息正文的相关方法。本篇主要介绍响应编码的设置和常见问题。

1.没有设置响应编码,中文内容在浏览器会显示问号格式

我们需要给网页输出一个字符串内容,这里需要用到HttpServletResponse的父类的一个方法getWriter()。利用这个方法,例如我们可以把“你好”输出在网页,当我们访问映射URL的时候,之前我们访问都是空白页面。

package com.anthony.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo2 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		PrintWriter out = response.getWriter();// 得到一个字符输出流
		out.write("你好"); // 把 你好 显示在页面上
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

部署到tomcat服务器,然后浏览器打开看看页面有没有显示 你好

首先问号不是乱码,学习过测试的同学可能知道,问号和乱码是有区别的,问号表示字符没有找到正确编码去解析;而乱码(下面我们会演示一个乱码)是字符编码表使用错误。本来中中文GBK的字符,你用英文字符编码去解析,这就产生乱码。这里产生问号的真实原因是,tomcat服务器默认的编码是ISO-8859-1,这个编码是美国tomcat制定,所以不支持中文。

你把上面“你好” 替换成“abc”,到浏览器就不会产生问号。下面来演示一个乱码产生过程。

上面我们看到浏览器中显示问号,我们猜也猜到应该需要给设置编码。

package com.anthony.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo2 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8"); //告诉服务器用UTF-8进行编码解析
		PrintWriter out = response.getWriter();// 得到一个字符输出流
		out.write("你好"); // 把 你好 显示在页面上
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

上面添加一行代码,告诉服务器使用UTF-8去解析,但是没有指定浏览器客户端用什么编码,所以,下面运行会出现乱码。

服务器端编码方式是UTF-8,那么火狐浏览器编码是什么呢?火狐浏览器上点击主菜单-更多-文字编码

这里浏览器端用GBK编码去解析服务器端的UTF-8,两个编码不一致,所以显示乱码。解决办法,就是设置服务端编码同时也要设置客户端使用编码。

package com.anthony.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo2 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8"); //告诉服务器用UTF-8进行编码解析
		//告诉浏览器使用什么编码去解析
		response.setHeader("content-type", "text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();// 得到一个字符输出流
		out.write("你好"); // 把 你好 显示在页面上
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

运行效果

2.设置编码方式优化

上面我们使用两行代码去分别设置服务器端和客户端的编码方式,其实在HttpServletResponse对象中有一个方法就可以同时设置服务器端和客户端的编码,下面是优化代码。

package com.anthony.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletDemo2 extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//这行代码干了两件事,同时告诉服务器和客户端使用GBK编码
		response.setContentType("text/html; charset=GBK");
		PrintWriter out = response.getWriter();// 得到一个字符输出流
		out.write("你好"); // 把 你好 显示在页面上
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

重新部署,测试

在使用setContentType方法可能遇到这种问题,浏览器发送请求的时候,提示下载文件,在IE浏览器上,火狐不会。

原因就是这行代码写的有问题

response.setContentType("UTF-8"); //错误的

response.setContentType("text/html;charset=UTF-8"); //正确

这种错误写法,哪怕一个单词写错了,在IE浏览器上请求这个url就提示下载文件。

### 如何在 Spring WebFlux 中设置响应编码为 UTF-8 为了确保在 Spring WebFlux 应用程序中所有的响应都被正确地编码为 UTF-8,可以采用多种方法来实现这一目标。 #### 方法一:通过配置 `ServerCodecConfigurer` `ServerCodecConfigurer` 是用于配置编解码器的一个接口,在这里可以通过自定义的方式设定默认字符集。创建一个配置类并重写相应的方法: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.http.codec.ServerCodecConfigurer; @Configuration public class CodecConfig { @Bean public ServerCodecConfigurer serverCodecConfigurer() { return ServerCodecConfigurer.create(builder -> builder.defaultCharset(StandardCharsets.UTF_8)); } } ``` 此段代码会使得所有基于该配置的编解码操作均使用指定的字符集[^1]。 #### 方法二:利用全局过滤器 Global Filter 或者 GatewayFilter 设置响应头 如果仅需针对特定请求或是在更细粒度级别控制,则可以在处理函数内部手动修改响应头部信息: ```java @Bean GlobalFilter globalFilter(){ return (exchange, chain) -> { exchange.getResponse().getHeaders() .setContentType(MediaType.APPLICATION_JSON_UTF8); return chain.filter(exchange.mutate().build()); }; } ``` 这段逻辑会在每一个进入系统的HTTP请求前加上一层拦截,从而允许动态调整返回给客户端的内容类型及其对应的字符编码方式[^2]。 对于那些已经存在于路径上的处理器而言,也可以直接在其内嵌入相似的操作以达到相同的效果;而对于网关级别的应用来说,可能还需要考虑其他因素如路由规则等的影响。 以上两种方案都可以有效地解决WebFlux项目下的响应体编码问题,并且能够很好地兼容现有的业务流程而无需做过多改动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值