看了下网上的信息,说是因为 OPTIONS 请求无法携带自定义头请求,这是真的么?
报错信息为
Failed to load http://192.168.1.107:8066/talk/queryList: Response to preflight request
doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on
the requested resource. Origin 'http://192.168.1.107:8080' is therefore not allowed access.
从网上搜了一下,说一般跨域请求都会两次请求,可是为什么我这个只有一次?
OPTIONS的请求返回值也是200,为什么不执行下一次请求了呢
之前一般都会发两次请求,这次不知道为什么变成了只发一次
开发者工具中显示的请求信息
前台axios设置,remove token方便测试,也是每次刷新页面才remove
const axios = Axios.create({
// baseURL: 'http://localhost:8066',
baseURL: 'http://192.168.1.107:8066',
withCredentials:true,
timeout: 5000,
// headers: {'X-Custom-Header': 'foobar'}
})
Cookies.remove('token');
axios.interceptors.request.use(
config => {
// 这里写死一个token,你需要在这里取到你设置好的token的值
const token = Cookies.get('token');
console.log(token)
if (token) {
// 这里将token设置到headers中,header的key是Authorization,这个key值根据你的需要进行修改即可
config.headers.token = token;
}
return config
},
error => {
return Promise.reject(error)
});
export default axios
后台java设置
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
//设置允许跨域的路径
registry.addMapping("/**")
//设置允许跨域请求的域名
.allowedOrigins("*")
//是否允许证书 不再默认开启
.allowCredentials(true)
//设置允许的方法
.allowedMethods("*")
//跨域允许时间
.maxAge(3600);
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new LoginUserInfoMethodArgumentResolver());
}
}
public class LoginUserInfoMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public Object resolveArgument(MethodParameter arg0, ModelAndViewContainer arg1, NativeWebRequest arg2,
WebDataBinderFactory arg3) throws Exception {
return UserUtil.getUser();
}
@Override
public boolean supportsParameter(MethodParameter arg0) {
return arg0.getParameterType().equals(User.class);
}
}
@Configuration
@WebFilter(filterName = "myFilter", urlPatterns = "/*")
public class MyFilter implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String cookieToken = CookieUtils.getCookie(req, "token");
String headerToken = req.getHeader("token");
System.out.println("headerToken27:" + headerToken);
if (TokenUtils.notCorrect(headerToken) && !req.getRequestURI().contains("login")) {
return;
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
请求可以进入后台,但是String headerToken = req.getHeader("token"); 是null
百度半天
参考:
https://www.2cto.com/kf/20171...
https://www.jianshu.com/p/f37...
好像是options请求无法携带自定义header
过滤器里面加了这行代码就好了