一、技術(shù)棧
前端: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響應(yīng)中,Access-Control-Allow-Headers不允許請求報頭字段標(biāo)記。
這個翻譯也讓我們很快知道了問題的所在,就是Access-Control-Allow-Headers里面不允許token字段出現(xiàn),也就是說,token字段不允許出現(xiàn)在Headers里面。
我也看到這個問題看起來是沒有走到后端,我Debug了一下后端的過濾器,發(fā)現(xiàn)有寫過濾器可以進(jìn)行Debug,但是有些過濾器根本沒有進(jìn)行Debug就結(jié)束了,我Debug了一下我后端接口的Controller接口,也沒有走到那里,這說明我的請求沒有走到接口,而是背被某個過濾器給劫持了,我自己也看了很久,在網(wǎng)上翻看了一些資料之后,我發(fā)現(xiàn)了解決方法。
三、解決方法
在Java項目的過濾器配置類中,加入下面的配置信息:
response.setHeader("Access-Control-Allow-Headers", "token, access-control-allow-origin, authority, content-type, version-info, X-Requested-With");
完整的配置文件如下:文章來源:http://www.zghlxwxcb.cn/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("當(dāng)前請求方法" + 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里面添加新的字段內(nèi)容,需要在后端配置這個信息才行,這樣后端才可以正常接收Header里面的數(shù)據(jù)。
這樣,就可以正常訪問后端數(shù)據(jù)了。文章來源地址http://www.zghlxwxcb.cn/news/detail-755919.html
到了這里,關(guān)于Java過濾器配置類導(dǎo)致跨域問題:Request header field token is not allowed by Access-Control-Allow-Headers in prefli的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!