SpringMVC教程4[服务器端校验]-阿里云开发者社区

开发者社区> 游客a74jvhcp7vclg> 正文

SpringMVC教程4[服务器端校验]

简介: SpringMVC教程4[服务器端校验]
+关注继续查看


文章目录

   数据校验

       1. 为什么需要服务端校验?

       2.普通校验

           2.1创建项目

           2.2引入相关jar包

           2.3创建properties文件

           2.4在springmvc的配置文件中配置如下

           2.5Bean对象中配置校验规则

           2.6Controller中校验

           2.7jsp页面中获取错误信息

           2.8测试

       3.分组校验

           3.1定义分组

           3.2使用分组

           3.3controller中使用

           3.4测试

数据校验

1. 为什么需要服务端校验?

   最早的校验,就是服务端校验。早期的网站,用户输入一个邮箱地址,校验邮箱地址需要将地址发送到服务端,服务端进行校验,校验成功后,给前端一个响应。有了JavaScript,校验工作可以放在前端去执行。那么为什么还需要服务端校验呢? 因为前端传来的数据不可信。前端很容易获取都后端的数据接口,如果有人绕过页面,就会出现非法数据,所以服务端也要数据校验,总的来说:

   1.前端校验要做,目的是为了提高用户体验

   2.后端校验也要做,目的是为了数据安全

2.普通校验

   Springmvc本身没有校验功能,它使用hibernate的校验框架,hibernate的校验框架和orm没有关系

2.1创建项目

2.2引入相关jar包

image.png

如果是maven项目对应的maven坐标是:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.3.0.Alpha1</version>
</dependency>

2.3创建properties文件

   属性文件用来声明错误提示信息

image.png

如果属性文件乱码的解决办法:

在Eclipse主界面下,打开Window->Perferences->General->ContentTypes:

image.png

2.4在springmvc的配置文件中配置如下

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

    <mvc:annotation-driven validator="validator"></mvc:annotation-driven>
    <context:component-scan base-package="com.dpb.controller"></context:component-scan>
    
    <!--添加对JSR-303验证框架的支持  -->
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass"  value="org.hibernate.validator.HibernateValidator"/>
        <!--不设置则默认为classpath下的 ValidationMessages.properties -->
        <property name="validationMessageSource" ref="validatemessageSource"/>
    </bean>
   
    <bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
        <property name="basename" value="classpath:ValidateMessages"/>  
        <property name="fileEncodings" value="utf-8"/>  
        <property name="cacheSeconds" value="120"/>  
    </bean> 
</beans>

image.png

2.5Bean对象中配置校验规则

    @NotBlank(message="{user.username.empty}")
    @Size(max=6,min=3,message="{user.username.size}")
    private String username;
    @Size(max=6,min=3,message="{user.password.size}")
    private String password;

   校验规则

注解 说明

@Null 被注解的元素必须为 null

@NotNull 被注解的元素必须不为 null

@AssertTrue 被注解的元素必须为 true

@AssertFalse 被注解的元素必须为 false

@Min(value) 被注解的元素必须是一个数字,其值必须大于等于指定的最小值

@Max(value) 被注解的元素必须是一个数字,其值必须小于等于指定的最大值

@DecimalMin(value) 被注解的元素必须是一个数字,其值必须大于等于指定的最小值

@DecimalMax(value) 被注解的元素必须是一个数字,其值必须小于等于指定的最大值

@Size(max=, min=) 被注解的元素的大小必须在指定的范围内

@Digits (integer, fraction) 被注解的元素必须是一个数字,其值必须在可接受的范围内

@Past 被注解的元素必须是一个过去的日期

@Future 被注解的元素必须是一个将来的日期

@Pattern(regex=,flag=) 被注解的元素必须符合指定的正则表达式

@NotBlank(message =) 验证字符串非null,且长度必须大于0

@Email 被注解的元素必须是电子邮箱地址

@Length(min=,max=) 被注解的字符串的大小必须在指定的范围内

@NotEmpty 被注解的字符串的必须非空

@Range(min=,max=,message=) 被注解的元素必须在合适的范围内

2.6Controller中校验

/**
 * 数据校验案例
 * 
 * @author dpb【波波烤鸭】
 *
 */
@Controller
public class UserController {

    /**
     * @Validated book 表示book接收的数据需要根据指定的规则进行校验
     * BindingResult 封装验证结果,必须紧跟在验证变量之后,
     *              如果有多个信息需要验证那么就有多个BindingResult参数
     * 
     */
    @RequestMapping("/add")
    public String add(@Validated Book book,BindingResult br,Model m){
        System.out.println(book);
        // 获取验证信息
        List<ObjectError> allErrors = br.getAllErrors();
        for (ObjectError objectError : allErrors) {
            System.out.println(objectError.getDefaultMessage());
        }
        // 将验证信息保存到作用域中
        m.addAttribute("errors", allErrors);
        return "/index.jsp";
    }
}

2.7jsp页面中获取错误信息

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    hello world<br/>
    <c:if test="${errors ne null }">
        <c:forEach items="${errors}" var="e">
            ${e.defaultMessage}<br>
        </c:forEach>
    </c:if>
</body>
</html>

2.8测试

image.pngimage.png

3.分组校验

   为什么需要分组校验?

   因为一个对象有多个属性,而不同的controller校验的需求是不一样的,必须c1只需要校验对象的账号是否为空就可以了,而c2不光要校验账号为空还需要校验手机号必须不能为空,这时分组校验就能解决这个问题了。实现步骤如下:

3.1定义分组

image.png

package com.dpb.group;
/**
 * 定义的两个接口什么都没定义为标志接口
 * @author dpb【波波烤鸭】
 *
 */
public interface GroupInferface1 {

}

3.2使用分组

    @NotBlank(message="{user.username.empty}"
            ,groups={GroupInferface2.class})
    @Size(max=6,min=3,message="{user.username.size}"
            ,groups={GroupInferface1.class})
    private String username;
    
    @Size(max=6,min=3,message="{user.password.size}"
            ,groups={GroupInferface1.class})
    private String password;

3.3controller中使用

    /**
     * @Validated book 表示book接收的数据需要根据指定的规则进行校验
     * BindingResult 封装验证结果,必须紧跟在验证变量之后,
     *              如果有多个信息需要验证那么就有多个BindingResult参数
     * 
     */
    @RequestMapping("/add1")
    public String add1(@Validated(value=GroupInferface1.class) Book book,BindingResult br,Model m){
        System.out.println(book);
        // 获取验证信息
        List<ObjectError> allErrors = br.getAllErrors();
        for (ObjectError objectError : allErrors) {
            System.out.println(objectError.getDefaultMessage());
        }
        // 将验证信息保存到作用域中
        m.addAttribute("errors", allErrors);
        return "/index.jsp";
    }

   

image.png

3.4测试

第一种情况

image.pngimage.png第二种情况:

image.pngimage.png


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9494 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
12036 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
9052 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13176 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
4620 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
21904 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
4012 0
+关注
游客a74jvhcp7vclg
10余年开发架构经验,同时乐于技术分享!
332
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载