Filter过滤器介绍:需要实现Filter接口
Filter可以认为是Servlet的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。
使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行预处理并生成响应,最后Filter再对服务器响应进行后处理。
Filter使用场景:
在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。
根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据。
在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
Filter配置:
在SpringBoot中的配置,自己编写类MyFilter实现Filter接口重写里边的方法,然后将该类导入FilterRegistrationBean类中:
import org.springframework.stereotype.Component;
import javax.servlet.*;
import java.io.IOException;
//自定义拦截器实现Filter接口
@Component
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//初始化:容器一启动就会调用
System.out.println("MyFilter...init......");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//在DispatcherServlet之前执行
System.out.println("MyFilter...doFilter......");
//决定是否放行,如果不设置,不会放行
filterChain.doFilter(servletRequest,servletResponse);
//在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后
System.out.println("MyFilter...doFilter之后......");
}
@Override
public void destroy() {
System.out.println("MyFilter...destroy......");
}
}
import com.yc.filter.MyFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //当前配置类
public class MyWebConfig {
@Autowired //将自定义的过滤器注入进来
private MyFilter myFilter;
//设置拦截器
@Bean
public FilterRegistrationBean initFilter(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(myFilter);
registrationBean.setName("myFilter");
registrationBean.addUrlPatterns("/*"); //对其路径进行拦截
return registrationBean;
}
}
Interceptor拦截器介绍:需要实现Interceptor接口
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截,然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
Interceptor配置:
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//自动以拦截器
@Component
public class MyInterceptor implements HandlerInterceptor {
/**
* 在controller之前执行
* */
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor....preHandle....");
return true;
}
/**
* 在controller执行之后的DispatcherServlet之后执行
* */
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor....postHandle....");
}
/**
* 在页面渲染完成返回给客户端之前执行
* */
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("MyInterceptor....afterCompletion....");
}
}
将拦截器配置在SpringBoot中,这点与Filter的配置有所不同,Interceptor需要配置类实现WebMvcConfigurer接口,然后进行配置。如下所示:
import com.yc.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
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 MyWebMVCConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry){
//添加我们的拦截器配置
//拦截所有请求
registry.addInterceptor(myInterceptor).addPathPatterns("/**");
}
}
过滤器和拦截器的区别:
过滤器可以修改request,而拦截器不能。
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法。
过滤器可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。
拦截器可以拿到你请求的控制器和方法,却拿不到请求方法的参数。
Filter是基于函数回调的,而Interceptor则是基于Java反射的。
Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。
本文详细介绍了Servlet中的Filter和Interceptor的区别与应用场景。Filter是对用户请求进行预处理和响应后处理,适用于全局处理,如登录验证、字符编码转换等。Interceptor则在AOP中用于方法访问前后的拦截,常用于权限校验、日志记录等。配置方面,Filter需实现Filter接口并在SpringBoot中注册,Interceptor需实现HandlerInterceptor接口并配置在WebMvcConfigurer。Filter与Interceptor在功能和使用上各有侧重,理解它们的不同对于优化Web应用至关重要。

2355

被折叠的 条评论
为什么被折叠?



