Spring Boot 与 Kotlin 验证web表单信息

作者: 全科 | 来源:发表于2018-01-20 16:24 被阅读192次

    在做web开发的时候,我们需要验证表单,确认用户提交的信息是安全的,比如用户名不能超过多少位,密码不能少于多少位等等。

    那么如何在Spring Boot 与 Kotlin中验证表单信息?

    在springmvc工程中,需要检查表单信息,表单信息验证主要通过注解的形式。

    表单验证

    下面我们在之前《Spring Boot 与 Kotlin使用Freemarker模板引擎渲染web视图》项目的基础上,增加表单验证。

    build.gradle 文件增加依赖

    compile "org.hibernate:hibernate-validator"
    compile "org.apache.tomcat.embed:tomcat-embed-el"
    

    完整的build.gradle文件

    group 'name.quanke.kotlin'
    version '1.0-SNAPSHOT'
    
    buildscript {
        ext.kotlin_version = '1.2.10'
        ext.spring_boot_version = '1.5.4.RELEASE'
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
            classpath("org.springframework.boot:spring-boot-gradle-plugin:$spring_boot_version")
    
    //        Kotlin整合SpringBoot的默认无参构造函数,默认把所有的类设置open类插件
            classpath("org.jetbrains.kotlin:kotlin-noarg:$kotlin_version")
            classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlin_version")
        }
    }
    
    apply plugin: 'kotlin'
    apply plugin: "kotlin-spring" // See https://kotlinlang.org/docs/reference/compiler-plugins.html#kotlin-spring-compiler-plugin
    apply plugin: 'org.springframework.boot'
    
    jar {
        baseName = 'chapter11-5-5-service'
        version = '0.1.0'
    }
    repositories {
        mavenCentral()
    }
    
    
    dependencies {
        compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
        compile "org.springframework.boot:spring-boot-starter-web:$spring_boot_version"
        compile "org.springframework.boot:spring-boot-starter-thymeleaf:$spring_boot_version"
        compile "org.hibernate:hibernate-validator"
        compile "org.apache.tomcat.embed:tomcat-embed-el"
    
        testCompile "org.springframework.boot:spring-boot-starter-test:$spring_boot_version"
        testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
    
    }
    
    compileKotlin {
        kotlinOptions.jvmTarget = "1.8"
    }
    compileTestKotlin {
        kotlinOptions.jvmTarget = "1.8"
    }
    

    创建UserForm类

    import javax.validation.constraints.Min
    import javax.validation.constraints.NotNull
    import javax.validation.constraints.Size
    
    /**
     * Created by http://quanke.name on 2018/1/12.
     * https://stackoverflow.com/questions/36515094/kotlin-and-valid-spring-annotation
     * https://stonesoupprogramming.com/2017/06/21/spring-bean-validation-example-jsr-303-in-kotlin/
     */
    data class UserForm(@get:NotNull(message = "{name.required}") @get:Size(min = 2, max = 5,message = "{name.size}") var name: String? = "", @get:Min(18) var age: Int? = 0)
    
    

    如果是Spring boot 可以不增加 @get注解,如果使用kotlin 语言实现必须加@get

    这个实体类,在2个属性:name,age.它们各自有验证的注解:

    • @Size(min=2, max=5) name的长度为2-30个字符
    • @NotNull 不为空
    • @Min(18)age不能小于18

    创建WebController

    
    import name.quanke.kotlin.chaper11_5_5.entity.UserForm
    import org.springframework.stereotype.Controller
    import org.springframework.validation.Errors
    import org.springframework.web.bind.annotation.GetMapping
    import org.springframework.web.bind.annotation.PostMapping
    import org.springframework.web.servlet.config.annotation.ViewControllerRegistry
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter
    import javax.validation.Valid
    
    
    /**
     * Created by http://quanke.name on 2018/1/12.
     */
    
    @Controller
    class WebController : WebMvcConfigurerAdapter() {
        override fun addViewControllers(registry: ViewControllerRegistry?) {
            registry!!.addViewController("/results").setViewName("results")
        }
    
        @GetMapping("/")
        fun index(userForm: UserForm): String {
            return "index"
        }
    
        @PostMapping("/")
        fun checkPersonInfo(@Valid userForm: UserForm, errors: Errors): String {
    
            val result: String = when {
            //Test for errors
                errors.hasErrors() -> "index"
                else -> {
                    //Otherwise proceed to the next page
                    "redirect:/results"
                }
            }
            return result
    
        }
    }
    

    创建form表单src/main/resources/templates/index.html

    <!DOCTYPE html>
    <html xmlns:th="http://www.w3.org/1999/xhtml">
    <head lang="en">
        <title>quanke.name</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    </head>
    <body>
    
    <h1>Form</h1>
    <form action="#" th:action="@{/}" th:object="${userForm}" method="post">
        <table>
            <tr>
                <td>Name:</td>
                <td><input type="text" th:field="*{name}" /></td>
                <td th:if="${#fields.hasErrors('name')}" th:errors="*{name}">Name Error</td>
            </tr>
            <tr>
                <td>Age:</td>
                <td><input type="text" th:field="*{age}" /></td>
                <td th:if="${#fields.hasErrors('age')}" th:errors="*{age}">Age Error</td>
            </tr>
            <tr>
                <td><button type="submit">Submit</button></td>
            </tr>
        </table>
    </form>
    </body>
    </html>
    

    成功页面src/main/resources/templates/results.html

    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>quanke</title>
    </head>
    <body>
    <h1>quanke.name</h1>
    Congratulations! You are old enough to sign up for this site
    </body>
    </html>
    

    src/main/resources/目录下增加ValidationMessages.properties文件

    # \u8FD9\u91CC\u8981\u6CE8\u610F\u7F16\u7801\u95EE\u9898
    name.required=\u540D\u5B57\u4E0D\u80FD\u4E3A\u7A7A
    name.size=\u540D\u5B57\u957F\u5EA6\u8FD4\u56DE\u53EA\u80FD\u662F2-5
    

    Spring Boot 启动

    import org.springframework.boot.SpringApplication
    import org.springframework.boot.autoconfigure.SpringBootApplication
    
    
    /**
     * Created by http://quanke.name on 2018/1/9.
     */
    
    @SpringBootApplication
    class Application
    
    fun main(args: Array<String>) {
        SpringApplication.run(Application::class.java, *args)
    }
    

    更多Spring Boot 和 kotlin相关内容,欢迎关注《Spring Boot 与 kotlin 实战》

    参考资料

    相关文章

      网友评论

        本文标题:Spring Boot 与 Kotlin 验证web表单信息

        本文链接:https://www.haomeiwen.com/subject/mrutaxtx.html