SpringBoot中对拦截器和过滤器的理解
2023-04-18 15:18:13 时间
1、两者的关系
2、过滤器的使用步骤
实现Filter接口,并加上@WebFilter注解
@Slf4j
// filterName 为该过滤器的名称;
// urlPatterns 对哪些url进行拦截
@WebFilter(filterName = "loginCheckFilter", urlPatterns = "/*")
public class LoginCheckFilter implements Filter { // 路径匹配器 public static final AntPathMatcher antPathMatcher = new AntPathMatcher();
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; String requestURI = httpServletRequest.getRequestURI(); log.info("拦截到请求: {}", requestURI); // 定义不需要拦截的url String[] urls = new String[]{ // 匹配目录 "/backend/page/**", };
boolean check = check(urls, requestURI); if (check){ log.info("本次拦截{}不需要处理", requestURI);
//通过filterChain.doFilter来放行请求
filterChain.doFilter(httpServletRequest, httpServletResponse); return; }
// 向页面返回相应数据 // httpServletResponse.getWriter().write(JSON.toJSONString(Result.error("NOLOGIN")));
// 重定向 httpServletResponse.sendRedirect("/backend/page/login/login.html"); } public boolean check(String[] urls, String requestURL){ for (String url : urls) { boolean match = antPathMatcher.match(url, requestURL); if(match){ return true; } } return false; } }
在启动类上加上@ServletComponentScan
@Slf4j
@ServletComponentScan
@SpringBootApplication
public class ReggieApplication {
public static void main(String[] args) {
SpringApplication.run(ReggieApplication.class, args);
}
}
3、拦截器的使用步骤
实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor { // 在目标方法执行之前执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle is running"); // false 阻止;true 放行 return true; // return HandlerInterceptor.super.preHandle(request, response, handler); } // 在目标方法执行之后,视图对象返回之前执行 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle is running"); HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } // 在流程都执行完毕后执行 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion is running"); HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
注册该拦截器
@Configuration public class InterceptorConfigurer implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 自己定义的拦截器 MyInterceptor myInterceptor = new MyInterceptor(); // 对所有目标方法都执行拦截操作 // addPathPatterns表示黑名单,excludePathPatterns表示白名单 registry.addInterceptor(myInterceptor).addPathPatterns("/**"); } }
相关文章
- Python使用tkinter组件Label显示简单数学公式
- 内网渗透之DCOM横向移动
- 以目标为导向的语义交流的共同语言——一个课程学习框架
- python爬虫前奏【成信笔记】
- HTML 5 File API:文件拖放上传功能
- 教你快速创建 Python 虚拟环境
- pyenv 实现Python多版本自由切换
- 用 Python 对 Excel文件进行批量操作
- Python - 接入钉钉机器人
- Python - 抓取 iphone13 pro 线下店供货信息并发送到钉钉机器人,最后设置为定时任务
- crontab - 解决 mac 下通过 crontab 设置了 Python 脚本的定时任务却无法运行
- [源码解析] PyTorch分布式(5) ------ DistributedDataParallel 总述&如何使用
- Python科普系列——类与方法(上篇)
- SAP对STO的交货单执行PGI,报错 -Fld selectn for mvmt type 643 acct 400020 differs
- Spring Boot 实现通用 Auth 认证的 4 种方式
- 盘点4种使用Python批量合并同一文件夹内所有子文件夹下的Excel文件内所有Sheet数据
- OushuDB 学习经验分享(三):技术特点
- Java和Python思维方式的不同之处
- Python中日志记录新技能
- 奥比中光Gemini OpenCV—Python使用