1. Filter的使用
  • 拦截user下的所有请求
@WebFilter("/user/*")
public class UserFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest)servletRequest;
HttpSession session = req.getSession();
if(session.getAttribute("user") != null){
//已登录
//放行
filterChain.doFilter(servletRequest,servletResponse);
}else {
req.setAttribute("msg","此操作需要登录,请先登录");
req.getRequestDispatcher("/index.jsp").forward(req,servletResponse);
}
}
@Override
public void destroy() {
}
}
  1. Interceptor的使用
  • 实现HandlerInterceptor接口
public class MyFirstInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("first preHandle");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("first postHandle");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("first afterCompletion");
}
}
  • 配置拦截器
<!--拦截器配置-->
<mvc:interceptors>
<!--配置某个拦截器-->
<bean class="com.xj.controller.MyFirstInterceptor"></bean>
!或!
<!--配置某个拦截器更详细的信息-->
<!--<mvc:interceptor>-->
<!--<mvc:mapping path="test01"/>-->
<!--<bean class="com.xj.controller.MyFirstInterceptor"></bean>-->
<!--</mvc:interceptor>-->
</mvc:interceptors>
  1. 1.拦截器正常流程
  • 拦截器的preHandle->目标方法->拦截器postHandle->页面->拦截器的afterCompletion;
  1. 2.拦截器其他流程
  • 只要preHandle不放行就没有以后的流程;
  • 只要放行了,afterCompletion都会执行;
  1. 3.异常流程
  • 哪一块不放行从此以后都没有;

    例如:MySecondInterceptor不放行;但是他前面已经放行了的拦截器(MyFirstInterceptor)的afterCompletion还是会执行;

总结:

拦截器的preHandle :是按照顺序执行

拦截器的postHandle :是按照逆序执行

拦截器的afterCompletion :是按照逆序执行;

已经放行了的拦截器的afterCompletion总会执行;


  1. 什么时候用Filter什么时候用拦截器?

    如果某些功能,需要其他组件配合完成,我们就使用拦截器;例如拦截前查询数据库数据,可以再拦截器中@autowired自动注入mapper查数据

    其他情况可以写filter :

Filter和Interceptor的更多相关文章

  1. servlet/filter/listener/interceptor区别与联系

    转自:http://www.cnblogs.com/doit8791/p/4209442.html servlet.filter.listener是配置到web.xml中(web.xml 的加载顺序是 ...

  2. 非spring组件servlet、filter、interceptor中注入spring bean

    问题:在filter和interceptor中经常需要调用Spring的bean,filter也是配置在web.xml中的,请问一下这样调用的话,filter中调用Spring的某个bean,这个be ...

  3. Filter、Interceptor、Aspect 区别及实现

    Fliter 过滤器 请求在到达Controller之前进行与返回去之后 调用 入参为 reuqest,response,chian,过滤器获取不了具体调用哪一个类,哪一个方法. 实现: 1.继承 F ...

  4. 过滤器和拦截器filter和Interceptor的区别

    1.创建一个Filter过滤器只需两个步骤 创建Filter处理类 web.xml文件中配置Filter 2.Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的 ...

  5. 【转】servlet/filter/listener/interceptor区别与联系

    原文:https://www.cnblogs.com/doit8791/p/4209442.html 一.概念: 1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台 ...

  6. Filter,Interceptor和Aspect

    过滤器使用的主要是反射 :拦截器使用的主要是回调 :AOP使用的主要是动态代理. 一个请求过来 ,先进行过滤器处理,看程序是否受理该请求.过滤器放过后, 程序中的拦截器进行处理,处理完后进入被AOP动 ...

  7. Spring 梳理 - filter、interceptor、aop实现与区别 -第一篇

    前言 项目中我们经常需要对RESTful api进行拦截,主流实现方法有filter.interceptor.aop,先说一下他们各自的实现. Filter AnimalFilter实现javax.s ...

  8. spring boot 拦截 以及Filter和interceptor 、Aspect区别

    一.通过Filter这个大家很熟悉了吧,这是java规范的一个过滤器,他会拦截请求.在springboot中一般有两种配置方式.这种过滤器拦截并不知道你用的是哪一个Controller处理也不知道你用 ...

  9. [转]web.xml中servlet ,filter ,listener ,interceptor的作用与区别

    原文链接:https://blog.csdn.net/netdevgirl/article/details/51483273 一.概念: 1.servlet:servlet是一种运行服务器端的java ...

  10. servlet filter listener interceptor 知识点

    这篇文章主要介绍 servlet filter listener interceptor 之 知识点.博文主要从 概念,生命周期,使命介绍其区别.详情如下:   概念 生命周期 使命 servlet ...

随机推荐

  1. WPF日积月累之文件监测与DataGrid指定Row的颜色

    一.概述 关于DataGrid指定Row的颜色,我们可以使用转换器和DataGridRow的Style来实现.对于文件的检测,我们可以使用FileSystemWatcher来实现. 二.Demo Co ...

  2. [SWMM]模型子汇水区划分的几种方法

    子汇水区的划分是SWMM模型建模的主要步骤之一,划分的好坏对结果精度有比较大的影响.概括来讲,子汇水区的划分有以下几种思路: (1)根据管网走向.建筑物和街道分布,直接人工划分子汇水区.这个方法适用于 ...

  3. java包装类注意点

    Integer one = new Integer(100); Integer two = new Integer(100); Integer three = 100; Integer fore = ...

  4. RabbitMQ(二):交换机

    前言 学习自bili尚硅谷-RabbitMQ 发布确认 之前的消息应答,队列持久化是为了保证 -> 消息从rabbitmq队列到消费者的过程中不会丢失:消息持久化则是为了保证 -> 消息从 ...

  5. 谷歌api 二维码生成 实例

    谷歌提供的二维码生成器接口,非常实用!分享给大家 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  6. JavaScript高级程序设计(读书笔记)之函数表达式

    定义函数的方式有两种:一种是函数声明,另一种就是函数表达式. 函数声明的一个重要特征就是函数声明提升(function declaration hoisting),意思是在执行代码前会先读取函数声明. ...

  7. DNS重新绑定攻击

    来自微信外挂的安全风险 DNS重新绑定攻击 DDNS 动态域名设置

  8. android http get

    Executors.newSingleThreadExecutor().execute{ val uri = "https://www.cnblogs.com/hangj" val ...

  9. vue引用 element-ui 的 el-aside -> el-menu -> el-menu-item 路由侧边栏跳转链接,接上动态路由

    npm 下载 npm i element-ui -S Vue main.js //引入element-ui的包 import ElementUI from 'element-ui';   //引入el ...

  10. 剑指 Offer 33. 二叉搜索树的后序遍历序列

    剑指 Offer 33. 二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. ...