1.普通接口跨域
针对这个情况,可以写一个Java过滤器来解决问题
/**
* 跨域过滤器
*/
public class OriginFilter implements Filter {
public static final String PARAM_NAME_EXCLUSIONS = "exclusions";
public static final String PARAM_NAME_INCLUSIONS = "inclusions";
private Set<String> excludesPattern;
private Set<String> includesPattern;
protected String contextPath;
protected PatternMatcher pathMatcher = new ServletPathMatcher();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String param = filterConfig.getInitParameter(PARAM_NAME_EXCLUSIONS);
if (param != null && param.trim().length() != 0) {
this.excludesPattern = new HashSet(Arrays.asList(param.split("\\s*,\\s*")));
}
String param_ = filterConfig.getInitParameter(PARAM_NAME_INCLUSIONS);
if (param_ != null && param_.trim().length() != 0) {
this.includesPattern = new HashSet(Arrays.asList(param_.split("\\s*,\\s*")));
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
//看着打印点参数(请求的头之类的)
Logger log = LoggerFactory.getLogger(OriginFilter.class);
Enumeration<String> head = httpRequest.getHeaderNames();
String requestURI = this.getRequestURI(httpRequest);
log.info(requestURI + ":>>>进了过滤器==============================");
Enumeration enu = httpRequest.getParameterNames();
Map map = new HashMap();
while (enu.hasMoreElements()) {
String paraName = (String) enu.nextElement();
map.put(paraName, httpRequest.getParameter(paraName));
}
log.info(requestURI + ":" + String.valueOf(map));
//跨域参数
httpResponse.setHeader("Access-Control-Allow-Origin", "*");
httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
httpResponse.setHeader("Access-Control-Max-Age", "3600");
httpResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with,Encrypt,Access-token");
//直接进行操作
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
/**
* 获取请求的url
* @param request
* @return
*/
public String getRequestURI(HttpServletRequest request) {
return request.getRequestURI();
}
}
import javax.servlet.DispatcherType;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class OrginFilterConfig {
@Bean
FilterRegistrationBean orginFilter() {
FilterRegistrationBean filterReg = new FilterRegistrationBean(new OriginFilter());
//优先级
filterReg.setOrder(100);
filterReg.setDispatcherTypes(DispatcherType.REQUEST);
//匹配路径
List<String> urlPatterns = new ArrayList<>();
// urlPatterns.add("/*");
//filterReg.addUrlPatterns("/*");
//需要验证的url
filterReg.addInitParameter("inclusions", "/**");
//需要验证的url 中不进行token验证的url
//filterReg.addInitParameter("exclusions", "/v1/user/login");
return filterReg;
}
}
这是我封好的一个简单的过滤器,拿去贴就能用
2.普通页面跨域
这个跨域一般使用场景是iframe吧,虽然现在在逐渐淘汰这东西,但是碰上不用还不行
父页面
//获取iframe对象
let frame = document.getElementById('对象id');
//发请求
let data={'name':'admin','psd':'123456'}
frame.contentWindow.postMessage({response:user},'*');
//接请求
window.addEventListener('message',function(event){
console.log(event.data.response);
})
//发请求
window.parent.postMessage({response:'user'},'*');
//接请求
window.addEventListener('message',function(event){
// event对象里很多传递的信息,可以逐条打印event看看
//注意event.source是发送人的window对象
user=event.data.response;
})