标题springboot争对不同请求设置不同编码格式
前言:springboot的@RequestParam和@RequestBody注解默认解析编码格式是UTF-8,对于一些有特殊需求的需要指定编码格式的就不太友好。
分析:查了网上一些帖子,有在配置文件中设置spring.http.encoding参数更改全局配置的(我没有试过,因为我觉得不太好,这样会直接设置全局的格式),下面我为大家介绍一种网上没有的方式。
适用范围:需要对不同的controller(访问路径),都指定不同编码的需求,比如:同一个工程种,访问/test需要utf-8编码,响应需要gbk编码;访问/test1需要gbk编码,响应需要utf-8编码。
问题解决
- 步骤1:使用filter解决request的请求编码
使用filter的目的是为了能针对访问路径进行过滤。上代码:
//urlPatterns指定过滤路径,filterName指定过滤器名字,在启动类种配置下该类的扫描路径,或者写个类实现WebMvcConfigurer,注册一下(比较麻烦)
@WebFilter(urlPatterns = "/*",filterName = "CharacterEncodingFilter")
public class CharacterEncodingFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
request.setCharacterEncoding("GBK");
//response设置之后不会生效,网上这样写的都不行,因为springboot注解的原因,亲测
//response.setCharacterEncoding("UTF-8");
filterChain.doFilter(request , response);
}
@Override
public void destroy() {
}
}
这样过滤器就写好了,接下来重点来了
在需要指定请求编码格式的controller方法上,不要使用@RequestParam和@RequestBody等注解,直接使用HttpServletRequest和HttpServletResponse接收请求,上代码:
@PostMapping(value="/test")
public Test test(HttpServletRequest request, HttpServletResponse response) {
//我这里自定了一个注解去request读inputstream流然后当道request种的dada中,注解代码我就不上了(因为代码不在自己电脑上,手码太累。。。。)
Test test = request.getAttribute("data");
return test;
}
到此为止,request的指定路径的编码格式就完成啦!
2.步骤2:response的编码格式指定
由于PostMapping等等类似注解(本质是RequestMapping注解),内部有一个默认的编码格式,所以不管在哪里设置response的编码,在发请求的一瞬间,编码格式都会被这里覆盖。
response问题解决: 在响应的controller方法的PostMapping注解上指定produces属性,上代码:
@PostMapping(value="/test", produces="application/json,charset=gbk")
public Test test(HttpServletRequest request, HttpServletResponse response) {
//我这里自定了一个注解去request读inputstream流然后当道request种的dada中,注解代码我就不上了(因为代码不在自己电脑上,手码太累。。。。)
Test test = request.getAttribute("data");
return test;
}
自此,问题解决。。。。