springmvc中自定义拦截器以及拦截器的执行过程

1.拦截器在一次请求中的执行流程



2.拦截器入门案例

2.1springMVC.xml的编写

<?xml version="1.0" encoding="UTF-8"?>
<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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

        <context:component-scan base-package="com.atguigu"></context:component-scan>
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/view/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>

        <!--
        静态资源需要默认的servlet来处理
          -->
        <mvc:default-servlet-handler/>
        <mvc:annotation-driven></mvc:annotation-driven>

        <mvc:interceptors>
            <!--  默认拦截所有请求-->
            <bean class="com.atguigu.interceptor.FirstInterceptor"></bean>
            <bean class="com.atguigu.interceptor.SecondInterceptor"></bean>
            <!-- 此方式要求拦截器上必须加上@Component -->
        <!--     <ref bean="firstInterceptor"/> -->

        <!--  自定义拦截方式-->
        <!--
             <mvc:interceptor>
                <bean></bean>
                <mvc:mapping path=""/>用于登入验证,如果session中没有值,拦截。有值,不拦截
                <mvc:exclude-mapping path=""/>有些功能不需要拦截,例如跳转到登入页面

            </mvc:interceptor>
        -->
        </mvc:interceptors>

</beans>

2.2 拦截器的编写

FirstInterceptor

package com.atguigu.interceptor;

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

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class FirstInterceptor implements HandlerInterceptor {

    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // TODO Auto-generated method stub
        System.out.println("First:afterCompletion");

    }

    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        // TODO Auto-generated method stub
        System.out.println("First:postHandle");
    }

    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("First:preHandle");
        return true;
    }

}

SecondInterceptor

package com.atguigu.interceptor;

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

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class SecondInterceptor implements HandlerInterceptor {

    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        // TODO Auto-generated method stub
        System.out.println(" Second:afterCompletion");

    }

    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        // TODO Auto-generated method stub
        System.out.println(" Second:postHandle");
    }

    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        // TODO Auto-generated method stub
        System.out.println(" Second:preHandle");
        return true;
    }

}

2.3拦截器的执行顺序

First:preHandle
 Second:preHandle
 Second:postHandle
First:postHandle
 Second:afterCompletion
First:afterCompletion

    /**
     * 当有多个拦截器时,
     * preHandle,按照拦截器数组的正向顺序执行
     * postHandle,按照拦截器数组的反向顺序执行
     * afterCompletion,按照拦截器数组的反向顺序执行
     *
     * 当多个拦截器的preHandle有不同的值时,
     * 第一个返回false,第二个返回false,只有第一个拦截器的preHandle()会执行
     * 第一个返回true,第二个返回false,(全部)第一、二个拦截器的preHandle()、(全部)postHandle()都不会执行,
     * 而afterCompletion()有(返回false的拦截器之前的)第一个会执行
     * 第一个返回false,第二个返回true:只有第一个的perhandle()会执行
     *
     * @return
     */

原文地址:https://www.cnblogs.com/lsk-130602/p/12242309.html

时间: 2025-01-02 19:08:30

springmvc中自定义拦截器以及拦截器的执行过程的相关文章

SSM-SpringMVC-10:SpringMVC中PropertiesMethodNameResolver属性方法名称解析器

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 上次的以继承MultiActionController可以实现一个处理器中多个处理方法,但是局限出来了,他们的url访问地址只能是与方法名称相同的,因为他默认的方法名称解析器是InternalPathMethodNameResolver 如果我们想为了程序的安全甚至更多考虑(从url简洁啊,同名啊,等等)所以引入了一个叫PropertiesMethodNameResolver属性方法名称解析器的这个东西 我

Android中自定义视图View之---渲染器Shader对象

下面再来看下一个知识点:颜色渲染Shader对象 为什么我要把Shader对象单独拿出来说一下呢?因为这个对象在对于我们处理图形特效的时候是非常有用的 下面来看一下Android中Shader对象 在Android Api中关于颜色渲染的几个重要的类:Shader,BitmapShader,ComposeShader,LinearGradient,RadialGradient,SweepGradient它们之间的关系是: Shader是后面几个类的父类 该类作为基类主要是返回绘制时颜色的横向跨度

SSM-SpringMVC-11:SpringMVC中ParameterMethodNameResolver参数方法名称解析器

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 或许曾经的我们也见过一种方式http://localhost:8080/项目名/后台servlet?actionName=login&uname=admin&upwd=123 这种方式调度servlet并且传参数,这里我要表达什么呢?就是?后面可以拼接内容, 所以,此处的ParameterMethodNameResolver就是通过这种方式来访问到的方法名的 说一下案例使用步骤 一,定义Paramet

SpringMVC中ModelAndView对象与“视图解析器”

摘要: spring MVC这个环境中,Spring MVC会依据controller(或者你叫它handler)中处理方法的返回值,进行解析,解析之后提供一个视图,作为响应. 标注了@Controller的处理器,实际上本质是一个POJO,你标注了@Controller,我就高看你一眼. spring MVC这个环境中,Spring MVC会依据controller(或者你叫它handler)中处理方法的返回值,进行解析,解析之后提供一个视图,作为响应.标注了@Controller的处理器,实

springmvc中设置多个视图解析器

最近一直用的是Springboot +vue 前后端分离的 架构 ,所以对于Springmvc的各种配置有些生疏,看了下多个视图解析器的东西,觉得挺好的,所以想记下来 freemark 和jsp的视图解析器的配置 1 <!--===============通用视图解析器 begin===============--> 2 <bean id="viewResolverCommon" 3 class="org.springframework.web.servle

在SpringMVC中自定义上下文的一些想法

很多时候,开发Web应用时各种前后台交互让人很烦闷,尤其是各种权限验证啦,购物车商品信息啦等等-- 大家第一时间想到的是: 采用HttpSession来存这些对象.然后就是各种参数从Controller传到Service再传到持久层方法.一直传一直传. 在现阶段需求变化极快的前提下,如果架构没事先想好各种参数的传递,很容易导致我们需要的一些参数要通过方法层层传递才能用到.为什么不想一个简单点的,直接通过自定义上下文轻松拿到的方法来实现我们随时随地获取这些对象的方式呢? 改变传统的参数层层传递,让

对于HTML页面中CSS, JS, HTML的加载与执行过程的简单分析

最近在研究HTML页面中JavaScript的执行顺序问题.在JavaScript中,定义一个方法或者函数有很多方式,最常见的有2中,function语句式与函数直接量方式. 对于function语句式,解释器会优先解释.即加载了这个js文件后,会扫描一下所有的js代码,然后把该优先执行的东西先执行了,然后再从上到下按顺序执行.所以,定义的代码可以在执行的代码后边.就跟C#中的方法定义一样.解释器已经记住了这个方法,知道在内存中的哪里,用的时候直接去取就行了. C#语言是,对象中的属性与方法具有

C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息

C#调用SQL中的存储过程中有output参数,类型是字符型的时候一定要指定参数的长度.不然获取到的结果总是只有第一字符.本人就是由于这个原因,折腾了很久.在此记录一下,供大家以后参考! 例如: CREATE PROCEDURE sp_AccountRole_Create @CategoryID int, @RoleName nvarchar(10), @Description nvarchar(50), @RoleID int output AS DECLARE @Count int -- 查

关于SpringMvc中js和图片路径正确但是不能加载的问题

SpringMvc中,在没有设置拦截特殊的请求时,会默认拦截所有请求,包括js和图片等静态请求,造成资源查询失败404错误(http://localhost:8080/SSHA/js/jquery.js Failed to load resource: the server responded with a status of 404 (Not Found)). 较好的解决方案是设置SpringMvc拦截特定请求,如设置只拦截以.do结尾的请求: 原文地址:https://www.cnblogs