zoukankan      html  css  js  c++  java
  • springMVC ---- 拦截器

    本文的内容,均来自慕课网视频(springMVC拦截器)

    拦截器的实现步骤 :

      1、编写拦截器类,实现HandlerInterceptor接口。

      2、将拦截器注册进springMVC框架。

      3、配置拦截器的拦截规则。

    拦截器使用场景 :

      使用原则 : 处理所有请求的共性问题

      1、解决乱码。

      2、解决权限验证问题。

    拦截器和过滤器的区别 :

      过滤器Filter依赖于Servlet容器,基于回调函数,过滤范围大(可过滤资源(js、css、图片等))。

      拦截器Interceptor依赖于框架容器,基于反射机制,只过滤请求。

    此处我们简单介绍下拦截器的使用:

    1、编写拦截器类

     1 package com.hgs.interceptor;
     2 
     3 import javax.servlet.http.HttpServletRequest;
     4 import javax.servlet.http.HttpServletResponse;
     5 import org.springframework.web.servlet.HandlerInterceptor;
     6 import org.springframework.web.servlet.ModelAndView;
     7 public class MyInterceptor implements HandlerInterceptor {
     8 
     9     /**
    10      * 该方法不常用
    11      */
    12     @Override
    13     public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
    14             throws Exception {
    15         
    16     }
    17 
    18     /**
    19      * 该方法可用于请求完成后记录日志等。
    20      * ModelAndView arg3 : 通过该参数,可以修改目标对象返回的视图以及数据
    21      */
    22     @Override
    23     public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
    24             throws Exception {
    25         // 修改目标对象返回的数据
    26         arg3.addObject("msg", "这里传回的是被拦截器修改之后的消息!!");
    27         //修改目标对象返回的视图名称
    28         arg3.setViewName("/hello.jsp");
    29     }
    30 
    31     /**
    32      * 对请求进行预处理
    33      * 返回值 : 表示我们是否需要将当前请求拦截下来
    34      *     如果返回false ,请求将被终止
    35      *     如果返回true , 请求将会继续运行
    36      * Object arg2 : 表示的是被拦截的请求的目标对象(controller)
    37      */
    38     @Override
    39     public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
    40         // 设置请求编码为:UTF-8
    41         arg0.setCharacterEncoding("UTF-8");
    42         
    43         //对用户是否登录进行判断
    44         if(arg0.getSession().getAttribute("user") == null) {
    45             //如果用户没有登录,则终止请求,并发送到登录界面
    46             arg0.getRequestDispatcher("/login.jsp").forward(arg0, arg1);
    47             //终止请求
    48             return false;
    49         }
    50         return true;
    51     }
    52 
    53 }

    拦截器方法介绍 :

      1、afterCompletion : 在请求结束之后执行,一般很少有。

      2、postHandle : 在请求被目标对象处理后调用(可修改目标对象返回的视图和数据)。

      3、preHandle : 在请求被目标对象处理前调用。

    2、在springMVC的xml配置文件中,将拦截器配置进springMVC框架,并配置拦截规则。

    <mvc:interceptors>
          <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 --> 
          <!-- <bean class="com.hgs.interceptor.MyInterceptor"/>  -->
          <mvc:interceptor>   
                <mvc:mapping path="/api/user/*"/>  <!-- 拦截范围(路径);例如:后台目录 --> 
                <mvc:exclude-mapping path="/api/user/login"/>     <!-- 不被拦截范围(路径);例如:后台登录页面 -->
                <bean class="com.hgs.interceptor.MyInterceptor"/>
          </mvc:interceptor>
        </mvc:interceptors>

    总结 : 拦截器可处理web应用中的请求的一些通用性问题(编码、权限验证等)。

        共性问题在拦截器中处理,可减少重复代码,便于维护。

    最后附上一张图(多个拦截器同时工作是,方法调用顺序),拦截器方法调用顺序根据配置文件中配置的顺序确定先后:

  • 相关阅读:
    [ 黑盒测试方法 ] 错误猜测法
    [ 黑盒测试方法 ] 边界值分析法
    [ 黑盒测试方法 ] 等价类划分法
    [ Python入门教程 ] Python面向对象编程(下)
    [ Python入门教程 ] Python面向对象编程(上)
    [ Python入门教程 ] Python模块定义和使用
    [ Python入门教程 ] Python常用内置函数介绍
    [ Python入门教程 ] Python函数定义和使用
    MyBatis的缓存分析
    微机原理与接口技术总计
  • 原文地址:https://www.cnblogs.com/yinz/p/5437645.html
Copyright © 2011-2022 走看看