springboot控制器之过滤器、拦截器

  • 过滤器
  • 过滤器编程步骤1:创建过滤器类
  • 过滤器编程步骤2:加载过滤器
  • 过滤器编程示例: IP 黑名单
  • 拦截器
  • 拦截器编程步骤1:创建拦截器类
  • 拦截器类基本代码框架
  • 拦截器编程步骤2:创建拦截器配置类
  • 拦截器配置类基本代码框架


过滤器

◼ 过滤器(Filter)可以动态地拦截请求和响应。

◼ 应用场景:过滤敏感词汇、防止SQL注入、设置字符编码、进行URL级

别的权限访问控制、压缩响应信息等。

spring boot 过滤器记录日志 springboot怎么写过滤器_spring boot 过滤器记录日志

过滤器编程步骤1:创建过滤器类

◼ 编写 Java 类实现 Filter 接口(主要是实现 doFilter() 方法);
◼ 过滤器类使用注解 @WebFilter 标注,并配置过滤 url。

spring boot 过滤器记录日志 springboot怎么写过滤器_filter_02


Filter 接口的三个方法说明:

Filter随web应用的启动而启动, 只初始化一次, 随web应用的停止而销毁。

  1. 启动服务器时加载过滤器的实例,并调用 init() 方法来初始化实例;
  2. 每一次请求时都只调用 doFilter()方法进行处理;
  3. 停止服务器时调用 destroy() 方法,销毁实例

过滤器类基本代码框架

过滤器类基本代码框架
@WebFilter("/*") // 当前配置拦截所有请求
public class MyFilter implements Filter {
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
		if(某条件){
			//拦截处理
		}
		else{
			chain.doFilter(request, response); // 放行
		}
	}
}

过滤器编程步骤2:加载过滤器

◼ 在 Spring Boot 启动类上添加 @ServletComponentScan 注解。

spring boot 过滤器记录日志 springboot怎么写过滤器_servlet_03

过滤器编程示例: IP 黑名单

spring boot 过滤器记录日志 springboot怎么写过滤器_servlet_04

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@WebFilter("/*")
public class MyFilter implements Filter {
	//黑名单 简单模拟一下
	private List<String> IPList=new ArrayList<>();
	@Override
	public void init(FilterConfig filterConfig) throws ServletException { //过滤器初始化
		IPList.add("127.0.0.1"); // 本机地址
		IPList.add("0:0:0:0:0:0:0:1"); // IPv6 的本机地址
	}
	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws
	IOException, ServletException {
		//黑名单过滤
		String ip = servletRequest.getRemoteAddr(); // 获得客户端 ip 地址
		System.out.println(ip); //控制台上查看一下
		if( IPList.contains(ip) ){
		servletResponse.setContentType("text/html;charset=utf-8"); //设置响应的字符集(避免中文乱码)
		servletResponse.getWriter().println("你已被列入黑名单!");
		}
		else{
		filterChain.doFilter(servletRequest,servletResponse); //放行
		}
	}
}

拦截器

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

拦截器编程步骤1:创建拦截器类

编写Java类实现 HandlerInterceptor 接口(主要实现 preHandle()方法)

spring boot 过滤器记录日志 springboot怎么写过滤器_spring boot_05


HandlerInterceptor 接口的三个方法说明:

preHandle:在业务处理器处理请求之前被调用;

postHandle:在业务处理器处理请求执行完成后,生成视图之前执行;

afterCompletion:在DispatcherServlet完全处理完请求后被调用(渲染页面之后)。

spring boot 过滤器记录日志 springboot怎么写过滤器_spring boot_06

拦截器类基本代码框架

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

拦截器编程步骤2:创建拦截器配置类

◼ 编写Java类实现 WebMvcConfigurer 接口(主要实现 addInterceptors()
方法)
◼ 该类用注解 @Configuration 标注(表明是一个配置类)

拦截器配置类基本代码框架

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