1.过滤器配置
自定义过滤器步骤:
1.在启动类上添加@ServletComponentScan注解进行servlet组件扫描
2.编写自定义过滤器类并实现Filter接口
3.使用@WebFilter(urlPatterns = “/user/*”)注解,注解过滤器类并表明过滤那些路径,urlPatterns 属性就是设置拦截路径范围的
拦截器代码如下:
@WebFilter(urlPatterns = "/user/*")//过滤路径user路径下的所有请求
public class Myfilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器操作");
//不能直接使用需要转换成HttpServletRequest HttpServletResponse对象
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String name = request.getParameter("name");
if ("zhangsan".equals(name)){
//如果是zhansan放行
filterChain.doFilter(servletRequest,servletResponse);
}else{
//拦截跳转到登入页面
response.sendRedirect("/login.html");
}
}
@Override
public void destroy() {
System.out.println("过滤器资源释放销毁");
}
}
Controller测试代码
@RestController
public class UserController {
Map<String,Object> map = new HashMap<>();
/**
* 测试过滤器
* @param name
* @return
*/
@GetMapping("/user/login")
public Object login(String name){
map.clear();
map.put("name",name);
return map;
}
}
测试1 name值为zhangsan放行
测试2 name值不为zhangsan跳转到login页面
2.拦截器配置
拦截器配置步骤:
步骤一:自定义拦截器
1.新建一个类使用@Component注解放到spring容器中
2.实现HandlerInterceptor接口
3.实现preHandle postHandle afterCompletion 方法具体看步骤1代码
步骤二:注册引用拦截器
1.自定义一个类 实现WebMvcConfigurer接口并 使用@Configuration注解
2.实现WebMvcConfigurer接口中的addInterceptors方法
3.在addInterceptors方法中注册自定义拦截器并进行相关配置 具体看步骤2代码
步骤一代码
@Component
public class LoginInterceptor implements HandlerInterceptor {
//在controller之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器preHandle 在controller之前执行");
String name = request.getParameter("name");
if ("zhangsan01".equals(name)){
System.out.println("拦截器拦截了"+name);
response.sendRedirect("/login.html");
return false;//若是zhangsan拦截
}
return true;//返回true放行 返回falser 拦截
}
//在controller执行之后,跳转页面之前执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器postHandle 在controller执行之后,跳转页面之前执行");
}
//所有操作完毕之后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器afterCompletion 所有操作完毕之后执行");
}
}
步骤二代码
@Configuration
public class MyMvcConfigure implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
//在此方法添加自定义拦截器
public void addInterceptors(InterceptorRegistry registry) {
//添加自定义拦截器 //拦截器拦截那些路径
registry.addInterceptor(loginInterceptor).addPathPatterns("/user/*");
//不拦截的路径
// .excludePathPatterns("");
}
}
3.拦截器与过滤器的执行顺序
过滤前->拦截前->action执行->拦截后->过滤后
4.拦截器与过滤器的区别
过滤器和拦截器非常相似,但是它们有很大的区别
最简单明了的区别就是过滤器可以修改request,而拦截器不能
过滤器需要在servlet容器中实现,拦截器可以适用于javaEE,javaSE等各种环境
拦截器可以调用IOC容器中的各种依赖,而过滤器不能
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法
区别很多,大家可以去查下
总的来说
过滤器就是筛选出你要的东西,比如requeset中你要的那部分
拦截器在做安全方面用的比较多,比如终止一些流程