Springboot:IE瀏覽器中@responseBody出現檔案下載的解決辦法
今天在linux系統中部署的專案啟動的時候,在瀏覽器中彈出下載檔案,在網上參考了下別人的文章,在啟動類中加入一個bean,通過text-plian來解決。
依賴的jar包:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version
</dependency>
public class WebApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(WebApplication.class);
}
/**
* 解決ie資料儲存出現下載對話方塊的問題
* @return
*/
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters(){
//1.需要定義一個convert轉換訊息的物件;
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//2處理ie瀏覽器儲存資料時出現下載json資料問題
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.TEXT_PLAIN);
//3.在convert中新增配置資訊.
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
return new HttpMessageConverters(converter);
}
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
加入這個Bean之後,終於實現了不用下載就可以檢視返回結果,但是返回的中文出現了亂碼,經過一番查詢原始碼,發現通過如下方式來解決這個問題:即不使用MediaType.TEXT_PLAIN屬性,而是通過new出新物件來解決。new MediaType("text", "plain", Charset.forName("UTF-8")。也可以使用下文中的方法,將這個返回的json傳進行格式化處理,至此問題完美解決。
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters(){
//1.需要定義一個convert轉換訊息的物件;
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//2處理ie瀏覽器儲存資料時出現下載json資料問題
List<MediaType> fastMedisTypes = new ArrayList<>();
//fastMedisTypes.add(MediaType.APPLICATION_JSON_UTF8);
//fastMedisTypes.add(MediaType.TEXT_PLAIN);
fastMedisTypes.add(new MediaType("text", "plain", Charset.forName("UTF-8")));
//3.在convert中新增配置資訊.
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMedisTypes);
HttpMessageConverter<?> converter = fastJsonHttpMessageConverter;
return new HttpMessageConverters(converter);
}
Spring boot,通過建立實體類,然後通過實體類返回則就是json的格式,所以使用spring boot,不用擔心返回格式處理不了的問題。springBoot,預設使用的json解析框架是Jackson。雖然jackson能夠滿足json的解析,但是心裡最熟悉的依舊是alibaba的fastjon,當然,fastjon的要求springboot也是可以滿足的,我們只需要在pom檔案中配置maven依賴就好。
maven依賴完成之後,我們可以通過兩種方式配置fastjon
方法一:啟動類繼承extends WebMvcConfigurerAdapter,且覆蓋configureMessageConverters
package springboot;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.util.ArrayList;
import java.util.List;
@SpringBootApplication
public class App extends WebMvcConfigurerAdapter{
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
/* 1、先定義一個convert轉換訊息的物件 2、新增fastjson的配置資訊,比如是否要格式化返回的json資料;
3、在convert中新增配置資訊 4、將convert新增到converters*/
//1、先定義一個convert轉換訊息的物件
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
//2、新增fastjson的配置資訊,比如是否要格式化返回的json資料;
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures( SerializerFeature.PrettyFormat); //是否需要格式化
//附加:處理中文亂碼(後期新增)
List<MediaType> fastMedisTypes=new ArrayList<MediaType>();
fastMedisTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMedisTypes);
//3、在convert中新增配置資訊
fastConverter.setFastJsonConfig(fastJsonConfig);
//4、將convert新增到converters
converters.add(fastConverter);
}
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
如何判定使用的是fastJson呢?我們在實體類上,新增如上一個時間引數:
private int id;
private String name;
//新增一個當前時間欄位
@JSONField(format = "yyyy-MM-dd HH:mm")
private Date createTime;
/* * 不想返回該屬性, serialize:是否進行序列化 */ @JSONField(serialize = false) private String remarks;//備註資訊
(2)若不想讓介面返回一個屬性,則設定 @JSONField 的 serialize 屬性為false(不進行序列化);
@JSONField 就是基於fastjson的一種格式轉換,通過返回值看到了我們想要的日期效果,所以這種json則是通過fastjson解析出來的;
如果解析資料遇到亂碼問題的話,則通過上述程式碼段中新增的處理中文亂碼方式來解決。
除此之外,我們還可以通過@JSONField(serialize = false)來決定欄位的顯示與否,也可以解決我們日常過多的欄位不需要返回的問題。
方法二:在啟動類中,注入Bean:HttpMessageConverters
@Bean
public HttpMessageConverters fastJsonHttpMessageConverters(){
//1、先定義一個convert轉換訊息的物件
FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter();
//2、新增fastjson的配置資訊,比如是否要格式化返回的json資料;
FastJsonConfig fastJsonConfig=new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
//附加:處理中文亂碼
List<MediaType> fastMedisTypes = new ArrayList<MediaType>();
fastMedisTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMedisTypes);
//3、在convert中新增配置資訊
fastConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter=fastConverter;
return new HttpMessageConverters(converter);
}
其實程式碼的核心是相同的,這是調取的方式不同而已。兩種方式都可以滿足我們對於fastjson的依賴使用。