JSR303和拦截器

本文详细介绍了JSR303的校验注解,如@Null、@Min、@Max等,并讲解了Hibernate Validator的额外注解。接着,文章深入探讨了SpringMVC中的拦截器,解释了拦截器与过滤器的区别,以及它们在权限检查、日志记录等场景的应用。还提供了一个简单的入门案例,展示了如何创建和配置自定义拦截器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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=)  被注释的元素必须在合适的范围内

   注:Hibernate Validator是JSR303的一个参考实现,除了支持所有标准的校验注解外,另外Hibernate Validator还有JSR-380的实现  

步骤:

1,添加相关依赖(hibernate validator)

2,给校验对象的指定属性添加校验规则

 

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

  

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

4,在JSP页面上通过form标签显示消息
      <form:errors path="*" /> 显示表单所有错误
      <form:errors path="user* /> 显示所有以user为前缀的属性对应的错误
      <form:errors path="username"/> 显示特定表单对象属性的错误
      delimiter:如果一个属性有多个错误,错误信息的分隔符。默认是换行
   
     注1:errors标签要放到form标签中才能显示错误消息
     注2:如果使用form:errors标签不显示错误消息,请检查Model中是否已经添加了命令对象,没有是不会显示错误消息的
     注3:注意命名规范,Book-->book  

 1,如何实现分组校验
  1.1 通过接口定义若干个分组
  1.2 给校验对象的指定属性添加校验规则,并指定校验组
  1.3 在请求处理方法中,使用@Validated标记要验证的对象,并指定校验组

还可以对验证进行分组(@Validated)
public class Book {
    // 书本验证分组
    public static interface ValidateGroups {
        // 新增/修改
        public static interface AddEdit {
        }

        // 上架/下架
        public static interface DeployUndeploy {
        }

        // 更新封面
        public static interface UpdateBookImage {
        }
    }

2. 通过分组来指定顺序
   @GroupSequence({First.class, Second.class, User.class}) 

二,什么是拦截器

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.应用场景

    1)日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。

    2)权限检查:如登录检测,进入处理器检测是否登录,如果没有直接返回到登录页面;

    3)性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);

    4)通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个Controller中的处理方法都需要的,我们就可以使用拦截器实现。

入门案例

    1,创建HelloController


    2,创建自定义拦截器并实现HandlerInterceptor接口。

 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异常对象

    3,配置拦截器在spring-mvc.xml

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

6,登录权限

1,创建LoginController

  

2,创建自定义拦截器并实现LoginInterceptor接口。

3,配置拦器在spring-mvc.xml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值