JSR303和SpringMVC拦截器

本文介绍了JSR303,即JAVA EE 6中的Bean Validation规范,重点讲解了Hibernate Validator的使用,包括注解的添加和校验过程。接着,深入探讨了SpringMVC的拦截器,解释了拦截器的工作原理和与过滤器的区别,并通过用户登录权限控制的案例展示了如何配置和实现拦截器。
摘要由CSDN通过智能技术生成

JSR303

关于JSR303

JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint。

简单的介绍

  

Hibernate Validator 附加的注解

代码实现

1.先在pom.xml里导入依赖


<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.16.Final</version>
</dependency>

2.给要校验的javaBean上标注校验注解

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

4.如过需要在jsp中显示错误提示,则需要在后端实例化对象 ,然后在页面中加入:

<%@taglib prefix="fmt" uri="http://www.springframework.org/tags/form" %>

后端:

 

前端页面:

 

SpringMVC拦截器

什么是拦截器

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

拦截器工作原理图

过滤器(file)和拦截器(interceptor)区别(重要)

过滤器(file)file属于Servlet技术,只要是web项目都可以使用

                      file主要是对所有请求的过滤

                      file在interceptor先执行

 拦截器(interceptor):  interceptor输出springMVC技术,必须要有springMVC环境才能使用

                                     interceptor通常只对处理器Controller进行拦截   、

                                     interceptor只拦截DIspatcherServlet的处理请求

.拦截器链(多拦截器)

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

它拦截的顺序是从上往下执行拦截器

       

案例:.用户登录权限控制

1.在spring-mvc.xml里配置拦截器

       

2.建一个LoginInterceptor拦截器类并实现HandlerInterceptor接口实现其方法

package com.zking.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String requestURI = request.getRequestURI();
        System.out.println(requestURI);
        System.out.println(requestURI.indexOf("/out"));
        //登陆页面可以访问
        if(requestURI.indexOf("/login")>0)
            return true;
        //跳转到登陆页面也可以访问
        if(requestURI.indexOf("/out")>0)
            return true;
        //获取session
        HttpSession session= request.getSession();
        Object userName = session.getAttribute("userName");
        if(userName!=null){
            return true;
        }else {
            session.setAttribute("msg","您还没登陆,请先登陆");
            request.getRequestDispatcher("WEB-INF/jsp/book/login.jsp").forward(request,response);
            return false;
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

   

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值