拦截器

◼ 拦截器(Interceptor)主要用于拦截用户请求并作相应的处理。
◼ 基于Java的反射机制,属于面向切面编程(AOP)的一种运用。
◼ 应用场景:验证用户登录状态、权限验证、记录系统日志、通用处理等。


拦截器类基本代码框架

public class MyInterceptor implements HandlerInterceptor {
   
//在处理请求之前被调用。可以进行权限校验、安全控制等处理;
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception;
// 设置拦截的业务的条件
// return true; 放行(满足条件时放行,继续业务处理)
// return false; 拦截(不满足条件时,跳转到其他处理)
}

拦截器示例的目录结构

  • MyInterceptor.java
  • 加载的是 org.slf4j.Logger 包
  • Logger 类相关的包比较多,注意别加载错了

package com.example.demo.Interceptor;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyInterceptor implements HandlerInterceptor {
   
    //声明日志对象
    private final Logger log = LoggerFactory.getLogger(this.getClass());
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
   
        String ip=request.getRemoteAddr(); //获得客户端 ip 地址
        String path=request.getServletPath(); //获得客户端Servlet请求路径
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = new Date(); //获得当前系统日期时间
        String ds = sdf.format(d); //格式化date对象
        log.info("时间"+ds+":"+ip+"访问了"+path); // 日志输出
        return true; // 放行(关键点)
    }
}
  • MyWebConfig.java
package com.example.demo.config;

import com.example.demo.Interceptor.MyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration // 表明是一个配置类 不要掉了!
public class MyWebConfig implements WebMvcConfigurer {
   
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    //加载拦截器
        registry.addInterceptor( new MyInterceptor() ) //加载自定义的拦截器
                .addPathPatterns("/**") //拦截请求的路径 /** 表示所有请求
                .excludePathPatterns("/","/css/*","/images/*","/js/*"); //不拦截的请求,如首页、静态资源等
    }
}

运行结果:

IDEA控制台输出

  • 注意要把上一篇Filter里设置的黑名单注释掉~~