介绍

拦截器(Interceptor),主要完成请求参数的解析、将页面表单参数赋给值栈中相应属性、执行功能检验、程序异常调试等工作。

具体操作步骤

拦截器功能,就是一个拦截请求(controller)前中后的操作,登录的时候,把用户信息储存在Session中,没有拦截器的话,你不登录,也可以直接访问你的主页面,添加登录拦截的话,在每个链接前先判断当前用户是否登录存入了一个Session,没有的话,就跳转到登录页面,实现了安全,这里我也是简单的判断了一下,用户是否登录了

一、实现拦截功能(Springboot通过实现HandlerInterceptor接口实现拦截器功能)

preHandle: 预先处理,在目标的controller方法执行之前,进行处理

postHandle: 在目标的controller方法执行之后,到达指定页面之前进行处理

afterCompletion: 在页面渲染之后进行处理

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 目标方法执行前
     * 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作
     * 返回 true 表示继续向下执行,返回 false 表示中断后续操作
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //查看了链接中是否存入了名为"teacherInfo"的Session,如果存在就说明已经登录了,执行放行处理
        Object loginUser = request.getSession().getAttribute("teacherInfo");
        if (loginUser == null) {
            //未登录,返回登陆页
            request.setAttribute("msg", "您没有权限进行此操作,请先登陆!");
            request.getRequestDispatcher("/").forward(request, response);
            return false;
        } else {
            //放行
            return true;
        }
    }
    /**
     * 目标方法执行后
     * 该方法在控制器处理请求方法调用之后、解析视图之前执行
     * 可以通过此方法对请求域中的模型和视图做进一步修改
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("postHandle执行{}", modelAndView);
    }
    /**
     * 页面渲染后
     * 该方法在视图渲染结束后执行
     * 可以通过此方法实现资源清理、记录日志信息等工作
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion执行异常{}", ex);
    }
}

二、注册到容器中(通过WebMvcConfigurer实现一个配置类,再通过@Configuration 注解注入到容器)

我这里使用@Autowired注解把LoginInterceptor获取到,放入了拦截器配置类中,并在/index/**(这里的**是指/index/后面的所有链接)链接中进行拦截,查看是否有Session(这里是放在LoginInterceptor中进行了判断),不拦截//static/**/index的请求

注意:如果拦截的是 /** 会拦截一切资源,包括静态资源,需要将静态资源放行 /static/**

@Configuration
public class WebConfig implements WebMvcConfigurer{
    @Autowired
    LoginInterceptor loginInterceptor;
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册自己的拦截器,并设置拦截的请求路径
        //addPathPatterns为拦截此请求路径的请求
        //excludePathPatterns为不拦截此路径的请求
        registry.addInterceptor(loginInterceptor).addPathPatterns("/index/**").excludePathPatterns("/","/static/**","/index");
    }
 
}