当我们采用CROS的跨域方案,并且header上需要加上自定义属性的时候,如果仅仅在方法中加上res.setHeader("Access-Control-Allow-Origin", "*");就不管用了。
比如我们的方法这样写:
function deleteUserByGet(){
var reportUrl = "http://localhost:8075/webroot/decision/bg/deleteUserByOrgCodeAndName1?userName=demo&orgCode=1111"
$.ajax({
type: "GET",
url: reportUrl,
headers:{
"X-Access-Token":"ssssaaaassss",
},
success:function(res){
console.log("aaa结果:" + res);
},
});
}
header中带上我们自定义的属性X-Access-Token。
这时会报:
可以看到这里会先发一个OPTIONS的请求,状态代码是403.403是拒绝访问,这时因为帆软报表的部署包中tomcat的web.xml中将OPTIONS请求给禁用了,所以我们需要放行。将部署包中conf/web.xml中的
这里面配置的是禁用OPTIONS请求,我们需要将这个删除,或者全部删除。
删除后重启后的效果还是报错:
但是此时状态代码已经是500了,说明OPTIONS请求已经放开了,只是没有正确的 返回。此时我们需要来处理这个OPTIONS请求。
我们定义一个全局的过滤器,
package com.fr.plugin.jsd9683.filter;
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestGlobalFilter extends AbstractGlobalRequestFilterProvider {
@Override
public String filterName() {
return "RequestGlobalFilter";
}
@Override
public String[] urlPatterns() {
return new String[]{
"/decision/*",
};
}
@Override
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) {
FineLoggerFactory.getLogger().info("===============================RequestGlobalFilter:" );
String origin = req.getHeader("Origin");
FineLoggerFactory.getLogger().info("===============================origin:" +origin);
if (StringUtils.isNotEmpty(origin)) {
res.addHeader("Access-Control-Allow-Origin", origin);
String headers = req.getHeader("Access-Control-Request-Headers");
FineLoggerFactory.getLogger().info("===============================headers:" +headers);
if (StringUtils.isNotEmpty(headers))
res.addHeader("Access-Control-Allow-Headers", headers);
res.addHeader("Access-Control-Allow-Methods", "*");
res.addHeader("Access-Control-Max-Age", "3600");
}
String methodName = req.getMethod();
FineLoggerFactory.getLogger().info("===============================methodName:" +methodName);
if (methodName.equals("OPTIONS")) {
res.setStatus(HttpServletResponse.SC_OK);
FineLoggerFactory.getLogger().info("options set status ok");
}
else{
try {
filterChain.doFilter(req,res);
} catch (IOException e) {
e.printStackTrace();
} catch (ServletException e) {
e.printStackTrace();
}
}
}
}
此时我们判断如果是OPTIONS请求来了,直接返回200状态码,最后的结果: