当 Api 返回响应时,如何以角度显示“登录失败。请重试”消息?

Posted

技术标签:

【中文标题】当 Api 返回响应时,如何以角度显示“登录失败。请重试”消息?【英文标题】:How to show "Login In failed.Please try again" message in angular when Api returns the response? 【发布时间】:2019-04-05 08:22:14 【问题描述】:

实际上我有一个简单的登录屏幕,角度为:

当输入用户名和密码时,它成功点击/login url,如果正确,它会转到 userdashboard 或 admindashboard,当用户名和密码不正确时,它会显示 /403 fobidden 页面。

控制台的输出如下:

实际上我想显示“登录失败,请输入正确的用户名和密码信息”,但 api 以表单返回响应

@PostMapping(value="/login")
    public ResponseEntity<UserDTO> login(@RequestBody User user,HttpServletRequest request,HttpServletResponse response)
        try 
            Authentication authentication= authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(user.getEmail(), user.getPassword()));
            final JwtUser userDetails=(JwtUser) authentication.getPrincipal();
            System.out.println(userDetails.getAuthorities());
            SecurityContextHolder.getContext().setAuthentication(authentication);
            final String token=jwtTokenUtil.generateToken(userDetails);
            response.setHeader("Token",token);
            return new ResponseEntity<UserDTO>(new UserDTO(userDetails.getUser(), token),HttpStatus.OK);
            catch(Exception e) 
            throw new UnauthorizedExcpetion(e.getMessage());

         

如果登录成功,则返回用户对象,既不返回消息“Bad Credintials”。

在我的角度中,我尝试检查错误情况并希望应用消息策略,但如果登录失败,它不会在 console.log() 中打印,但如果登录成功,则在控制台中打印响应.log()。

loginUser(user:any)
    this.userService.loginUser(user).subscribe((response) => 
      console.log("test");
        if(response)
        console.log(response.token);
            if(response.token)
                localStorage.setItem('currentUser',JSON.stringify(response));
                if(response.user.role==='ADMIN')
                    this.router.navigate(['/admindashboard']);
                else
                    this.router.navigate(['/userdashboard']);
                
            
         else
        console.log(response.error.message);
      

         



    )

  

userservice.ts

loginUser(user:any):Observable<any>
         const headers=new HttpHeaders('Access-Control-Allow-Origin':'*');
         return this.http.post("http://localhost:8080/login",user,headers:headers);
    

【问题讨论】:

为什么要在 request 中添加 Access-Control-Allow-Origin 标头? 【参考方案1】:

你得到的响应进入前端的错误块,因此将布尔变量声明为 showErrormessage 为 false 并在 html 中编写以下代码

  <div *ngIf="showErrorMessage">
    <h1>Invalid username and password Please try again</h1>
  </div>

然后在 ts 文件中写这个

//声明这个变量 showErrorMessage=false;

loginUser(user:any)
  showErrorMessage = false;
  this.userService.loginUser(user).subscribe(
      (response) => 

      console.log("test");
          if (response) 
              console.log(response.token);
          if (response.token) 
              localStorage.setItem('currentUser', JSON.stringify(response));
          if (response.user.role === 'ADMIN') 
              this.router.navigate(['/admindashboard']);
         else 
              this.router.navigate(['/userdashboard']);
      
     else 
      console.log("No Token");
    
  
,
(error) => 
  showErrorMessage = true;

)

【讨论】:

【参考方案2】:

您需要捕获可观察对象的错误。 Observe 最多需要 3 个函数,第一个处理好数据,第二个处理错误,第三个是最终调用,例如

let subscription = this.data.subscribe(
          (value) =>  /* Do something with value */ ,
          (error) =>  /* Do something with error */ ,
          () =>  /* Do something with done*/ 
      );

所以你需要添加一个错误处理程序来捕捉你所说的条件。

参考:https://angular.io/guide/observables

【讨论】:

【参考方案3】:

在这种情况下,您将在 observable 的错误函数中得到响应。所以,只要抓住错误。

这里我更新了代码。

loginUser(user:any)
    this.userService.loginUser(user).subscribe((response) => 
      console.log("test");
        if(response)
        console.log(response.token);
            if(response.token)
                localStorage.setItem('currentUser',JSON.stringify(response));
                if(response.user.role==='ADMIN')
                    this.router.navigate(['/admindashboard']);
                else
                    this.router.navigate(['/userdashboard']);
                
            
         else
        console.log(response.error.message);
         
                    
    , (error) => 
        console.log('Login Failed'); // handle login failed here. 
    )

  

【讨论】:

【参考方案4】:

在 subscribe 中传递第二个函数以捕获错误。

  loginUser(user:any)
    this.userService.loginUser(user).subscribe(
      (response) => 
      console.log("test");
        if(response)
        console.log(response.token);
            if(response.token)
                localStorage.setItem('currentUser',JSON.stringify(response));
                if(response.user.role==='ADMIN')
                    this.router.navigate(['/admindashboard']);
                else
                    this.router.navigate(['/userdashboard']);
                
            else
              console.log("No Token");
            
         
      ,
      (error)=>
        console.log(error.message);
      
    )
  

【讨论】:

以上是关于当 Api 返回响应时,如何以角度显示“登录失败。请重试”消息?的主要内容,如果未能解决你的问题,请参考以下文章

返回响应时,Symfony 4.4 转储不输出任何内容

返回响应时,Symfony 4.4 转储不输出任何内容

以角度订阅后防止刷新

收到响应后如何使用 if/else 语句显示 div

Flutter Redux 小吃店

将 Plaid 与 Salesforce 集成