SpringMVC JSR303&拦截器

1. JSR303数据校验

JSR303是Java为Bean数据合法性校验提供给的标准框架,已经包含在 JavaEE6.0中、
JSR303给Bean添加校验注解(类似 @NotNull @Max 等标准的注解),定义自己的message提示指定校验规则,并通过标准的验证接口对 Bean进行验证.

JSR303属于后端验证
JS属于前端的脚本验证(只作用于客户端的浏览器中,可以被屏蔽)
技术点:正则表达式
直接浏览器地址栏回车、借助于第三方的工具(PostMan)
http://localhost:8080/xxx/xxx/xxx

银行、金融等等项目
JS、JSR303

2. JSR303中含有的注解

@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=) 被注释的元素必须符合指定的正则表达式


Hibernate Validator 附加的注解
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内

@NotNull 被注释的元素必须不为 null 应用于八大基本数据类型
@NotBlank(message =“用户名不能为空!”) 验证字符串非null,且长度必须大于0 应用于String/引用
@NotEmpty 被注释的字符串的必须非空 应用于集合
注:Hibernate Validator是JSR303的一个参考实现,除了支持所有标准的校验注解外,另外Hibernate Validator还有JSR-380的实现

3. SpringMVC中使用JSR303进行服务器端验证

3.1 添加相关依赖

org.hibernate
hibernate-validator
6.0.7.Final

3.2 给校验对象的指定属性添加校验规则
public class User {
private Long userId;

@NotBlank(message = "用户名不能为空")
private String userName;

@NotBlank(message = "密码不能为空")
private String userPwd;

    ............

   }

3.3 在请求处理方法中(Controller层insert方法),使用@Validated或@Valid注解要验证的对象,并根据BindingResult判断校验是否通过。
另外,验证参数后必须紧跟BindingResult参数,否则spring会在校验不通过时直接抛出异常

  public String login(@Validated @ModelAttribute User user,
		BindingResult bindingResult){
    // 服务器端校验不通过
if (bindingResult.hasErrors()) {
	return "login";
}            
    ....
  }

 注1:@Valid和Validated的区别,随便使用哪个都行
 @Valid是使用hibernate validation的时候使用
 @Validated 是只用spring  Validator校验机制使用

1.什么是拦截器

SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。

依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于
web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个
controller生命周期之内可以多次调用。

2.拦截器与过滤器

2.1 什么是过滤器(Filter)
 
    依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例
只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,比如:在过滤器中修改字符编码;
在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。
   
2.2 拦截器与过滤器的区别
 过滤器(filter):
1) filter属于Servlet技术,只要是web工程都可以使用
2) filter主要对所有请求过滤
3) filter的执行时机早于Interceptor

拦截器(interceptor)
1) interceptor属于SpringMVC技术,必须要有SpringMVC环境才可以使用
2) interceptor通常对处理器Controller进行拦截
3) interceptor只能拦截dispatcherServlet处理的请求

3.拦截器方法说明

详见《自定义拦截器执行流程.png》

preHandle方法
作用:用于对拦截到的请求进行预处理,方法接收布尔(true,false)类型的返回值,返回true:放行,false:不放行。
执行时机:在处理器方法执行前执行 
方法参数:
1)request请求对象
2)response响应对象
3)handler拦截到的方法处理

postHandle方法
作用:用于对拦截到的请求进行后处理,可以在方法中对模型数据和视图进行修改
执行时机:在处理器的方法执行后,视图渲染之前
方法参数:
1)request请求对象
2)response响应对象
3)handler拦截到的处理器方法
4)ModelAndView处理器方法返回的模型和视图对象,可以在方法中修改模型和视图

afterCompletion方法
作用:用于在整个流程完成之后进行最后的处理,如果请求流程中有异常,可以在方法中获取对象
执行时机:视图渲染完成后(整个流程结束之后)
方法参数:
1)request请求参数
2)response响应对象
3)handler拦截到的处理器方法
4)ex异常对象

4.拦截器链(多拦截器)

  拦截器链的概念:如果多个拦截器能够对相同的请求进行拦截,则多个拦截器会形成一个拦截器链,主要理解拦截器链中各个拦截器的执行顺序。拦截器链中多个拦截器的执行顺序,根拦截器的配置顺序有关,先配置的先执行。

mvc:interceptors
mvc:interceptor
<mvc:mapping path=“/“/>

</mvc:interceptor>
mvc:interceptor
<mvc:mapping path=”/user/
”/>

</mvc:interceptor>
</mvc:interceptors>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值