SpringMVC拦截器

SpringMVC拦截器

介绍

拦截器(interceptor)的作用

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

将拦截器按一定的顺序连接成一条链,这条链称为拦截器链(Interception Chain)。在访问被拦截的方法或字段时,拦截器链中的拦截器链就会按其之间定义的顺序被调用。拦截器也是AOP思想的具体实现

拦截器和过滤器之间的区别

区别过滤器(Filter)拦截器(Interceptor)
使用范围是servlet规范中的一部分,任何java web工程都可以使用是SpringMVC框架自己的,只有使用来了SpringMVC框架的工程才可以使用
拦截范围在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截在<mvc:mapping path=“”/>中配置了/**之后,也可以对所有的资源进行拦截,但是可以通过<mvc:exclude-mapping path=“” />标签排除不需要拦截资源

快速入门

自定义拦截器只有三步:

  • 创建拦截器类实现HandlerInterception接口
  • 配置拦截器
  • 测试拦截器的拦截效果

代码实现

1、创建拦截器类实现HandlerInterceptor接口

public class MyhandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle running....");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandler running...");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion running...");
    }
}

2、配置拦截器

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="interceptor.MyhandlerInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

3、测试拦截器的拦截效果(编写目标方法)

@Controller
public class TestController {

    @RequestMapping("/test")
    @ResponseBody
    public String save() {
        System.out.println("目标方法执行...");
        return "index";
    }
}

http://localhost:8080/test

img

多拦截器操作

同上,在编写一个MyHandlerInterceptor1操作,测试执行顺序

img

拦截器方法说明

方法名说明
preHandler()方法将在请求处理之前进行调用,该方法的返回值是布尔值Boolean类型的,当它返回为false时,表示请求结束,后续的Interceptor和Controller都不会再执行;当返回值为true时就会继续调用下一个Interceptor的preHandle方法
postHandler()该方法是在当前请求进行处理之后被调用,前提是preHandler方法的返回值为true时才能被调用,且它会在DispatcherServlet进行视图返回渲染之前被调用,所以可以在这个方法中对Controller处理之后的ModelAndView对象进行操作
afterCompletion()该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行,前提是preHandler方法的返回值为true时才能调用

案例

用户登录权限控制

需求:用户没有登录得情况下,不能对后台菜单进行访问操作,点击菜单跳转到登录页面,只有用户登录成功之后,才能进行后台功能得操作

public class PrivilegeInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 逻辑:判断 用户是否登录 本质:判断session中有没有user
        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("user");
        if (user == null) {
            // 没有登录
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            return false;
        }

        // 放行 访问目标资源
        return true;
    }
}

拦截器配置

    <mvc:interceptors>
        <mvc:interceptor>
            <!--配置那些资源需要拦截-->
            <mvc:mapping path="/**"/>
            <!--配置那些资源需要排除-->
            <mvc:exclude-mapping path="/user/login"/>
            <bean class="com.dc.interceptor.PrivilegeInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

UserController

@RequestMapping("/user")
@Controller
public class UserController {

    @Autowired
    private UserService userService;

    @RequestMapping("/login")
    public String login(String username, String password, HttpSession session) {
        User login = userService.login(username, password);
        System.out.println(login);
        if (login != null) {
            session.setAttribute("user", login);
            return "redirect:/index.jsp";
        }
        return "redirect:/login.jsp";
    }
}

Service

public interface UserService {
    User login(String username, String password);
}

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

 @Override
    public User login(String username, String password) {
        try {
            return userDao.login(username, password);
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }
}

Dao层

public interface UserDao {
    User login(String username, String password);
}

public class UserDaoImpl implements UserDao {
    
        private JdbcTemplate jdbcTemplate;

    public void setJdbcTemplate(JdbcTemplate jdbcTemplate){
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public User login(String username, String password) throws EmptyResultDataAccessException {
        User user = jdbcTemplate.queryForObject("select * from sys_user where username = ? and password = ?", new BeanPropertyRowMapper<User>(User.class), username, password);
        return user;
    }
}

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/25936.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

hive中如何计算字符串中表达式

比如 select 1(2-3)(-4.1-3.1)-(4-3)-(-3.34.3)-1 col ,1(2-3)(-4.1-3.1)-(4-3)-(-3.34.3)-1 result \ 现在的需求式 给你一个字符串如上述col 你要算出result。 前提式 只有和-的运算&#xff0c;而且只有嵌套一次 -(4-3)没有 -(-4(3-(31)))嵌套多次。 第一步我们需要将运…

【学习笔记】Python核心技术与实战-基础篇-03列表和元组,到底用哪个?

目录 列表和元组基础概念区别列表和元组的基础操作和注意事项列表和元组存储方式的差异列表和元组的性能列表和元组的使用场景总结思考题 列表和元组基础 概念 列表和元组&#xff0c;都是一个可以放置任意数据类型的有序集合。 在绝大多数编程语言中&#xff0c;集合的数据类…

js数据类型和六种运算结果为false的情况

数据类型 number&#xff1a;数字&#xff08;整数、小数、NaN(Not a Number)&#xff09; string&#xff1a;字符串、单双引皆可 boolean&#xff1a;布尔。true、false null&#xff1a;对象为空 undefined&#xff1a;当声明的变量初始化时&#xff0c;该变量的默认值…

JPEG压缩基本原理

JPEG算法的第一步是将图像分割成8X8的小块。 在计算机中&#xff0c;彩色图像最常见的表示方法是RGB格式&#xff0c;通过R(Red)、G(Green)A和(Blue)组合出各种颜色。 除此以外&#xff0c;还有一种表示彩色图像的方法&#xff0c;称为YUV格式。Y表示亮度&#xff0c;U和V表示…

Spring第三方bean管理

文章目录 1.第三方bean管理1.1 Bean1.2 小结 2.第三方bean依赖注入2.1 简单类型&#xff1a;成员变量2.2 引用类型&#xff1a;方法形参2.3 小结 3.总结 1.第三方bean管理 1.1 Bean 首先看一下目录结构&#xff0c;APP里面就初始化了SpringConfig文件 SpringConifg中就一句话…

C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解

目录 1、引言 2、什么是智能指针&#xff1f; 3、在Visual Studio中查看智能指针的源码实现 4、独占式指针unique_ptr 4.1、查看unique_ptr的源码实现片段 4.2、为什么unique_ptr的拷贝构造函数和复制函数被delete了&#xff1f;&#xff08;面试题&#xff09; 4.3、使…

Java网络开发(Tomcat)—— Servlet学习 Web相关背景知识 JavaWeb项目初步

本文目录 引出〇、域名、IP、端口一、软件架构BS和CS二、实现Web服务的条件和步骤三、Tomcat搭建Web项目初步1.pom.xml文件配置2.web.xml文件更新3.Tomcat运行环境配置4.项目文件层级解析 四、JavaWeb项目文件分类&#xff08;1&#xff09;静态文件—存放位置&#xff08;2&am…

今天面了个字节跳动拿30k出来的测试大佬,让我见识到了什么是天花板

2022年堪称大学生就业最难的一年&#xff0c;应届毕业生人数是1076万。失业率超50%&#xff01; 但是我观察到一个数据&#xff0c;那就是已经就业的毕业生中&#xff0c;计算机通信等行业最受毕业生欢迎&#xff01; 计算机IT行业薪资高&#xff0c;平均薪资是文科其他岗位的…

【Linux】常用命令的汇总学习

文章目录 1.目录切换命令2.目录操作命令3.把ls -l中包含字母file&#xff08;不区分大小写&#xff09;的内容输出4.统计txt中的某个字符串5.grep命令的使用6.linux查找当前目录下所有txt文件7.linux中的find命令8.查看系统所有的进程信息9.如何确定文件的类型10.tar解压缩11.U…

Java数据驱动:CData JDBC Drivers 2022 Crack

JDBC 驱动程序 易于使用的 JDBC 驱动程序&#xff0c;具有强大的企业级功能 无与伦比的性能和可扩展性。 对实时数据的简单 JDBC/SQL 访问。 从流行的 BI 工具访问实时数据。 集成到流行的 IDE 中。 CData JDBC Drivers Software 是领先的数据访问和连接解决方​​案提供商。我…

如何更改 Linux 文件和目录权限?

在Linux系统中&#xff0c;文件和目录权限是安全性和访问控制的关键组成部分。正确设置文件和目录的权限可以确保只有授权的用户能够读取、写入或执行这些文件和目录。 本文将详细介绍如何在Linux系统中更改文件和目录的权限。 1. 文件和目录权限概述 在Linux系统中&#xff…

【sentinel】漏桶算法在Sentinel中的应用

漏桶算法介绍 漏桶算法&#xff0c;又称leaky bucket。 从图中我们可以看到&#xff0c;整个算法其实十分简单。首先&#xff0c;我们有一个固定容量的桶&#xff0c;有水流进来&#xff0c;也有水流出去。对于流进来的水来说&#xff0c;我们无法预计一共有多少水会流进来&am…

AUTOSAR通信篇 - CAN网络通信(二:CanIf)

目录 初始化 数据发送 请求发送 发送数据流 发送缓存 发送确认 数据接收 数据接收提醒 读取接收数据 CAN控制器模式 控制器模式转换 唤醒 PDU通道模式控制 PDU通道组 PDU通道模式 总结 在上一篇&#xff0c;我们介绍了CAN模块&#xff0c;接下来我们介绍在CAN模…

基于html+css的图展示96

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

ts报错“this“ 隐式具有类型 “any“,因为它没有类型注释。解决方案

序 1、参考博文》①严格模式 - 知乎&#xff0c;②ts的tsconfig.son中文说明③TypeScript Number | 菜鸟教程 2、解决&#xff08;ts报错“this“ 隐式具有类型 “any“&#xff0c;因为它没有类型注释。&#xff09; 3、解决&#xff08;函数内this是undefined 的问题&#xf…

STM32CubeIDE + HAL + STM32f103C8T6 系列教程1 ---板载PC13LED闪烁

STM32CubeIDE HAL STM32f103C8T6 系列教程1 --- 板载PC13LED闪烁 引言硬件关于开发板[^2]控制器内置存储器原理图 硬件连线硬件连接表硬件连线图 软件STM32CubeIDE下载及安装Stm32CubeIDE设置补全快捷键和主题新建一个工程选择开发板核心芯片型号设置工程相关参数STM32CubeMX…

《程序员面试金典(第6版)》面试题 02.08. 环路检测(哈希法,双指针,检测链表是否有环)

题目描述 给定一个链表&#xff0c;如果它是有环链表&#xff0c;实现一个算法返回环路的开头节点。若环不存在&#xff0c;请返回 null。 题目传送门&#xff1a;面试题 02.08. 环路检测 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链…

【笔记整理】常见聚类算法

【笔记整理】常见聚类算法 文章目录 【笔记整理】常见聚类算法一、均值偏移 - Mean-shift&#xff08;★★★★&#xff09;1、概述 & 图解&#xff08;“偏心”&#xff09;2、公式 & 步骤1&#xff09;基本公式&#xff08;“偏移量更新圆心”&#xff09;2&#xff…

4:File类与IO流

文章目录 File类1&#xff1a;引入&#xff1a;2&#xff1a;对文件进行操作3&#xff1a;对目录/文件夹进行操作 IO流1&#xff1a;引入&#xff1a;2&#xff1a;字符输入 / 出流FileReader 与 FileWriter3&#xff1a;用try - catch - finally 处理异常4&#xff1a;几个常见…

【Android-JetpackCompose】13、实战在线课程 App

文章目录 一、BottomNavigation 底部导航1.1 底部导航栏的布局、点击1.2 设置 bottomBar 的颜色1.3 设置顶部 actionBar 的颜色 二、主页 StudyScreen2.1 顶部状态栏2.2 一、BottomNavigation 底部导航 1.1 底部导航栏的布局、点击 首先&#xff0c;构造 NavigationItem 的 d…