SpringMVC中拦截器的学习

我们实际中会有这样的需求,当我们浏览页面时,有些信息必须在登录后才可以看到,如果你直接访问那些需要用户登录后才可以看到的url,会自动返回登录界面让你登录,这里我们使用拦截器来实现这种功能

一.自定义拦截器

  • 自定义的话,就要实现HandlerInterceptor接口
  • 第一步书写类Myintercepter实现类:
  • 这里需要注意几点
第一点实现的接口没有实现方法,需要我们自己写
请求处理前的方法public boolean preHandle(){}
请求处理后的方法public void postHandle(){}
请求提交后的方法public void afterCompletion(){}
第二点上面三个方法的执行顺序就是从上到下
package com.offcn.intercepter;

import com.sun.javafx.geom.transform.GeneralTransform3D;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class Myintercepter implements HandlerInterceptor {
    @Override
    //预处理:请求处理前
    public boolean preHandle(HttpServletRequest request,
                              HttpServletResponse response,
                              Object handler){

        //1.获取session中存储的用户信息
        HttpSession session=request.getSession();

        //2.判断用户输入的请求路径是否包含需要登录才可以浏览的路径
        if (request.getRequestURI().indexOf("main")>0){
             //3.判断用户是否登录,这里简单使用一个字符串来当做用户信息
            if (session.getAttribute("name")!=null){
                //此时说明用户登录了,可以放行,让其访问这个url
                return true;
            } else {
                //否则拦截下来
                return false;
            }
        }
        //返回值代表是否放行
        return true;
    }

    @Override
    //后处理:请求处理后
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("postHandle方法执行");
    }

    @Override
    //后处理:请求提交后
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("afterCompletion方法执行");
    }
}

  • 写完之后就需要往容器中添加

在这里插入图片描述

 <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.offcn.intercepter.Myintercepter"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

二.拦截器链的设置

  • 上面我们说过拦截器是可以有很多的,而拦截器可以组成拦截器链,这样可以层层进行筛选拦截
  • 第一步,书写两个拦截器实现类Myintercepter1和Myintercepter2
package com.offcn.intercepter;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class Myintercepter1 implements HandlerInterceptor {
    @Override
    //预处理:请求处理前
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler){
        System.out.println("拦截器1的prehandle方法");
        return true;
    }

    @Override
    //后处理:请求处理后
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("拦截器1的postHandle方法执行");
    }

    @Override
    //后处理:请求提交后
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("拦截器1的afterCompletion方法执行");
    }
}
package com.offcn.intercepter;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

public class Myintercepter2 implements HandlerInterceptor {
    @Override
    //预处理:请求处理前
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler){
        System.out.println("拦截器2的prehandle方法");
        return true;
    }

    @Override
    //后处理:请求处理后
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("拦截器2的postHandle方法执行");
    }

    @Override
    //后处理:请求提交后
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("拦截器2的afterCompletion方法执行");
    }
}

  • 第二步:去容器中配置:

在这里插入图片描述

  • 查看执行顺序:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值