【SSM – SpringMVC篇】09 SpringMVC拦截器Interceptor详解,多个拦截器的执行顺序,拦截器进行权限判断和日志记录,拦截器和过滤器的区别

【SSM – SpringMVC篇】09 SpringMVC拦截器Interceptor详解,多个拦截器的执行顺序,拦截器进行权限判断和日志记录,拦截器和过滤器的区别配置图文,超详细!!SpringMVC拦截器Interceptor详解,多个拦截器的执行顺序,拦截器进行权限判断和日志记录,拦截器和过滤器的区别

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

SpringMVC拦截器

  Interceptor拦截器,是SpringMVC提供用来拦截发送给Controller层方法请求的拦截器。类似于filter 主要进行记录日志,判断用户是否登录,过滤权限(没有登录就跳转登录之类的)
  拦截器和我们所学的过滤器是很相似的,只是范围不一样。

  • 过滤器filter:是JavaEE提供的用来拦截所有的请求,进行过滤,它主要用于实现编码过滤,进行统一编码,防止乱码。
  • 拦截器interceptor:主要用来拦截Controller控制器的方法,一般用于拦截Controller层,满足条件才放行,主要用于实现权限分配,不满足条件不能访问一些界面(比如登录才能进入)。

【注意】一般请求都是先通过过滤器filter过滤,才会被拦截器interceptor处理,决定是否放行,两个过程有任何一个不放行,都不能访问到Controller层方法。

1. 过滤器和拦截器的大概执行流程【***】

在这里插入图片描述

2. 拦截器的三个方法

  1. boolean preHandle():在访问controller方法之前执行,返回为true才会去执行Controller方法,返回false,就被拦截了,原路打回(主要做权限控制,有权限才放行)。
  2. void postHandle():在执行controller方法之后执行jsp页面之前执行该方法,可以向作用域中放入数据,影响jsp展示效果,(可以在执行jsp之前做渲染)
  3. void afterCompletion在jsp页面渲染完成之后执行,(主要用于记录日志,资源释放
    ,
    【注意小知识点来啦】如果preHadle返回true,但是没有找到对应的Controller,是不会执行postHandle方法哦。

差不多就是这样的模板

public class MyInterceptor implements HandlerInterceptor { 
   

// 在访问controller方法之前执行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
   
        //prehandle:访问controller之前执行,返回true 继续访问controller。
        System.out.println("\n----------AuthInterceptor 【preHandle】--------------");
        return true;//返回false就不再继续执行controller方法
    }

// 如果没有controller就不执行postHandle方法
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 
   
		//posthandle:在执行controller方法之后, 执行jsp之前执行该方法,可以向作用域中放入数据,影响jsp展示效果,(可以执行jsp之前做渲染)
        System.out.println("----------AuthInterceptor 【postHandle】-------------- ");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
   
        //afterCompletion:在jsp渲染之后执行,用于记录日志,资源释放
        System.out.println("----------AuthInterceptor 【afterCompletion】--------------");

		//记录日志 向文件里面写日志
        String logdir = request.getServletContext().getRealPath("log");//获取服务器记录日志log文件所存放的目录位置 -- tomcat下的真实路径+log目录
        //路径不存在就创建
        Path logdirPath = Paths.get(logdir);
        if(Files.notExists(logdirPath)){ 
   
            Files.createDirectories(logdirPath);
        }
        //目录存在就将数据[字符]写入
        Path logfile = Paths.get(logdir,"userlog.log");//存放日志的路径+文件名
        BufferedWriter writer = new BufferedWriter(new FileWriter(logfile.toFile(),true));//logfile.toFile() paths转换为File类型 true以追加的方式写入
		
		//获取登录用户信息
        Users user = (Users)request.getSession().getAttribute("user");
        String username = user.getUsername();
        //记录user登录时间,存入日志
        String message = username+" 登录时间:"+new Date();
        writer.write(message+"\r\n");
        writer.flush();
        writer.close();
    }
}

3. 多个拦截器的执行顺序

如果所有拦截器都通过(都不拦截)执行顺序是这样的:
(都执行的话,preHandle顺序执行,postHandler逆序执行,最后再afterCompletion逆序执行)
在这里插入图片描述
如果拦截器1拦截(也就是preHandle1返回false),那么后面的拦截器也不执行,直接原路打回。
在这里插入图片描述
如果拦截器3拦截,那么也不执行controller方法,大概是这样的。
在这里插入图片描述

4. SpringMVC拦截器的配置

4.1 自定义拦截器,实现HandlerInterceptor接口

//实现一个接口HandlerInterceptor
public class Demo01Interceptor  implements HandlerInterceptor { 
   
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
   
        System.out.println("preHandle");
        return true;//放行执行controller
    }

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

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

    }
}

4.2 springmvc.xml配置拦截器

配置多个拦截器

<!-- /** 是拦截所有的请求 path="/interceptor"只拦截interceptor路径-->
     <mvc:interceptors>
         <mvc:interceptor>
         	<!-- /**拦截所有请求,配置全局拦截器 -->
             <mvc:mapping path="/**"/>
             <bean class="com.xgf.springmvc.ajax.interceptor.AuthInterceptor"/>
         </mvc:interceptor>
         <mvc:interceptor>
         	<!-- /interceptor 之拦截interceptor该路径 -->
             <mvc:mapping path="/interceptor"/>
             <bean class="com.xgf.springmvc.ajax.interceptor.AuthInterceptor1"/>
         </mvc:interceptor>
     </mvc:interceptors>

5. 案例:用户权限拦截器和日志记录

有些页面只有用户登录才能访问,未登录不能访问。

5.1 案例图解【***】

在这里插入图片描述
浏览器进行访问,想去购物车模块/订单模块需要先进行用户登录,用户权限拦截器进行判断用户登录没有,登录成功,放行,可以访问。未登录,拦截,跳转登录界面。

5.2 用户权限拦截器UserAuthInterceptor

作用:判断访问路径,如果访问的是order订单模块或者cart购物车模块.就需要判断用户是否登录,读取session中的用户信息,未登录强制跳转到登入页面,登录就放行,进入相应页面

public class UserAuthInterceptor implements HandlerInterceptor { 
   
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
   
        System.out.println("UserAuthInterceptor preHandle------------------------");
        User user = (User) request.getSession().getAttribute("user");
        if(user == null){ 
   //未登录才判断,登录了直接放行
            String address = request.getRequestURI();//获取路径
            System.out.println("address = "+address);
            //是购物车或者订单页面,就直接跳转登录界面
            if(address.contains("order")||address.contains("cart")){ 
   
	            //强制到登录页面
                response.sendRedirect(request.getContextPath() + "/login.jsp");
                //设置为false,不访问controller
                return false;
            }
        }
        //其它模块或者已经登录,就直接放行
        return true;
    }

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

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
   
        System.out.println("UserAuthInterceptor afterCompletion------------------------");
        
		//记录日志 向文件里面写日志
        String logdir = request.getServletContext().getRealPath("log");//获取服务器记录日志log文件所存放的目录位置 -- tomcat下的真实路径+log目录
        //路径不存在就创建
        Path logdirPath = Paths.get(logdir);
        if(Files.notExists(logdirPath)){ 
   
            Files.createDirectories(logdirPath);
        }
        //目录存在就将数据[字符]写入
        Path logfile = Paths.get(logdir,"userlog.log");//存放日志的路径+文件名
        BufferedWriter writer = new BufferedWriter(new FileWriter(logfile.toFile(),true));//logfile.toFile() paths转换为File类型 true以追加的方式写入
		
		//获取登录用户信息
        Users user = (Users)request.getSession().getAttribute("user");
        String username = user.getUsername();
        //记录user登录时间,存入日志
        String message = username+" 登录时间:"+new Date();
        writer.write(message+"\r\n");
        writer.flush();
        writer.close();
    }
}

5.3 OrderController订单controller

订单模块

@Controller
@RequestMapping("/toOrder")
public class OrderController { 
   
    @RequestMapping(path = "/orderInfo.action",method = { 
   RequestMethod.GET,RequestMethod.POST})
    public String query(Integer id){ 
   
        System.out.println("订单信息");
        return "order";
    }
}

5.4 CartController购物车controller

购物车模块

@Controller
@RequestMapping("/toCart")
public class OrderController { 
   
    @RequestMapping(path = "/cartInfo.action",method = { 
   RequestMethod.GET,RequestMethod.POST})
    public String query(Integer id){ 
   
        System.out.println("购物车信息");
        return "cart";
    }
}

5.5 springmvc中配置拦截器

   <!--配置用户权限拦截器-->
    <mvc:interceptors>
        <!--用于测试的拦截器-->
        <mvc:interceptor>
            <!--拦截路径的配置 /**拦截所有请求 -->
            <mvc:mapping path="/**"/>
            <bean id="interceptor1" class="com.xgf.interceptor.UserAuthInterceptor"/>
        </mvc:interceptor>
	<!-- 可以配置多个拦截器,继续用mvc:interceptor-->
    </mvc:interceptors>

大佬们,画图不容易啊,给个关注给个赞呗,感谢感谢=

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160946.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SSRS 的简单使用(一)

    SSRS 的简单使用(一)

    2021年11月25日
    81
  • Django组件_django路由path

    Django组件_django路由path什么是Django中间件中间件(Middleware)是一个用来处理Django的请求(Request)和响应(Response)的框架级别的钩子,它是一个轻量、低级别的插件系统,用于在全局范围内改

    2022年7月29日
    7
  • java有全局变量吗_java局部变量和成员变量的区别

    java有全局变量吗_java局部变量和成员变量的区别//    java全局变量危害 //    最近为了图快捷,使用了全局变量,然后就想到了一些危害//  1.线程不安全:线程中多个全局变量,修改容易冲突,需要加锁//  2.增加耦合性:修改全局变量可能会影响其他模块//  3.难以定位修改:难以定位全局变量在哪里被修改了,加大了调用难度//  4.长期占用内存:生命

    2022年8月21日
    5
  • Java ListNode 链表

    JavaListNode链表基本结构基本初始化添加构造方法初始化范型写法创建与遍历链表插入节点替换节点删除节点补充说明基本结构链表是一种数据结构,由数据和指针构成,JavaListNode链表是一种由Java自定义实现的链表结构。基本初始化classListNode{//类名:Java类就是一种自定义的数据结构intval;//数据:节点数据ListNodenext;//对象:引用下一个节点对象。在Jav

    2022年4月8日
    251
  • mysql自定义函数详解_sql自定义函数例子

    mysql自定义函数详解_sql自定义函数例子摘要腾兴网为您分享:mysql自定义函数与动态查询,智学网,夜读小说,小睡眠,西餐菜谱等软件知识,以及猫语翻译器,江西校讯通,刷qq业务的网站,房洽洽,学士服照,爱站seo工具包,虚拟声卡驱动,隐藏分,卦象,供零在线永辉,七猫精品小说,海纳百川器,华尔街日报,双十一图片,中国地震信息网等软件it资讯,欢迎关注腾兴网。介绍下mysql自定义函数的例子,以及插入单引号的方法,动态执行查询与字符串拼接…

    2022年9月8日
    3
  • 怎么测试网站的稳定性_稳定性长期试验需进行多少个月试验

    怎么测试网站的稳定性_稳定性长期试验需进行多少个月试验今天面试遇到一个问题,如何进行网站的稳定性测试?因为之前从事的是电信行业,其稳定性测试是发送确定的traffic,运行72小时,观测系统的资源使用情况,traffic处理是否正常,有无内存泄漏,有无进程崩溃,其他资源使用是否正常等等。所以也给了一个类似的稳定性测试思路:按照系统设计容量的性能指标,模拟最大并发访问需求,运行72小时,看系统响应时间,监控资源利用的方法。回来查询发现,网易对这个问题也…

    2022年9月8日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号