一、技术栈
前端:Vue、Axios
后端:Spring Security、SpringBoot、JWT等等
二、问题描述
报错信息如下(前端):
Access to XMLHttpRequest at 'http://localhost:8081/restaurant/list' from origin 'http://localhost:8080' has been blocked by CORS policy: Request header field token is not allowed by Access-Control-Allow-Headers in preflight response.
Error: Network Error
at createError (createError.js?2d83:16:1)
at XMLHttpRequest.handleError (xhr.js?b50d:99:1)
GET http://localhost:8081/restaurant/list net::ERR_FAILED
报错信息翻译:
在preflight响应中,Access-Control-Allow-Headers不允许请求报头字段标记。
这个翻译也让我们很快知道了问题的所在,就是Access-Control-Allow-Headers里面不允许token字段出现,也就是说,token字段不允许出现在Headers里面。
我也看到这个问题看起来是没有走到后端,我Debug了一下后端的过滤器,发现有写过滤器可以进行Debug,但是有些过滤器根本没有进行Debug就结束了,我Debug了一下我后端接口的Controller接口,也没有走到那里,这说明我的请求没有走到接口,而是背被某个过滤器给劫持了,我自己也看了很久,在网上翻看了一些资料之后,我发现了解决方法。
三、解决方法
在Java项目的过滤器配置类中,加入下面的配置信息:
response.setHeader("Access-Control-Allow-Headers", "token, access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
完整的配置文件如下:文章来源:https://www.toymoban.com/news/detail-755919.html
@Component
@Slf4j
public class SimpleCORSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest reqs = (HttpServletRequest) req;
String curOrigin = reqs.getHeader("Origin");
log.info("curOrigi:" + curOrigin);
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, HEAD,PUT");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "token, access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
HttpServletRequest request = (HttpServletRequest) req;
log.info("当前请求方法" + request.getMethod());
if ("OPTIONS".equals(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
return;
}
chain.doFilter(req, res);
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
原因是如果需要往Header里面添加新的字段内容,需要在后端配置这个信息才行,这样后端才可以正常接收Header里面的数据。
这样,就可以正常访问后端数据了。
文章来源地址https://www.toymoban.com/news/detail-755919.html
到了这里,关于Java过滤器配置类导致跨域问题:Request header field token is not allowed by Access-Control-Allow-Headers in prefli的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!