Spring MVC @RequestMapping中的乱码问题解析
2016-08-14 19:39
375 查看
国际化测试过程中,上传下载以本地字符命名的附件是一个不容忽视的测试用例,也是非常容易发现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值,才能让该方法处理请求
但这些技术点在本例中都并非主角,在所有元素都具备的情况下,乱码依然无法避免。而解决该问题的不二法门则需参考粗体部分的代码。
粗体代码一旦生效后,用户在下载附件时,就可以看到文件名已经恢复为之前用户设置的日文字符。由此我们可以总结如下——在Spring MVC技术框架下,为了实现良好的国际化支持,@RequestMapping不仅需要在produces参数中明示charset,还得考虑为HttpServletResponse对象设置合适的Character Encoding,从而避免乱码问题的出现。
导致这个现象的技术成因有很多,这里我们使用了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,从而避免乱码问题的出现。
相关文章推荐
- SpringMVC @RequestParam 中文乱码问题解决
- SpringMVC @RequestParam参数乱码的问题
- 本人小白一枚,刚学习SpringMVC+MyBatis,遇到了一个问题一直报错 **No mapping found for HTTP request with URI**
- SpringMVC @RequestParam 中文乱码问题解决
- SSM-----springMVC No mapping found for HTTP request with URI的问题
- SpringMVC @RequestParam 中文乱码问题解决
- SpringMVC @RequestParam 中文乱码问题解决
- 解决spring3 mvc中乱码的问题。
- SpringMVC ajax JSON 中文乱码问题
- springmvc Spring3 MVC @ResponseBody返回,jquery ajax调用中文乱码问题解决
- 简易解析ajax,javascript-XMLHttpRequest,解决乱码问题
- ASP.NET MVC中解析淘宝网页出现乱码问题的解决方法
- 解决Spring MVC @ResponseBody返回中文字符串乱码问题
- 解决Spring MVC @ResponseBody返回中文字符串乱码问题
- Spring 的MVC @RequestMapping
- spring mvc No mapping found for HTTP request with URI [] in DispatcherServlet
- 解决Spring MVC @ResponseBody返回中文字符串乱码问题
- springmvc + freemarker 解决表单提交、页面显示乱码 的问题
- spring mvc page not found no mapping found for http request with uri
- SpringMVC redirect乱码问题