最近解决IE的兼容性问题,遇到在IE中的修改不能实时的update。就算是强制刷新也没有用,怀疑是cache的原因,在网上参考其他人的解决方案。是因为IE把API也cache下来了。
前端的解决方案:给API添加随机数或者时间戳,但是弊端是每一个都需要添加。前端添加之后,后端没有参数也没有关系。
var url = '/api/metadata/entity/list?type=car&name=qq&_t=' + new Date().getTime()
最终采用服务器端的解决方案(springboot),一劳永逸
在WebMvcConfigurer 添加方法 addInterceptors
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
//序列化配置
FastJsonConfig config = new FastJsonConfig();
config.setSerializerFeatures(
QuoteFieldNames,// 输出key时是否使用双引号
WriteMapNullValue,// 是否输出值为null的字段
WriteNullNumberAsZero,//数值字段如果为null,输出为0,而非null
WriteNullListAsEmpty,//List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty,//字符类型字段如果为null,输出为"",而非null
//WriteNullBooleanAsFalse,//Boolean字段如果为null,输出为false,而非null
//WriteNullStringAsEmpty,// null String不输出
//WriteMapNullValue,//null String也要输出
//WriteDateUseDateFormat,//Date的日期转换器
DisableCircularReferenceDetect//禁止循环引用
);
converter.setFastJsonConfig(config);
converters.add(converter);
}
//解决跨域
@Bean
public CorsFilter corsFilter() {
CorsConfiguration conf = new CorsConfiguration();
conf.addAllowedHeader("*");
conf.addAllowedMethod("*");
conf.addAllowedOrigin("*");
conf.setAllowCredentials(true);
conf.setMaxAge(3600L);
conf.addExposedHeader("set-cookie");
conf.addExposedHeader("access-control-allow-headers");
conf.addExposedHeader("access-control-allow-methods");
conf.addExposedHeader("access-control-allow-origin");
conf.addExposedHeader("access-control-max-age");
conf.addExposedHeader("X-Frame-Options");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", conf); // 4 对接口配置跨域设置
return new CorsFilter(source);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CommonInterceptor());
WebMvcConfigurer.super.addInterceptors(registry);
}
}
新建CommonInterceptor
package com.cspl.portal.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
public class CommonInterceptor implements HandlerInterceptor {
private List<String> excludedUrls;
public List<String> getExcludedUrls() {
return excludedUrls;
}
public void setExcludedUrls(List<String> excludedUrls) {
this.excludedUrls = excludedUrls;
}
/**
*
* 在业务处理器处理请求之前被调用 如果返回false
* 从当前的拦截器往回执行所有拦截器的afterCompletion(),
* 再退出拦截器链, 如果返回true 执行下一个拦截器,
* 直到所有的拦截器都执行完毕 再执行被拦截的Controller
* 然后进入拦截器链,
* 从最后一个拦截器往回执行所有的postHandle()
* 接着再从最后一个拦截器往回执行所有的afterCompletion()
*
* @param request
*
* @param response
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache");
response.setIntHeader("Expires", 0); //关键起效
return true;
}
// 在业务处理器处理请求执行完成后,生成视图之前执行的动作
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
/**
*
* 在DispatcherServlet完全处理完请求后被调用
* 当有拦截器抛出异常时,
* 会从当前拦截器往回执行所有的拦截器的afterCompletion()
*
* @param request
*
* @param response
*
* @param handler
*
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
}
}