Как проверить поля формы в Back-End и показать их на Angular7? - PullRequest
0 голосов
/ 14 мая 2019

Я хочу написать внутреннюю сторону моего приложения с пружинной загрузкой, а переднюю - с угловой.Я хотел бы проверить информацию в полях формы на стороне сервера для безопасности.Чтобы попробовать эту работу, я сначала создал модель с именем Visitor.java, и все коды выглядят следующим образом.

Visitor.java

import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;

public class Visitor {

    @NotNull(message = "This field cannot be null.")
    @Email(message = "Invalid.")
    private String email;

    @NotNull(message = "This field cannot be null.")
    private String password;

    public Visitor() {
    }

    public Visitor(String email, String password) {
        this.email = email;
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Visitor{" +
                "email='" + email + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

SignIn.java (RestController)

import com.demotest.example.demotest.model.Visitor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api")
@CrossOrigin
public class Sign {

    @PostMapping("/signin")
    public ResponseEntity<Object> signIn(@RequestBody @Valid Visitor visitor, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            System.err.println("error!");
            Map<String, String> errors = new HashMap<>();
            for (FieldError error:bindingResult.getFieldErrors()){
                errors.put(error.getField(), error.getDefaultMessage());
            }
            return new ResponseEntity<>(errors, HttpStatus.NOT_ACCEPTABLE);
        }
        System.err.println("nice!");
        return new ResponseEntity<>(HttpStatus.OK);
    }

}

sign-in.component.ts

import { Component, OnInit } from '@angular/core';
import {HttpClient} from "@angular/common/http";

@Component({
  selector: 'app-sign-in',
  templateUrl: './sign-in.component.html',
  styleUrls: ['./sign-in.component.css']
})
export class SignInComponent implements OnInit {

  model:loginViewModel = {
    email:'',
    password:''
  };

  sendLoginViewModel():void{
    //alert(this.model.email);
    let url = "http://localhost:7070/api/signin";

    this.http.post(url, this.model).subscribe(
      res => {
        //location.reload();

      },
      err => {
                   console.log(err);
      }
    );
  }

  constructor(private http: HttpClient) { }

  ngOnInit() {
  }
}

export interface loginViewModel{
  email:string;
  password:string;
}

sign-in.component.html

<div class="container mt-5">
  <div class="col-lg-4 card mx-auto px-0">
    <div class="card-body">

      <div class="row mt-4">
        <div class="col mx-auto text-center" style="font-size: 23.1px; padding-right: 37px; padding-left: 37px;">
          www.sss.com
        </div>
      </div>

      <div class="row">
        <div class="col mx-auto text-center" style="font-size: 40px; padding-right: 37px; padding-left: 37px;">
          Welcome
        </div>
      </div>

      <form #f="ngForm" (submit)="sendLoginViewModel()">

        <div class="row">
          <div class="col mt-5 px-0 mx-auto">
            <mat-form-field appearance="outline" class="col mx-auto">
              <mat-label>Email</mat-label>
              <input matInput placeholder=""
                     name="email"
                     [(ngModel)]="model.email"
                     #name="ngModel"/>
              <mat-icon matSuffix>email</mat-icon>
            </mat-form-field>

<!--            todo: Error div i will be added here.-->

          </div>
        </div>

        <div class="row">
          <div class="col px-0 mx-auto">
            <mat-form-field appearance="outline" class="col mx-auto">
              <mat-label>Password</mat-label>
              <input matInput placeholder="" name="password" [(ngModel)]="model.password">
              <mat-icon matSuffix>lock</mat-icon>
            </mat-form-field>

            <!--            todo: Error div i will be added here.-->

          </div>
        </div>

        <button type="submit" class="col py-1 mx-auto mt-3 mb-3" mat-flat-button color="primary">
          Login
        </button>
      </form>
    </div>
  </div>
</div>

console.log (err);

Я хочу использовать следующее error: {email: "Invalid."} На html-странице.email - это заголовок ошибки, а "Invalid." - содержимое сообщения об ошибке.Поскольку эти поля журнала отправляются Back-End, они являются безопасной информацией, и я хочу использовать их на странице html.Как я могу написать в Если в сообщении об ошибке есть электронное письмо, распечатайте сообщение. ?

HttpErrorResponse {headers: HttpHeaders, status: 406, statusText: "OK", url: "http://localhost:7070/api/signin", ok: false, …}
error: {email: "Invalid."}
headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}
message: "Http failure response for http://localhost:7070/api/signin: 406 OK"
name: "HttpErrorResponse"
ok: false
status: 406
statusText: "OK"
url: "http://localhost:7070/api/signin"
__proto__: HttpResponseBase

В настоящее время я могу проверить фон весной, но не могураспечатать сообщение об ошибке на sign-in.component.html.Я запутался, чтобы напечатать входящую информацию об ошибке.Как распечатать сообщение об ошибке?

1 Ответ

0 голосов
/ 14 мая 2019

Очень простое решение - подписаться на ошибку и затем использовать ngif.

error: any;

sendLoginViewModel():void{

    let url = "http://localhost:7070/api/signin";

    this.http.post(url, this.model).subscribe(
      res => {
        //location.reload();

      },
      err => {
    this.error = err.message
      }
    );
  }


        <div *ngIf="error" class="alert alert-danger">
            {{error}}
        </div>

Но я бы предложил использовать реактивные формы для создания группы форм для настройки валидаторов, необходимых для информации для входа в систему. Затем, если сервер вернет ошибку, вы можете установить грязную форму элемента управления для вызова состояния ошибки пользовательского интерфейса. Вы можете установить validators.pattern для электронной почты и позволить клиенту сначала выполнить базовую проверку электронной почты следующим образом:

this.validations_form = this.formBuilder.group({

    email: new FormControl('', Validators.compose([
        Validators.required,
        Validators.pattern('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$')
    ]))
});


<div *ngIf="angForm.controls['email'].invalid && (angForm.controls['email'].dirty || angForm.controls['email'].touched)" class="alert alert-danger">
            <div *ngIf="angForm.controls['email'].errors.required">
            A valid email is required.
          </div>
        </div>

Я также настоятельно рекомендую рассмотреть более сложный пример аутентификации, в котором используется инъекционная служба проверки подлинности и компонент оповещения.

Вот хороший пример: https://jasonwatmore.com/post/2018/10/29/angular-7-user-registration-and-login-example-tutorial

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...