https://www.jianshu.com/p/abb5f6bf92c3 強烈推薦閱讀至少能了解一點點原理
https://blog.csdn.net/qq_43486273/article/details/83272500
1.使用過濾器解決跨域問題
access-control-allow-headers: Authorization, Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, X-Requested-By, If-Modified-Since, X-File-Name, X-File-Type, Cache-Control, Origin
import com.alibaba.fastjson.JSONObject; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Component public class CORSFilter implements Filter { /** * 解決ajax跨域問題 * * @param request * @param response * @param chain * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String origin = req.getHeader("Origin");/*獲取客戶端的域名**/ res.addHeader("Access-Control-Allow-Credentials", "true");/*允許帶Cookie的跨域Ajax請求*/ res.addHeader("Access-Control-Allow-Origin", origin); /*設置允許訪問的域名地址**/ res.addHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");/*允許請求的方式**/ res.addHeader("Access-Control-Allow-Headers", "*");/*設置允許前端添加所有自定義請求頭**/ // res.addHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, Depth, User-Agent, X-File-Size, X-Requested-With, X-Requested-By, If-Modified-Since, X-File-Name, X-File-Type, Cache-Control, Origin"); /** * 設置預檢命令的緩存時效。單位是"秒" * 如果沒有失效,則不會再次發起OPTION預檢請求 */ res.addHeader("Access-Control-Max-Age", "7200"); if (req.getMethod().equals("OPTIONS")) { response.getWriter().print(""); res.setStatus(204); } try { chain.doFilter(request, response); } catch (ServletException e) { int code = res.getStatus(); //獲取相應狀態碼res.getStatus() JSONObject jsonData = new JSONObject(); jsonData.put("code", code); jsonData.put("msg", "OPTIONS The request failed"); jsonData.put("result", ""); String dataStr = jsonData.toJSONString(); response.getWriter().println("{data:" + dataStr + "}"); } } @Override public void destroy() { } @Override public void init(FilterConfig filterConfig) throws ServletException { } }
res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN,token");/**前端可以發送token這些自定義的請求頭**/