web-dev-qa-db-ja.com

AxiosはCookieを送信しません、Ajax(xhrFields)はうまくいきます

Axiosの使用

export function sendAll() {
  return (dispatch) => {
    dispatch(requestData());
    return axios({
      method: 'POST',
      url: `${C.API_SERVER.BASEURL}/notification/sendAll`,
      data: {prop: 'val'},
      // responseType: 'json',
      headers: {
        'Content-Type': 'application/json'
      },
      withCredentials: true
    }).then((response) => {
      dispatch(receiveData(response));
    }).catch((response) => {
      dispatch(receiveError(response));
      // dispatch(pushState(null, '/error'));
    })
  }
};

Axiosを使用した結果

Chrome network tab when using Axios

$ .ajaxの使用

$.ajax({
  url: " http://local.example.com:3001/api/notification/sendAll",
  method: "post",
  data: {},
  crossDomain: true,
  xhrFields: {
    withCredentials: true
  }
})

$ .ajaxを使用した結果

Chrome network tab when using $.ajax

POSTにデータを添付しようとすると、AxiosにPOSTを送信させることができません(どちらの方法でもCookieが送信されません)。私のサーバー設定(エクスプレス):

app.use(function (req, res, next) {
  res.header("Access-Control-Allow-Origin", `${C.PROTOCOL}://${C.DOMAIN}:${C.PORT}`);
  res.header("Access-Control-Request-Headers", "*");
  res.header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
  res.header("Access-Control-Allow-Credentials", "true");
  next();
});

OPTIONSルートを定義していません。 AxiosにPOSTをcookieで送信してほしい。

router.post('/notification/sendAll', function (req, res, next) {
  res.sendStatus(204);
  // ...
});
9
michael

私は同様の問題に直面していました。 Axiosを介してget/postリクエストを行うと、ストレートXHRリクエストと同じヘッダーが送信されませんでした。

次に、Axios requireステートメントの直後に次のコードを追加しました。

axios.defaults.withCredentials = true;

その後、Axiosは通常のXHRリクエストと同じようにCookieを送信し始めました。

20
Danielo515

Danielo515's 答えを使用した作業例:

import * as axios from 'axios';
axios.defaults.withCredentials = true;


export function getAll() {
    const url = 'https://example.com';
    return axios.get(url);
}
0
jinzo21