最近公司项目出现这样一个问题,公司的项目部署在政务云服务器,而政务云服务器所在网络是电信提供的,如果用户通过手机的非电信4G网络访问项目资源,比如MP4等,则会被电信拦截,导致访问极慢无法正常提供服务。为了解决这个问题需要用cdn服务来提供资源,以前的资源都是存在服务器上,因此需要做最小的调整切换cdn服务。

解决方案:

在spring框架下,可以利用ResponseBodyAdvice接口,实现该接口则能够在声明了ResponseBody注解的controller返回json数据前,统一对json数据做处理,将资源地址的url统一替换为cdn资源url。

源码下载(包括注解类等完整java类):https://download.csdn.net/download/wy277737174/10916038

源码参考:


@ControllerAdvice
public class MyResponseBodyAdvice implements ResponseBodyAdvice{
	
	protected Logger logger = LoggerFactory.getLogger(this.getClass());

	@Override
	public Object beforeBodyWrite(Object returnValue, MethodParameter arg1, MediaType arg2, Class arg3, ServerHttpRequest arg4,
			ServerHttpResponse arg5) {
		if(returnValue instanceof JsonResultUtil) {
			try {
				JsonResultUtil msg=(JsonResultUtil) returnValue;

				if(msg.get("data") instanceof ArrayList) {
					logger.info("MyResponseBodyAdvice getTypeName-->" + msg.get("data").getClass().getTypeName());
					String data = new Gson().toJson(msg.get("data"));
					if(data.contains("http://znx.****.com")) {
						Gson gson1=new Gson();
						logger.info("msg.get(\"data\").getClass().getTypeName()-->" + msg.get("data").getClass().getTypeName());
						List list= gson1.fromJson(data.replaceAll("http://znx.****.com", "http://znxcdn.****.com"), new TypeToken() {}.getType());
						msg.put("data", list);
					}
				}else if(msg.containsKey("data") && msg.get("data") != null) {
					logger.info("MyResponseBodyAdvice getTypeName-->" + msg.get("data").getClass().getTypeName());
					String data = new Gson().toJson(msg.get("data"));
					String className = msg.get("data").getClass().getTypeName();
					Class pClass=Class.forName(className);
					//构造器
					Constructor c= pClass.getConstructor();
					//通过构造器实例化
					Object obj = c.newInstance();
					if(data.contains("http://znx.*****.com")) {
						Gson gson1=new Gson();
						logger.info("msg.get(\"data\").getClass().getTypeName()-->" + msg.get("data").getClass().getTypeName());
						obj = gson1.fromJson(data.replaceAll("http://znx.****.com", "http://znxcdn.****.com"), obj.getClass());
						msg.put("data", obj);
					}
				}
			}catch(Exception e) {
				e.printStackTrace();
				logger.info("MyResponseBodyAdvice  出错-->" + e.getMessage());
			}
		}
		logger.info("MyResponseBodyAdvice-->" + new Gson().toJson(returnValue));
		//统一修改返回值/响应体
		//返回修改后的值
		return returnValue;
	}

	@Override
	public boolean supports(MethodParameter arg0, Class arg1) {
		NeedEditResponseBody anno = arg0.getMethod().getAnnotation(NeedEditResponseBody.class);
		logger.info("NeedEditResponseBody --->" + anno);
		if(anno != null) {    //只有方法上有NeedEditResponseBody,才会对json数据进行再处理,将资源改为cdn资源
			return true;
		}
		return false;
	}

}

(转载本站原创文章请注明作者与出处Coding云--codingyun.com)

打赏
  • 微信
  • 支付宝

评论
来发评论吧~