JSR303和拦截器

2023-11-06

目录

一、JSR303

1、pom依赖

二、拦截器

1.什么是拦截器

 2.拦截器与过滤器

 3.应用场景

4.拦截器的快速入门

三、拦截器链

1、拦截器链的概念

2、TwoHandlerInterceptor.java

3、在springmvc-servlet.xml中配置拦截器链

4、运行效果

四、登录权限控制

1、拦截器

2、拦截器配置

3、方法

4、测试


一、JSR303

1、pom依赖

 <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.7.Final</version>
    </dependency>

二、拦截器

1.什么是拦截器

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

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

 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中的处理方法都需要的,我们就可以使用拦截器实现。

4.拦截器的快速入门

       1、创建自定义拦截器并实现HandlerInterceptor接口。

package com.zking.ssm.intercept;

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

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

/**
 * @author 白未
 * @site 3185579318
 * @company xxx公司
 * @create  2022-08-20 2:15
 */
public class OneHelloController implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        预处理
        System.out.println("[OneHelloController] . preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        后处理
        System.out.println("[OneHelloController] . postHandle、、、");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        完成后处理
        System.out.println("[OneHelloController] . afterCompletion");
    }
}

        2、在springmvc-servlet.xml中配置拦截器

<!--   配置拦截器-->
    <mvc:interceptors>
        <bean class="com.zking.ssm.intercept.OneHelloController"></bean>
    </mvc:interceptors>

        3、运行

 4、将上面预处理的返回值改为false后续代码不执行

三、拦截器链

1、拦截器链的概念

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

2、TwoHandlerInterceptor.java

package com.zking.ssm.intercept;

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

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

/**
 * @author 白未
 * @site 3185579318
 * @company xxx公司
 * @create  2022-08-20 2:15
 */
public class TwoHelloController implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        预处理
        System.out.println("[TwoHelloController] . preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        后处理
        System.out.println("[TwoHelloController] . postHandle、、、");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        完成后处理
        System.out.println("[TwoHelloController] . afterCompletion");
    }
}

3、在springmvc-servlet.xml中配置拦截器链

<!--配置拦截器链-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.zking.ssm.intercept.OneHelloController"></bean>
        </mvc:interceptor>
        <mvc:interceptor>
            <mvc:mapping path="/clz/**"/>
            <bean class="com.zking.ssm.intercept.TwoHelloController"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

4、运行效果

    http://localhost:8080/hello one prehandle/posthandle/aftercompalation
    http://localhost:8080/clz/list  one two
    one - prehandle
    two - prehandle
    业务方法
    one - posthandle
    two - posthandle
    two - aftercompalation
    one - aftercompalation

 

四、登录权限控制

1、拦截器

package com.zking.ssm.intercept;

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

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

/**
 * @author 白未
 * @site 3185579318
 * @company xxx公司
 * @create  2022-08-20 2:15
 */
public class OneHelloController implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        预处理
        System.out.println("[OneHelloController] . preHandle");

        //如果login/logout这个请求,就直接放行
        String url = request.getRequestURL().toString();
        if(url.indexOf("/login")>0 || url.indexOf("/logout")>0){
            return true;
        }

        //对于请求业务方法  只有登录过也就是存在session数据,才能访问
        String uname=(String)request.getSession().getAttribute("uname");
        if(uname==null || "".equals(uname)){
            response.sendRedirect("/login.jsp");
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        后处理
        System.out.println("[OneHelloController] . postHandle、、、");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        完成后处理
        System.out.println("[OneHelloController] . afterCompletion");
    }
}

2、拦截器配置

 <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.zking.ssm.intercept.OneHelloController"></bean>
        </mvc:interceptor>

3、方法

package com.zking.ssm.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 白未
 * @site 3185579318
 * @company xxx公司
 * @create  2022-08-20 8:30
 */
@Controller
public class LoginController {

    @RequestMapping("/login")
    public String login(HttpServletRequest request){
        //登录成功需要保存用户信息
        String uname = request.getParameter("uname");
        if("diandian".equals(uname)){
            request.getSession().setAttribute("uname",uname);
        }
        return "index";
    }

    @RequestMapping("/logout")
    public String logout(HttpServletRequest request){
        request.getSession().invalidate();;
        return "index";
    }
}

4、测试

http://localhost:8080/clz/list 他会给跳到登录界面

 当我们输入错误的登录名

http://localhost:8080/login?uname=dd

然后再进

http://localhost:8080/clz/list

他还是会给你跳到登录界面

  当我们输入正确的登录名

http://localhost:8080/login?uname=diandian

然后再进

http://localhost:8080/clz/list

他就进去了

 然后我们在进

http://localhost:8080/logout

然后就进不去了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSR303和拦截器 的相关文章

  • 学习笔记——概率论与数理统计(第八章)

    学习笔记 概率论与数理统计 第八章 第八章 假设检验 8 1 基本概念 8 1 1 假设检验问题 8 1 2 假设检验基本概念 8 1 3 假设检验的思想与步骤 思想 步骤 8 1 4 两类错误 8 2 一个正态总体的参数假设检验 8 2
  • React官方中文文档【安装】

    https reactjs org docs getting started html React官方文档地址 1 入门 此页面是React文档和相关资源的概述 React是一个用于构建用户界面的JavaScript库 在我们的主页或教程中

随机推荐

  • Android 导入library,手把手教学

    引言 导入封装好的功能工程在自己的工程上 等于直接 给自己的工程上一件 装备 提升实力 PS 我曾经代入别人的工程 并实现了主工程 Application 和导入工程 library 的界面跳转与函数的调用 其中有各种各样的困难和错误 所以
  • Intel MKL 稀疏矩阵求解PARDISO 函数

    Intel MKL提供了针对稀疏矩阵求解的PARDISO 接口 它是在共享内存机器上 实现的稀疏矩阵的直接求解方法 对于一些大规模的计算问题 PARDISO的算法表现了非常好的计算效率与并行性 一些数值测试表明 随着计算节点数目增加 PAR
  • 超详细的VsCode创建SpringBoot项目(图文并茂)

    文章目录 超详细的VsCode创建SpringBoot项目 图文并茂 一 安装jdk 1 OpenJDK 2 Java SE Development Kit 8 二 安装maven 1 下载 2 配置环境变量 可选 3 修改settings
  • Python UI自动化 —— 关键字+excel表格数据驱动

    步骤 1 对selenium进行二次封装 创建关键字的库 2 准备一个表格文件来写入所有测试用例步骤 3 对表格内容进行读取 使用映射关系来对用例进行调用执行 4 执行用例 1 对selenium进行二次封装 创建关键字的库 from ti
  • java自定义高效map转json逻辑实现

    场景 笔者发现后端对网页提供的json接口数据 都不是特别复杂 所以为了提高json的转换效率 在笔者自己写的struts 1 0 0框架里 自主实现了一个map转json的类 内部返回值都是map封装 效率非常高 基本不会超过1ms 望大
  • win10——‘’WLAN‘’没有有效的IP配置

    前言 小编的笔记本最近突然连不上无线网了 本来用的好好的 突然不能用了 有点不得劲 不得劲就得给他搞得劲了 先看看小编的错误 然后再给您展示我的解决方案 错误提示 连不上网很难受 但是解决了肯定很爽 由于小编也没有遇到过这个问题 所以小编就
  • 全网最细之HiveQL语句操作

    HiveQL语句操作 关键字尽量大写 但是本人小写容易记忆 所以本篇为小写 数据库 创建一个数据库 查看数据库 修改数据库信息 删除数据库 普通表 创建表 查看表 修改表名 添加n列 修改表 修改位置 单独修改列名 数据类型 替换列 删除n
  • 面试问题回答集锦

    多个过滤类和排序类可以公用 filter backends 可以配置多个 执行顺序是从左往后 所以放在最左侧的尽量先过滤掉大部分数据 问 在工作中遇到注入多个分类排序的接口情况 如何解决 在写xx接口的时候 因为我们过滤的条件很多 搜索数据
  • Flutter和原生iOS调用相册

    文章链接 https juejin cn post 6908232699673722888 目的 实现一个flutter调用原生ios相册的功能 并传递照片 flutter的操作 flutter用来传递的模块叫channel 这里我们使用M
  • 求组合算法-----m个元素中选n个

    组合算法 本程序的思路是开一个数组 其下标表示1到m个数 数组元素的值为1表示其下标 代表的数被选中 为0则没选中 首先初始化 将数组前n个元素置1 表示第一个组合为前n个数 然后从左到右扫描数组元素值的 10 组合 找到第一个 10 组合
  • 蓝桥杯 寻找2020

    目录 问题描述 思路分析及代码 问题描述 小蓝有一个数字矩阵 里面只包含数字 0 和 2 小蓝很喜欢 2020 他想找到这个数字矩阵中有多少个 2020 小蓝只关注三种构成 2020 的方式 同一行里面连续四个字符从左到右构成 2020 同
  • 89个android学习样例源码

    源码下载链接 https pan baidu com s 1uT hsZQac7Hz3pOxX466Cw pwd 8888 提取码 8888 Android 仿京东金融首页头像效果 Android 实现Conquer应用源码 Android
  • 解决解密时出现"要解密的数据的长度无效" 或 "填充无效无法被移除" 的错误

    1 首先排除数据库中读取加密后的字段是否被强制截断 2 AES加密后的byte 首先应用base64 Convert ToBase64String 编码一次 若直接用utf8的话会报上述错误 若用unicode编码的话会解密成乱码 原因是加
  • java对象的内存模型详解:内存模型及对象头的奥秘

    在面试官的因势利导下 很多人对jvm的内存模型已经耳熟能详 但是对我们经常new 出来的对象 比如new Object 你了解它的内存模型吗 本篇文章将带你走进对象内部 真正去了解这个你最熟悉 也最不熟悉的的对象 一 对象的内存模型 先上图
  • (yolov5.train)-YOLOv3源码解析4-计算损失compute_loss()

    图像算法 yolov5 train YOLOv3源码解析4 计算损失compute loss 简书
  • linux安装anaconda及配置pytorch环境

    文章目录 下载anaconda 使用conda创建新环境 判断是否安装成功 判断pytorch是否安装成功 检验是否可以使用GPU 下载anaconda 这里有多种方法 可以下载到windows然后通过xftp传到linux服务器上 也可以
  • 狂刷200道数据结构与算法,我的华为面试经历分享

    基本概念面试题集 Spring 相关概念梳理 谈谈对Spring loC的理解 谈谈对Spring Dl的理解 BeanFactory 接口和ApplicationContext接口不同点是什么 请介绍你熟悉的Spring 核心类 并说明有
  • 累加器的作用

    累加器和算术逻辑单元 运算场所 指令寄存器 指令译码 定时及各种控制 信号产生电路 1 在运算器中 累加器是专门存放算术或逻辑运算的一个操作数和运算结果的寄存器 能进行加 减 读出 移位 循环移位和求补等操作 是运算器的主要部分 2 在中央
  • 大数据时代的 9 大Key-Value存储数据库

    在过去的十年中 计算世界已经改变 现在不仅在大公司 甚至一些小公司也积累了TB量级的数据 各种规模的组织开始有了处理大数据的需求 而目前关系型数据库在可缩放方面几乎已经达到极限 一个解决方案是使用键值 Key Value 存储数据库 这是一
  • JSR303和拦截器

    目录 一 JSR303 1 pom依赖 二 拦截器 1 什么是拦截器 2 拦截器与过滤器 3 应用场景 4 拦截器的快速入门 三 拦截器链 1 拦截器链的概念 2 TwoHandlerInterceptor java 3 在springmv