目地:
很多程序页面中会用到很多的静态资源文件(image/css/js),有些是页面中初始化加载的,有些是通过后台接口返回给页面动态加载的。这些静态资源文件的域名是写死的(www.xxx.com/ss.xxx.com),目前有些浏览器或平台会对这些域名封禁,我们需要一个能快速替换静态资源文件地址中域名的方案。
方案:
后台的接口,在返回结果时对有包含指定的域名进行替换。这里考虑使用AOP拦截器,对@StaticResourceMapping的注解进行切面拦截,通过后置通知获取返回的对象,遍历对象中的属性进行域名替换。
1,定义一个模型,包含要替换的域名和替换后的域名,存放在redis中
package com.bxm.hcmony.sc.domain;
import org.apache.commons.collections.CollectionUtils;
import java.net.URI;
import java.util.List;
/**
* <h3>替换模型</h3>
* <p></p>
*
* @author hcmony
* @since V1.0.0, 2019/01/23 11:32
*/
public class ResourceModel {
/**
* 源目标
*/
private List<String> sourceList;
/**
* 替换目标
*/
private String targetUrl;
public List<String> getSourceList() {
return sourceList;
}
public void setSourceList(List<String> sourceList) {
this.sourceList = sourceList;
}
public String getTargetUrl() {
return targetUrl;
}
public void setTargetUrl(String targetUrl) {
this.targetUrl = targetUrl;
}
public boolean isContains(String url){
if(CollectionUtils.isEmpty(sourceList)){
return false;
}
if(sourceList.contains(getHost(url))){
return true;
}
return false;
}
private String getHost(String url){
URI uri;
try {
uri = URI.create(url);
return uri.getHost();
} catch (Exception e) {
return url;
}
}
}
2,定义一个注解,标注在方法上面,对有些标注的方面进行拦截
package com.bxm.hcmony.sc.domain;
import java.lang.annotation.*;
/**
* <h3>主要应用于静态资源拦截 {@link StaticResourceReplaceHandler}</h3>
*
*