有小伙伴使用spring boot开发多年,但是对于过滤器和拦截器的主要区别依然傻傻分不清。今天就对这两个概念做一个全面的盘点。
定义与作用范围
- 过滤器(Filter):过滤器是一种可以动态地拦截、处理和响应HTTP请求和响应的对象。它基于Servlet规范,可以拦截所有到达Web应用的请求,包括静态资源(如HTML、CSS、JavaScript文件等)和动态资源(如Servlet、JSP页面等)。过滤器主要用于请求的预处理和响应的后处理,如字符编码处理、URL访问记录等。
- 拦截器(Interceptor):拦截器是Spring MVC框架中的一部分,它基于Spring框架的AOP(面向切面编程)思想。它主要拦截Controller层的方法调用,不会拦截对静态资源的请求。拦截器主要用于在请求处理的不同阶段(如请求进入控制器方法之前或之后)执行额外的逻辑操作,如权限检查、接口日志记录、异常处理等。
过滤器实例
定义过滤器:实现javax.servlet.Filter接口,并重写doFilter方法。
注册过滤器:通过@WebFilter注解自动注册,或者使用FilterRegistrationBean在Spring配置类中注册。
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class SimpleCORSFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with, Content-Type");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
}
@Override
public void init(FilterConfig filterConfig) {}
@Override
public void destroy() {}
}
上面代码定义了一的跨域资源共享(CORS)过滤器,用于处理跨域请求。它设置了允许的源、方法和头部,并处理预检请求,这个在开发中经常用到。
拦截器实例
定义拦截器:实现HandlerInterceptor接口,并重写preHandle方法。
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 获取用户信息,进行身份验证
// ...
// 如果用户未登录或权限不足,返回false并设置响应状态
if (!isUserAuthenticated(request)) {
response.setStatus(HttpServletResponse.FORBIDDEN);
return false;
}
// 用户已登录且权限足够,放行请求
return true;
}
}
注册拦截器:在Spring配置类中注册拦截器,并指定拦截的路径和顺序。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor).addPathPatterns("/**").excludePathPatterns("/login");
}
}
上面代码主要实现一个权限检查拦截器,用于在请求进入控制器方法之前进行身份验证。
总结
作用范围
- 过滤器拦截所有到达Web应用的请求(包括静态资源和动态资源)
- 拦截器主要拦截Controller层的方法调用,不拦截静态资源
操作对象
- 过滤器只能对请求(request)和响应(response)进行操作
- 拦截器可以对请求(request)、响应(response)、处理器(handler)、模型视图(modelAndView)、异常(exception)等进行
每天一个小知识,每天进步一点点!!!
喜欢这类文章,请关注、点赞、收藏、转发,谢谢!!!
本文暂时没有评论,来添加一个吧(●'◡'●)