在项目的开发中,在某些情况下,我们需要对客户端发出的请求进行拦截,常用的API拦截方式有Fliter,Interceptor,ControllerAdvice以及Aspect。

请求从Filter-->>Controller的过程中,只要在指定的环节出现异常,可以通过对应的机制进行处理。反之在任何一个环节如果异常未处理则不会进入下一个环节,会直接往外抛,例如在ControllerAdvice验证发生异常则会抛给Filter,如果Filter未处理,则最终会由Tomcat容器抛出。

过滤器:Filter

可以获得Http原始的请求和响应信息,但是拿不到响应方法的信息。
注册Filter,在springboot当中提供了FilterRegistrationBean类来注册Filter

示例

/*** 检查用户是否已经完成登录*/
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
@Slf4j
public class LoginCheckFilter implements Filter{//路径匹配器,支持通配符public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;//1、获取本次请求的URIString requestURI = request.getRequestURI();// /backend/index.htmllog.info("拦截到请求:{}",requestURI);//定义不需要处理的请求路径String[] urls = new String[]{"/employee/login","/employee/logout","/backend/**","/front/**"};//2、判断本次请求是否需要处理boolean check = check(urls, requestURI);//3、如果不需要处理,则直接放行if(check){log.info("本次请求{}不需要处理",requestURI);filterChain.doFilter(request,response);return;}//4、判断登录状态,如果已登录,则直接放行if(request.getSession().getAttribute("employee") != null){log.info("用户已登录,用户id为:{}",request.getSession().getAttribute("employee"));filterChain.doFilter(request,response);return;}log.info("用户未登录");//5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));return;}/*** 路径匹配,检查本次请求是否需要放行* @param urls* @param requestURI* @return*/public boolean check(String[] urls,String requestURI){for (String url : urls) {boolean match = PATH_MATCHER.match(url, requestURI);if(match){return true;}}return false;}
}

最后在Springboot主启动类中添加@ServletComponentScan

@Slf4j
@SpringBootApplication
@ServletComponentScan //使用过滤器需加此注解
public class ReggieApplication {public static void main(String[] args) {SpringApplication.run(ReggieApplication.class,args);log.info("项目启动成功...");}
}

拦截器:Interceptor

可以获得Http原始的请求和响应信息,也拿得到响应方法的信息,但是拿不到方法响应中的参数的值。
在web开发中,拦截器是经常用到的功能。它可以帮我们验证是否登陆、预先设置数据以及统计方法的执行效率等。在spring中拦截器有两种,第一种是HandlerInterceptor,第二种是MethodInterceptor。HandlerInterceptor是SpringMVC中的拦截器,它拦截的是Http请求的信息,优先于MethodInterceptor。而MethodInterceptor是springAOP的。前者拦截的是请求的地址,而后者是拦截controller中的方法

拦截器特点

1.请求到达经过拦截器,响应回来也经过拦截器
2.只能拦截控制器相关请求不能拦截JSP请求
3.拦截器可以中断用户请求轨迹

拦截器作用

将多个控制器中共有代码放入拦截器可以减少控制器代码冗余

springmvc中开发拦截器步骤

1.实现HandlerInterceptor接口(或继承其实现类)或者实现实现WebRequestInterceptor(或继承其实现类)。
2.XML文件中配置拦截器

创建一个拦截器实现HandlerInterceptor接口

package wmq.fly.mybatis.interceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Component
public class LoginInterceptor implements HandlerInterceptor {/*** 预处理回调方法,实现处理器的预处理* 返回值:true表示继续流程;false表示流程中断,不会继续调用其他的拦截器或处理器*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("开始拦截.........");//业务代码return false;}/*** 后处理回调方法,实现处理器(controller)的后处理,但在渲染视图之前* 此时我们可以通过modelAndView对模型数据进行处理或对视图进行处理*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// TODO Auto-generated method stub}/*** 整个请求处理完毕回调方法,即在视图渲染完毕时回调,* 如性能监控中我们可以在此记录结束时间并输出消耗时间,* 还可以进行一些资源清理,类似于try-catch-finally中的finally,* 但仅调用处理器执行链中*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {// TODO Auto-generated method stub}}

Springboot:拦截器和过滤器相关推荐

  1. SpringBoot 拦截器和过滤器

    拦截器和过滤器 时光飞逝,最近也是很忙,但是忙到最后发现在自己并没有太多的成长 工作 学习 生活 没想到成长是不经意间的,像是被 推着,让你身不由己 午休时间,写写博客,也是保留一些自己的时间和空间 ...

  2. springboot拦截器和过滤器的区别与使用

    拦截器与过滤器的区别 spring的拦截器与servlet的filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查.日志记录等,不同的是: 适用范围不同:filter是servle ...

  3. 区分Java拦截器和过滤器

    今天带大家分析java拦截器和过滤器的区别,文中有非常详细的解释说明,对正在学习java的小伙伴们有很好的帮助,需要的朋友可以参考下 一.过滤器(filter) 过滤器处于客户端与Web资源(Serv ...

  4. 拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别

    转自:https://www.cnblogs.com/shangc/p/5939708.html 拦截器和过滤器之间有很多相同之处,但是两者之间存在根本的差别.其主要区别为以下几点: 1)拦截器是基于 ...

  5. struts2中拦截器和过滤器的比较

    拦截器和过滤器的区别: 1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而 ...

  6. 【SpringMVC】拦截器和过滤器

    拦截器: 拦截器是springmvc中的一种,需要实现HandlerInterceptor接口. 拦截器和过滤器类似,功能方向侧重点不同. 过滤器是用来过滤器请求参数,设置编码字符集等工作. 拦截器是 ...

  7. 关于SSM框架设置拦截器和过滤器

    我们知道拦截器和过滤器都是在项目中起到拦截过滤请求的功能,所以可能在设置的时候会傻傻分不清.这里我们先来比较它们的区别. 过滤器Filter是JavaEE标准,在Servlet的规范中定义的,是Ser ...

  8. 详解拦截器和过滤器的区别

    拦截器和过滤器的区别 过滤器和拦截器的区别: ①拦截器是基于java的反射机制的,而过滤器是基于函数回调. ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器. ③拦截器只能对acti ...

  9. java 拦截器和过滤器的区别

    介绍 在 Java Web 应用程序中,拦截器和过滤器是两种不同的机制,用于在请求/响应处理过程中进行拦截和过滤.两者都可以用来在请求到达目标资源之前对其进行预处理.修改或拦截. 但是,拦截器和过滤器 ...

  10. 拦截器和过滤器有什么区别?

    首先了解什么是过滤器什么是拦截器 ①过滤器(Filter) 过滤器通过直接实现Filter接口实现,也可以通过@WebFilter注解实现特定的URL拦截 在Filter接口中定义了三个方法: ini ...

最新文章

  1. centeros7网络服务无法启动_Linux网络服务02——DHCP原理与配置
  2. 云原生背景下故障演练体系建设的思考与实践—云原生混沌工程系列之指南篇
  3. pandas库Series使用和ix、loc、iloc基础用法
  4. cpu风扇声音大_电脑嗡嗡响,换个大尺寸的CPU风扇,世界一下子安静了
  5. 网页静态服务器-3-使用类
  6. PHPstorm内存不足
  7. vue.js+flask+element-ui简易Demo 气势的信心
  8. 利用XML文件的一个写日志的类!!!!!
  9. 向量交点坐标公式_高中数学必修1-5常用公式(定理)
  10. 聚类分析 matlab
  11. wince植入胎压监测_【精】创酷一个月实际用车感受+轻松解决仪表盘失灵问题+胎压监测...
  12. Foxmail发送邮件,发送邮件工具类
  13. 研究发现多种精神疾病和肠道微生物群的紊乱有关
  14. 剑英陪你玩转图形学(一)打通任督二脉
  15. 电能计量芯片应用心得之选型篇
  16. MMORPG的常规技能系统
  17. 服务器、存储和网络设备介绍
  18. 2018中小企业终端管理行业趋势报告
  19. 计算机联锁的64D半自动闭塞,64d半自动闭塞—本科毕业设计(论文).doc
  20. LabVIEW 读取 tdms文件并存为csv

热门文章

  1. IDEA 快速返回上次查看代码的位置常用的IDEA快捷键(持续更新)
  2. 视图库——公安视频侦查数据处理应用中心
  3. 解决Echarts使用tab切换时只显示第一个tab中图表,其他tab中图表不显示或显示不全问题
  4. violate关键字
  5. WebView获取当前网页的页面元素
  6. TDH添加自定义参数
  7. JVM进阶(十二)——JAVA 可视化分析工具
  8. 清明自习-部分知识整理
  9. android安全问题(八)伪造短信(利用原生android4.0漏洞)
  10. html表单验证spry,Spry验证表单教案