Spring MVC @RequestMapping中的乱码问题解析

国际化测试过程中,上传下载以本地字符命名的附件是一个不容忽视的测试用例,也是非常容易发现bug的环节。如下图所以,用户期望的日文文件名在该场景中已经变为了不可读的乱码。 



导致这个现象的技术成因有很多,这里我们使用了Spring MVC框架的@RequestMapping(参数绑定)作为技术背景对问题进行剖析。

 

首先对参数绑定做一个简单介绍。@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。放在类名前,表示类中的所有响应请求的方法都是以该地址作为父路径。


RequestMapping注解有三大类共六个属性。

1、value,method

value:指定请求的实际地址,指定的地址可以是URI Template 模式

method:指定请求的method类型,包括GET、POST、PUT、DELETE等

 

2、consumes,produces

consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html

produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

 

3、params,headers

params: 指定request中必须包含某些参数值是,才让该方法处理

headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求

 

但这些技术点在本例中都并非主角,在所有元素都具备的情况下,乱码依然无法避免。而解决该问题的不二法门则需参考粗体部分的代码。

@ResponseBody
@RequestMapping(method = RequestMethod.GET, value = "/downloadDrl/{id}", produces = "text/plain;<strong>charset=UTF-8</strong>")
public void downloadFile(@PathVariable("id") Long id, HttpServletResponse response) throws GeneralException, IOException {
<span style="white-space:pre">	</span>...
}
 
@RequestMapping(method = RequestMethod.GET, value = "/downloadTemplate", produces = "text/plain;<strong>charset=UTF-8</strong>")
private void writeFile(byte[] data, HttpServletResponse response, String fileName) throws IOException {
...
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")</strong>);
...
}

粗体代码一旦生效后,用户在下载附件时,就可以看到文件名已经恢复为之前用户设置的日文字符。由此我们可以总结如下——在Spring MVC技术框架下,为了实现良好的国际化支持,@RequestMapping不仅需要在produces参数中明示charset,还得考虑为HttpServletResponse对象设置合适的Character Encoding,从而避免乱码问题的出现。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值