1. 程式人生 > >Springboot:IE瀏覽器中@responseBody出現檔案下載的解決辦法

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的依賴使用。