@ResponseBody对content-type进行重写

1.@ResponseBody注解作用

    @ResponseBody注解的作用是将Controller方法返回的对象通过适当的转换器(HttpMessageConverter)转换为指定的格式,并将其写入到response对象的body区,一般都是用来返回JSON数据或者XML数据。在使用此注解后,SpringMVC将不会再走视图处理器(即当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象),而是直接将数据写入到流中,它的效果等同于通过response对象输出指定格式的数据。

2.业务需求:

    项目需求是:系统管理端需要将查询出来的数据导出并下载,下载的格式是excle。

    原本的处理方式:后端提供两个接口,一个export接口,用于将数据导出到excle文件中,返回数据中会提供需要下载的文件名;一个download接口,通过export接口返回的下载文件名,请求download接口下载。

    遇到的问题:在测试环境下,由于是单台服务器,前端通过连续的两次请求都会请求到同一台服务器上,所以不会有问题。但是当将项目部署到现网环境后,由于是分布式的环境,会出现同一个客户端两次连续的请求到了两台不同的服务器上,导致下载的文件没有相关的数据。

    解决方法:将两个接口合并为一个接口进行请求处理。

    再次遇到的问题:由于原先export接口返回给前端的是通过@ResponseBody,以JSON字符串的形式返回给前端,在download接口中,是通过HttpServletResponse中流的形式返回给前端,在download接口中设置了一些头的属性如下图所示,提供前端下载excle文件,在合并后新的接口中,还是使用了@ResponseBody进行了接口请求成功与否的相关返回说明,但是浏览器并没有产生下载行为

@ResponseBody对content-type进行重写_第1张图片

    解决过程:通过f12查看前端请求详情的时候,发现Content-Type属性及相关属性设置都没起作用,如下图所示,后来考虑到@ResponseBody注解是否会修改相关的响应头信息,将Content-Type属性设置为了application/json;charset=UTF-8,在去除注解后,能成功下载,相关请求头设置成功。

                        @ResponseBody对content-type进行重写_第2张图片

你可能感兴趣的:(错误记录)