springmvc 梳理12--拦截器

SpringMVC拦截器有许多应用场景,比如:登录认证拦截器,字符过滤拦截器,日志操作拦截器等等。

 

1、自定义拦截器

SpringMVC拦截器的实现一般有两种方式

1. 自定义的Interceptor类要实现了Spring的HandlerInterceptor接口。

2. 继承实现了HandlerInterceptor接口的类,比如Spring已经提供的实现了HandlerInterceptor接口的抽象类 HandlerInterceptorAdapter。

 

 

 

 

2、拦截器拦截流程

 

 

 

 

3、拦截器规则

我们可以配置多个拦截器,每个拦截器中都有三个方法。下面将总结多个拦截器中的方法执行规律。

  1. preHandle:Controller方法处理请求前执行,根据拦截器定义的顺序,正向执行。
  2. postHandle:Controller方法处理请求后执行,根据拦截器定义的顺序,逆向执行。需要所有的preHandle方 法都返回true时才会调用。
  3. afterCompletion:View视图渲染后处理方法:根据拦截器定义的顺序,逆向执行。preHandle返回true就会 调用。

 

 

public class LoginInterceptor implements HandlerInterceptor {
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
  Object handler) {
    return true;
  }
  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response,
  Object handler, ModelAndView modelAndView) {}
  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse
  response, Object handler, Exception ex) {}
}

 

 

 

 

4、登录拦截器

接下来编写一个登录拦截器,这个拦截器可以实现认证操作。就是当我们还没有登录的时候,如果发送请求访问我 们系统资源时,拦截器不放行,请求失败。只有登录成功后,拦截器放行,请求成功。登录拦截器只要在 preHandle()方法中编写认证逻辑即可,因为是在请求执行前拦截。

 

 

/**
     * 登录拦截器
     */
    public class LoginInterceptor implements HandlerInterceptor {
        /**
         在执行Controller方法前拦截,判断用户是否已经登录,
         登录了就放行,还没登录就重定向到登录页面
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                                 Object handler) {
            HttpSession session = request.getSession();
            User user = session.getAttribute("user");
            if (user == null){
//还没登录,重定向到登录页面
                response.sendRedirect("/toLogin");
            }else {
//已经登录,放行
                return true;
            }
        }
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response,
                               Object handler, ModelAndView modelAndView) {}
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse
                response, Object handler, Exception ex) {}
    }

 

 

 

编写完SpringMVC拦截器,我们还需要在springmvc.xml配置文件中,配置我们编写的拦截器,配置代码如下:

1. 配置需要拦截的路径

2. 配置不需要拦截的路径

3. 配置我们自定义的拦截器类

 

 

<!--配置拦截器-->
<mvc:interceptors>
  <mvc:interceptor>     <!--       mvc:mapping:拦截的路径       /**:是指所有文件夹及其子孙文件夹       /*:是指所有文件夹,但不包含子孙文件夹       /:Web项目的根目录-->     <mvc:mapping path="/**"/>     <!--     mvc:exclude-mapping:不拦截的路径,不拦截登录路径     /toLogin:跳转到登录页面     /login:登录操作     -->     <mvc:exclude-mapping path="/toLogin"/>     <mvc:exclude-mapping path="/login"/>     <!--class属性就是我们自定义的拦截器-->     <bean id="loginInterceptor" class="cn.zwq.springmvc.interceptor.LoginInterceptor"/>   </mvc:interceptor>


<!--如果还有其他拦截器,那么还是按照上面的拦截器配置--> </mvc:interceptors>

 

 

编写SpringMVC配置类,将自定义拦截器添加到配置中:

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
  @Override
  public void addInterceptors(InterceptorRegistry registry) {
  //创建自定义的拦截器
  Interceptor interceptor = new LoginInterceptor();
  //添加拦截器
  registry.addInterceptor(interceptor)
  //添加需要拦截的路径
  .addPathPatterns("");
  }  
}

 

 

练习:

 

posted @ 2021-01-27 16:15  Master_Sun  阅读(115)  评论(0编辑  收藏  举报