亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何通過 POST 在 Angular/Spring 中注銷

如何通過 POST 在 Angular/Spring 中注銷

慕碼人8056858 2023-03-02 09:50:33
我想使用 POST 方法通過 Angular 注銷,這是我的代碼:  logout() {    const url = 'http://localhost:8181/user/logout';    const xToken = localStorage.getItem('xAuthToken');    const basicHeader = 'Basic ' + localStorage.getItem('credentials');    const headers = new Headers({      'x-auth-token': xToken,      'Authorization': basicHeader    });    // return this.http.get(url, { headers: headers }); // This will work    return this.http.post(url, { headers: headers }); // This will generate error  }這是我的后端:@RequestMapping("/user/logout")public ResponseEntity<String> logout(){    SecurityContextHolder.clearContext();    return new ResponseEntity<String>("Logout Successfully!", HttpStatus.OK);}奇怪的是上面的代碼可以使用this.http.get但會生成以下錯誤this.http.post。這是錯誤的this.http.post:POST http://localhost:8181/user/logout 401如果我使用 HttpClient 修改代碼,如下所示:import { Injectable } from '@angular/core';import { Http, Headers } from '@angular/http';import { HttpClient } from '@angular/common/http';@Injectable({  providedIn: 'root'})export class LoginService {  constructor(private http: HttpClient) {  }  sendCredential(username: string, password: string) {    let url = "http://localhost:8181/token";    let encodedCredentials = btoa(username + ":" + password);// encode in base64 to send a token    let basicHeader = "Basic " + encodedCredentials;    let headers = new Headers({      'Content-Type': 'application/x-www-form-urlencoded',      'Authorization': basicHeader    })    // send credential method when login component    return this.http.get(url, { headers: headers }); // Error at this line  }  checkSession() {    const url = 'http://localhost:8181/checkSession';    const xToken = localStorage.getItem('xAuthToken');    const basicHeader = 'Basic ' + localStorage.getItem('credentials');    const headers = new Headers({      'x-auth-token': xToken,      'Authorization': basicHeader    });    return this.http.get(url, { headers: headers }); // Error at this line  }}
查看完整描述

3 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

headers嘗試這樣設置:

let headers = new HttpHeaders();
headers = headers.set('x-auth-token', xToken).set('Authorization', basicHeader);

進而,

return this.http.post(url, null, headers );

null按照它body在第二個參數中接受的方式傳遞。

使用 HttpClient

import { HttpClient } from '@angular/common/http';

constructor(private http: HttpClient) { }

在 app.module.ts中

import { HttpClientModule } from '@angular/common/http';

在@NgModule 中: imports: [ HttpClientModule ]


查看完整回答
反對 回復 2023-03-02
?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

這很正常,默認情況下@RequestMapping("/user/logout")只接受GET請求。您必須明確設置方法


@RequestMapping("/user/logout", method = RequestMethod.POST)

public ResponseEntity<String> logout(){

    SecurityContextHolder.clearContext();

    return new ResponseEntity<String>("Logout Successfully!", HttpStatus.OK);

}

或者使用@PostMapping


查看完整回答
反對 回復 2023-03-02
?
莫回無

TA貢獻1865條經驗 獲得超7個贊

嘗試這個:


constructor(private http:HttpClient){}

logout()

{

    const url = 'http://localhost:8181/user/logout';

    const headers = new HttpHeaders()

      .set('x-auth-token', localStorage.getItem('xAuthToken'));


    return this.http.post(url, '' ,{headers: headers, responseType: 'text'})};

在 Spring 中,我的建議是使用@PostMappingor @DeleteMappingannotation 而不是@RequestMapping. 使用 as 'text' 的原因ResponseType是因為您提供的是ResponseEntity<>as ofString類型,并且默認情況下 Angular 將響應視為 JSON。


localStorage.removeItem('xAuthToken');此外,請記住在訂閱該可觀察對象時在響應中使用,并在ngOnDestroy()生命周期中取消訂閱該可觀察對象。


查看完整回答
反對 回復 2023-03-02
  • 3 回答
  • 0 關注
  • 104 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號