文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【SpringMVC】下篇,拦截器(一步到位学会它)

2023-10-09 13:49

关注

✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。
🍎个人主页:Hhzzy99
🍊个人信条:坚持就是胜利!
💞当前专栏:【Spring】
🥭本文内容:SpringMVC的后半部分内容-拦截器

SpringMVC


文章目录


前言

在上一篇文章中讲完了SpringMVC的大部分知识,此篇文章中主要讲解拦截器。上一篇文章🚩
拦截器的使用是非常普遍的。例如在 OA系统中通过拦截器可以拦截未登录的用户,或者使用它来验证己登录用户是否有相应的操作权限等。SpringMVC 中提供了拦截器功能,通过配置即可对请求进行拦截处理。


拦截器概述

SpringMVC 中的拦截器 (Interceptor)类似于 Servlet 中的过滤器(Filter),它主要用于拦截用户请求并做相应的处理。例如通过拦截器可以进行权限验证、判断用户是否己登录等。

拦截器的定义

要使用SpringMVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义:

实现HandlerInterceptor接口的定义方式为例,自定义拦截器类的代码如下所示:

public class UserInterceptor implements HandlerInterceptor {    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {        System.out.println("UserInterceptor...preHandle");        //对拦截的请求进行放行处理(true为放行,false为不放行)        return true;    }    public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("UserInterceptor...postHandle");    }    public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("UserInterceptor...afterCompletion");    }}

从上述代码可以看出,自定义的拦截器类实现了 HandlerInterceptor 接口,并实现了接口中的3 个方法。关于这3个方法的具体描述如下:

拦截器的配置

要使自定义的拦截器类生效,需要在SpringMVC的配置文件中进行配置,配置代码如下:

    <mvc:interceptors>                <bean class="com.hzy.interceptor.UserInterceptor"/>                <mvc:interceptor>                        <mvc:mapping path="/**"/>                        <mvc:exclude-mapping path=""/>                        <bean class="com.hzy.interceptor.Interceptor1"/>        mvc:interceptor>                <mvc:interceptor>            <mvc:mapping path="/hello"/>            <bean class="com.hzy.interceptor.Interceptor2"/>        mvc:interceptor>            ......    mvc:interceptors>

在上述代码中, 元素用于配置一组拦截器,其子元素中定义的是全局拦截器,它会拦截所有的请求;而元素中定义的是指定路径的拦截器,它会对指定路径下的请求生效。<mvc:interceptor>元素的子元素用于配置拦截器作用的路径,该路径在其属性 path中定义。如上述代码中 path 的属性值 “/**”表示拦截所有路径“/hello”表示拦截所有以“hello”结尾的路径。如果在请求路径中包含不需要拦截的内容,还可以通过 元素进行配置。

拦截器的执行流程

拦截器的执行是有一定顺序的,该顺序与配置文件中所定义的拦截器的顺序相关。

单个拦截器的执行流程

如果在项目中只定义了一个拦截器,那么该拦截器在程序中的执行流程如下图所示。从中可以看出,程序首先会执行拦截器类中的 preHandle()方法,如果该方法的返回值为 true,则程序就会继续向下执行处理器中的方法,否则将不再向下执行:在业务处理器(即控制器Controller 类)处理完请求后,会执行 postHandle()方法,然后通过 DispatcherServlet 向客户端返回响应;在 DispatcherServlet 处理完请求后,才会执行 afterCompletion()方法。
单个拦截器
简单的案例
web.xml中配置SpringMVC的前端过滤器和初始化加载配置文件等信息。

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"         version="3.1">        <servlet>                <servlet-name>spring-mvcservlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>                <init-param>            <param-name>contextConfigLocationparam-name>            <param-value>classpath:springmvc-config.xmlparam-value>        init-param>                <load-on-startup>1load-on-startup>    servlet>    <servlet-mapping>        <servlet-name>spring-mvcservlet-name>        <url-pattern>/url-pattern>    servlet-mapping>web-app>

在src下创建com.hzy.controller包,并在里面创建控制器类HelloController,

@Controllerpublic class HelloController {    @RequestMapping("/hello")    public String hello(){        System.out.println("Hello");        return "success";    }}

在src下创建com.hzy.interceptor包,并在里面创建拦截器类UserInterceptor,该类需要实现HandlerInterceptor接口。

public class UserInterceptor implements HandlerInterceptor {    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {        System.out.println("UserInterceptor...preHandle");        //对拦截的请求进行放行处理(true为放行,false为不放行)        return true;    }    public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("UserInterceptor...postHandle");    }    public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("UserInterceptor...afterCompletion");    }}

在resources目录下创建springmvc-config.xml

<beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:mvc="http://www.springframework.org/schema/mvc"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd       http://www.springframework.org/schema/context       https://www.springframework.org/schema/context/spring-context.xsd       http://www.springframework.org/schema/mvc       https://www.springframework.org/schema/mvc/spring-mvc.xsd">        <context:component-scan base-package="com.hzy.controller"/>        <bean id="internalResourceViewResolve"          class="org.springframework.web.servlet.view.InternalResourceViewResolver">                <property name="prefix" value="/WEB-INF/jsp/"/>                <property name="suffix" value=".jsp"/>    bean>    <mvc:annotation-driven/>        <mvc:interceptors>                <bean class="com.hzy.interceptor.UserInterceptor"/>    mvc:interceptors>beans>

在WEB-INF目录下创建一个jsp文件夹,并在里面创建一个页面文件success.jsp,然后在里面显示任意信息。发布并启动项目,访问http://localhost:8080/springMvc_SSM/hello(注意你的访问路径可能和我不一样哦)
结果:
在这里插入图片描述
控制台
在这里插入图片描述

多个拦截器的执行流程

在大型项目中,通常会定义很多拦截器来实现不同的功能。多个拦截器的执行顺序如图所示。这里假设有两个拦截器 Interceptor1Interceptor2,并且在配置文件中,Interceptor1拦截器配置在前。
在这里插入图片描述
从图上可以看出,当有多个拦截器同时工作时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。
下为了验证上述描述,下面就修改上面的代码来演示多个拦截器的执行。
在com.hzy.interceptor包中创建两个拦截器类Interceptor1和Interceptor2。
Interceptor1.java

public class Interceptor1 implements HandlerInterceptor {    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        System.out.println("Interceptor1...preHandle");        return true;    }    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("Interceptor1...postHandle");    }    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("Interceptor1...afterCompletion");    }}

Interceptor2.java

public class Interceptor2 implements HandlerInterceptor {    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        System.out.println("Interceptor2...preHandle");        return true;    }    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {        System.out.println("Interceptor2...postHandle");    }    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {        System.out.println("Interceptor2...afterCompletion");    }}

springmvc-config.xml

<beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:mvc="http://www.springframework.org/schema/mvc"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd       http://www.springframework.org/schema/context       https://www.springframework.org/schema/context/spring-context.xsd       http://www.springframework.org/schema/mvc       https://www.springframework.org/schema/mvc/spring-mvc.xsd">        <context:component-scan base-package="com.hzy.controller"/>        <bean id="internalResourceViewResolve"          class="org.springframework.web.servlet.view.InternalResourceViewResolver">                <property name="prefix" value="/WEB-INF/jsp/"/>                <property name="suffix" value=".jsp"/>    bean>    <mvc:annotation-driven/>        <mvc:interceptors>                <bean class="com.hzy.interceptor.UserInterceptor"/>                <mvc:interceptor>                        <mvc:mapping path="/**"/>                                    <bean class="com.hzy.interceptor.Interceptor1"/>        mvc:interceptor>                <mvc:interceptor>            <mvc:mapping path="/hello"/>            <bean class="com.hzy.interceptor.Interceptor2"/>        mvc:interceptor>    mvc:interceptors>beans>

上述拦截器的配置代码中,第一个拦截器会作用于所有路径下的请求,而第二个拦截器会作用于“/hello”结尾的请求。运行项目得到结果:
页面输出跟前面一样。
控制台输出:
在这里插入图片描述
从图中可以看出,程序先执行了前面两个拦截器类中的preHandle()方法,这两个方法的执行顺序与配置文件中定义的顺序相同;然后执行了控制器中类中的hello()方法;最后执行了两个拦截器类中的postHandle()方法和afterCompletion()方法,且这两个方法的执行顺序与配置文件中所定义的拦截器顺序相反。


结语

以上就是今天要讲的内容,主要是对上一篇文章的补充,拦截器的详细讲解,希望大家有所收获。

如果各位大哥大姐对我所写的内容觉得还行的话,希望可以点个关注,点个收藏,您的支持就是我最大的动力,非常感谢您的阅读(❁´◡`❁)

来源地址:https://blog.csdn.net/XUHUANGHOST/article/details/128406785

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯