Rumah  >  Artikel  >  Java  >  Cara SpringBoot menggunakan pengesahan untuk melaksanakan parameter pengesahan yang elegan

Cara SpringBoot menggunakan pengesahan untuk melaksanakan parameter pengesahan yang elegan

WBOY
WBOYke hadapan
2023-05-17 09:31:101213semak imbas

1. Kata Pengantar

Pengesahan data ialah fungsi penting bagi laman web interaktif Pengesahan js bahagian hadapan boleh merangkumi kebanyakan tanggungjawab pengesahan, seperti keunikan nama pengguna, format hari lahir, Pengesahan yang biasa digunakan seperti pengesahan format e-mel. dan seterusnya. Walau bagaimanapun, untuk menghalang pengguna daripada memintas penyemak imbas dan menggunakan alat http untuk meminta secara langsung beberapa data haram dari bahagian belakang, pengesahan data sisi pelayan juga diperlukan untuk mengelakkan data kotor daripada jatuh ke dalam pangkalan data Jika format e-mel yang tidak sah muncul pangkalan data, ia juga akan Ia akan menyebabkan sakit kepala untuk kakitangan operasi dan penyelenggaraan. Anda boleh menggunakan pengesahan yang diterangkan dalam artikel ini untuk mengesahkan data.

2. Pengesahan yang biasa digunakan

1. Null, @NotNull, @Pattern, terletak di bawah pakej javax.validation.constraints. JSR-349 ialah versinya yang dinaik taraf, menambah beberapa ciri baharu.

  • @Null Elemen beranotasi mestilah batal

  • @NotNull Unsur beranotasi mestilah tidak batal

  • @AssertTrue Elemen beranotasi mestilah benar

  • @AssertFalse Elemen beranotasi mestilah palsu

  • @Min( nilai) Beranotasi elemen mestilah nombor dan nilainya mestilah lebih besar daripada atau sama dengan nilai minimum yang ditentukan

  • @Max(value) Elemen beranotasi mestilah nombor dan nilainya mestilah kurang daripada Sama dengan nilai maksimum yang ditentukan

  • @DecimalMin(value) Elemen beranotasi mestilah nombor dan nilainya mestilah lebih besar daripada atau sama dengan nilai minimum yang ditentukan

  • @DecimalMax(value) Elemen beranotasi mestilah nombor dan nilainya mestilah kurang daripada atau sama dengan nilai maksimum yang ditentukan

  • @Size (maks, min) Saiz elemen beranotasi Mesti dalam julat yang ditentukan

  • @Digit (integer, pecahan) Elemen beranotasi mestilah nombor dan nilainya mestilah dalam julat yang boleh diterima

  • @Lalu Elemen beranotasi mestilah tarikh lepas

  • @Masa Depan Elemen beranotasi mestilah tarikh akan datang

  • @Pattern(value) Elemen beranotasi mesti mematuhi ungkapan biasa yang ditentukan

2.pengesahan hibernate: pengesahan hibernate ialah pelaksanaan spesifikasi ini dan menambahkan beberapa anotasi pengesahan yang lain, seperti @Email, @Length, @Julat, dsb.

  • @Email Elemen beranotasi mestilah alamat e-mel

  • @Length Saiz rentetan beranotasi mestilah dalam julat yang ditentukan

  • @NotEmpty Rentetan beranotasi mestilah bukan kosong

  • @Julat Elemen beranotasi mestilah dalam julat yang sesuai

3. pengesahan musim bunga: pengesahan musim bunga merangkum semula pengesahan hibernate dan menambah pengesahan automatik dalam modul springmvc Dan maklumat pengesahan adalah dikapsulkan ke dalam kelas tertentu

3. Fungsi pengesahan data automatik but Spring

3.1 Memperkenalkan kebergantungan

Modul spring-web menggunakan hibernate -validation, dan modul databind juga menyediakan fungsi mengikat data yang sepadan.

<dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

Kami hanya perlu memperkenalkan kebergantungan spring-boot-starter-web Jika anda melihat sub-dependensinya, anda boleh menemui kebergantungan berikut:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

3.2 Membina kelas permulaan.

@SpringBootApplication
public class App {
   public static void main(String[] args) {
       SpringApplication.run(App.class, args);
       System.out.println("Start app success.");
   }
}

3.3 Cipta kelas entiti yang perlu disahkan

public class Person {
    @NotEmpty(message = "name不能为空")
    private String name;
    @Range(min = 0, max = 100, message = "age不能大于100小于0")
    private int age;
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

3.4 Sahkan data dalam Pengawal

springmvc menyediakan kami dengan fungsi merangkum parameter borang secara automatik, satu yang menambah parameter pengesahan Pengawal biasa ditunjukkan di bawah.

@RequestMapping("/test")
public String valid(@Validated Person person, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        for (FieldError fieldError : bindingResult.getFieldErrors()) {
            System.out.println(fieldError);
        }
        return "fail";
    }
    return "success";
}

Nota:

  • Anotasi @Validated perlu ditambah sebelum parameter Persison, menunjukkan bahawa spring perlu mengesahkannya dan maklumat pengesahan akan disimpan ke BindingResult seterusnya. Ambil perhatian bahawa ia mesti bersebelahan Jika terdapat berbilang parameter yang perlu disahkan, borang tersebut boleh menjadi seperti berikut. sah(@Orang yang Disahkan, orang BindingResultBindingResult, @Orang2 yang Disahkan2, orang2BindingResult) iaitu, satu kelas pengesahan sepadan dengan satu hasil pengesahan.

  • Hasil pengesahan akan diisi secara automatik dan operasi tertentu boleh diputuskan berdasarkan logik perniagaan dalam pengawal, seperti melompat ke halaman ralat.

Pengesahan paling asas telah selesai

Mulakan bekas dan keputusan ujian adalah seperti berikut:

Ralat medan dalam objek '. orang pada medan 'umur': nilai ditolak [105]; kod [Range.person.age,Range.age,Range.int,Range]; argumen [org.springframework.context.support.DefaultMessageSourceResolvable: codes [person.age] ,umur ]; argumen []; mesej lalai [umur],100,0]; 🎜>Kaedah sebelumnya Mengendalikan ralat pengesahan agak rumit, dan kebanyakan tapak web akan merangkum ralat permintaan dalam halaman 404 bersatu Jika pengesahan data gagal, but Spring akan mengeluarkan pengecualian BindException pulangkan hasilnya. Untuk menentukan kelas penangkapan pengecualian, gunakan @RestControllerAdvice.

Kelas pengawal:

@RequestMapping(value = "valid", method = RequestMethod.GET)
public String valid(@Validated Person person) {
    System.out.println(person);
    return "success";
}

Kelas pengendalian pengecualian bersatu:

@RestControllerAdvice
public class BindExceptionHanlder {
    @ExceptionHandler(BindException.class)
    public String handleBindException(HttpServletRequest request, BindException exception) {
        List<FieldError> allErrors = exception.getFieldErrors();
        StringBuilder sb = new StringBuilder();
        for (FieldError errorMessage : allErrors) {
            sb.append(errorMessage.getField()).append(": ").append(errorMessage.getDefaultMessage()).append(", ");
        }
        System.out.println(sb.toString());
        return sb.toString();
    }
}

Ujian: http://localhost:8080/valid?age=105&name=steven

输出:age: age不能大于100小于0,

Cara SpringBoot menggunakan pengesahan untuk melaksanakan parameter pengesahan yang elegan

4、自定义校验注解

4.1 @NameValidation

@Documented
@Constraint(validatedBy = NameValidationValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RUNTIME)
public @interface NameValidation {
    String message() default "不是合法的名字";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    @Target({PARAMETER, ANNOTATION_TYPE})
    @Retention(RUNTIME)
    @Documented
    @interface List {
        NameValidation[] value();
    }
}

4.2 校验类NameValidationValidator

public class NameValidationValidator implements ConstraintValidator<NameValidation, String> {
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if ("steven".equalsIgnoreCase(value)) {
            return true;
        }
        String defaultConstraintMessageTemplate = context.getDefaultConstraintMessageTemplate();
        System.out.println("default message :" + defaultConstraintMessageTemplate);
        //禁用默认提示信息
		//context.disableDefaultConstraintViolation();
        //设置提示语
		//context.buildConstraintViolationWithTemplate("can not contains blank").addConstraintViolation();
        return false;
    }
}

4.3 在Person类增加新注解

@NotEmpty(message = "name不能为空")
@NameValidation
private String name;

测试: http://localhost:8080/valid?age=105&name=lxy

输出:age: age不能大于100小于0, name: 不是合法的名字,

Cara SpringBoot menggunakan pengesahan untuk melaksanakan parameter pengesahan yang elegan

Atas ialah kandungan terperinci Cara SpringBoot menggunakan pengesahan untuk melaksanakan parameter pengesahan yang elegan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam