参考博客: https://blog.csdn.net/yudiandemingzi/article/details/80399971
过滤器和拦截器的区别:
1、过滤器只在servlet前后起作用
2、拦截器使用的是aop思想,动态代理等方式实现
3、过滤器能做的事拦截器都能做,二拦截器做的事过滤器不一定做的了。
一、过滤器
1、在启动类上加上
@ServletComponentScan // 扫描servlet
2、创建自定义过滤器
package com.msb.filterandlistrer.filtertest;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/** 过滤器测试
* @author LiuShanshan
* @version V1.0
* @Description
*/
@Order(1) // order里面的值越低,越先执行
@WebFilter(urlPatterns = "/api/filter/*", filterName = "FilterDemo1")
public class FilterDemo1 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("请求拦截中=====================================");
}
@Override
public void destroy() {
// 容器销毁的时候执行
System.out.println("拦截器销毁=======================");
}
}
3、controller 调用接口,会被servlet中filter中doFilter拦截
二、拦截器(可用于登录、日志、通用处理)
参考博客:https://www.cnblogs.com/zktww/p/11550891.html
1、拦截器
package com.msb.filterandlistrer.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;
/** 拦截器处理demo1
* @author LiuShanshan
* @version V1.0
* @Description
*/
public class InterceptorDemo1 implements HandlerInterceptor{
// 处理controller请求之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器,调用请求之前执行=======================");
return false;
}
// 处理controller之后,生成视图之前
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("拦截器,生成视图之前执行--------------------------");
}
// 处理controller之后
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("拦截器,调用接口结束执行@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
}
}
2、写拦截器的配置类
package com.msb.filterandlistrer.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/** 拦截器配置类
* @author LiuShanshan
* @version V1.0
* @Description
*/
@Configuration
public class LoginConfig implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册拦截器
InterceptorRegistration registration = registry.addInterceptor(new InterceptorDemo1());
// 所有路径被拦截(被拦截,就会经过拦截器里面的方法)
registration.addPathPatterns("/**");
System.out.println("========================拦截器启动=======================");
// 添加白名单(不会经过拦截器)
registration.excludePathPatterns("你的登陆路径", //登录
"/**/*.html", //html静态资源
"/**/*.js", //js静态资源
"/**/*.css", //css静态资源
"/**/*.woff",
"/**/*.ttf");
}
}
3、这样只要你使用web请求,都会进过拦截器