springboot控制器之过滤器、拦截器
- 过滤器
- 过滤器编程步骤1:创建过滤器类
- 过滤器编程步骤2:加载过滤器
- 过滤器编程示例: IP 黑名单
- 拦截器
- 拦截器编程步骤1:创建拦截器类
- 拦截器类基本代码框架
- 拦截器编程步骤2:创建拦截器配置类
- 拦截器配置类基本代码框架
过滤器
◼ 过滤器(Filter)可以动态地拦截请求和响应。
◼ 应用场景:过滤敏感词汇、防止SQL注入、设置字符编码、进行URL级
别的权限访问控制、压缩响应信息等。
过滤器编程步骤1:创建过滤器类
◼ 编写 Java 类实现 Filter 接口(主要是实现 doFilter() 方法);
◼ 过滤器类使用注解 @WebFilter 标注,并配置过滤 url。
Filter 接口的三个方法说明:
Filter随web应用的启动而启动, 只初始化一次, 随web应用的停止而销毁。
- 启动服务器时加载过滤器的实例,并调用 init() 方法来初始化实例;
- 每一次请求时都只调用 doFilter()方法进行处理;
- 停止服务器时调用 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 注解。
过滤器编程示例: IP 黑名单
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()方法)
HandlerInterceptor 接口的三个方法说明:
preHandle:在业务处理器处理请求之前被调用;
postHandle:在业务处理器处理请求执行完成后,生成视图之前执行;
afterCompletion:在DispatcherServlet完全处理完请求后被调用(渲染页面之后)。
拦截器类基本代码框架
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/*"); //不拦截的请求,如首页、静态资源等
}
}