过滤器,监听器,拦截器的区别
一.过滤器
过滤器Filter是实现了Servlet的javax.servlet.Filter接口,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。
用法如下;
package Filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LoginFilter implements Filter{private FilterConfig config = null; @Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain Chain) throws IOException, ServletException {// 强制类型转换 HttpServletRequest Httprequest = (HttpServletRequest)request; HttpServletResponse Httpresponse = (HttpServletResponse)response; //获取在web.xml中配置的Filter参数。//String Encoding = config.getInitParameter("encoding");// 获取web.xm设置的编码集,设置到Request、Response中 request.setCharacterEncoding(config.getInitParameter("charset")); response.setContentType(config.getInitParameter("contentType")); response.setCharacterEncoding(config.getInitParameter("charset")); // 将请求转发到目的地 Chain.doFilter(Httprequest, Httpresponse); }@Overridepublic void init(FilterConfig configParameter) throws ServletException {//当项目启动时初始化Filter。this.config = configParameter; }}
配置调用过滤器的方法。有两种:
一种是在web.xml中直接写
<filter><!-- 定义过滤器名字--><filter-name>LoginFilter</filter-name><!--过滤器包名和类名,通过这个找到指定唯一--><filter-class>Filter.LoginFilter</filter-class><!--过滤器设置的参数,比如编码格式,从这里获取一--><init-param><param-name>useSession</param-name><param-value>true</param-value></init-param><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param></filter><filter-mapping><!-- 过滤器名字--><filter-name>LoginFilter</filter-name><!-- 设置要被过滤的路径类型,过滤的机制和servlet类似。--><url-pattern>*.do</url-pattern></filter-mapping>
另一种是直接用注解形式
@WebFilter(filterName="LoginFliter",urlPatterns={"/*"})
public class LoginFilter implements Filter{
Filter里面的三个方法
init 只执行一次,在项目启动时执行。
doFilter 每一次请求或者响应,满足过滤条件可执行该方法。
destroy 项目停止或销毁时。
二.监听器
和Filter类似,监听器Listener,它是实现了Servlet的javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是: 做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。
MyServletContextListener.java package dc.gz.listeners; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.commons.dbcp.BasicDataSource; /** * Web应用监听器 */ public class MyServletContextListener implements ServletContextListener { // 应用监听器的销毁方法 public void contextDestroyed(ServletContextEvent event) { ServletContext sc = event.getServletContext(); // 在整个web应用销毁之前调用,将所有应用空间所设置的内容清空 sc.removeAttribute("dataSource"); System.out.println("销毁工作完成..."); } // 应用监听器的初始化方法 public void contextInitialized(ServletContextEvent event) { // 通过这个事件可以获取整个应用的空间 // 在整个web应用下面启动的时候做一些初始化的内容添加工作 ServletContext sc = event.getServletContext(); // 设置一些基本的内容;比如一些参数或者是一些固定的对象 // 创建DataSource对象,连接池技术 dbcp BasicDataSource bds = new BasicDataSource(); bds.setDriverClassName("com.mysql.jdbc.Driver"); bds.setUrl("jdbc:mysql://localhost:3306/hibernate"); bds.setUsername("root"); bds.setPassword("root"); bds.setMaxActive(10);//最大连接数 bds.setMaxIdle(5);//最大管理数 //bds.setMaxWait(maxWait); 最大等待时间 // 把 DataSource 放入ServletContext空间中, // 供整个web应用的使用(获取数据库连接) sc.setAttribute("dataSource", bds); System.out.println("应用监听器初始化工作完成..."); System.out.println("已经创建DataSource..."); } }
在web.xml中配置如下:
<!-- 配置应用监听器 --> <listener> <listener-class>dc.gz.listeners.MyServletContextListener</listener-class> </listener>
这样配置好了之后,以后在web应用中就可以通过ServletContext取得BasicDataSource对象,从而获取与数据库的连接,提高性能,方便使用。
二.拦截器
借鉴大神的讲解,非常详细
转:https://blog.csdn.net/reggergdsg/article/details/52962774
过滤器和拦截器的区别:
拦截器是基于java的反射机制的,而过滤器是基于函数回调。
拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
过滤器,监听器,拦截器的区别相关推荐
- JavaWeb中监听器Listener+过滤器filter+拦截器interceptor区别
JavaWeb中监听器Listener+过滤器filter+拦截器interceptor区别 如果从整个项目中看,一个servlet请求的执行过程就变成了这样context-param–>lis ...
- 过滤器-监听器-拦截器对比
1,拦截器的概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action 执行前阻止其执行,同时也提 ...
- struts2 过滤器和拦截器的区别和使用
struts2 过滤器和拦截器的区别和使用 java web 过滤器和拦截器的区别和使用 1.1 什么是拦截器: 拦截器,在AOP(Aspect-Oriented Programming) ...
- AOP--Filter使用,过滤器和拦截器的区别
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想,并不是一种具体的实现,谈到实现一般有Filter和代理模式两种常见的使用方式,Spring中的AOP也是封 ...
- Springboot过滤器和拦截器的区别
上两篇文章我们介绍了过滤器Filter和拦截器Intercepter,其功能都是对请求进行拦截并对请求过滤,本篇文章就介绍一下两者的区别 1. 过滤器和拦截器的区别 过滤器和拦截器触发时机不一样,过滤 ...
- Spring过滤器和拦截器的区别
Spring过滤器和拦截器的区别 两者的作用 过滤器: 是在javaweb中,你传入的request.response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts ...
- Java 过滤器与拦截器的区别
什么是过滤器(Filter) 过滤器,是在java web中将你传入的request.response提前过滤掉一些信息,或者提前设置一些参数.然后再传入Servlet或Struts2的 action ...
- 过滤器跟拦截器的区别
一.拦截器与过滤器的区别总结 1. 原理不同:拦截器是基于java的反射机制的,而过滤器是基于函数回调. 2. 依赖容器:拦截器不依赖与servlet容器,过滤器依赖与servlet容器. 3. 作用 ...
- 过滤器和拦截器的区别和执行顺序
一.两者的区别 1.拦截器 java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同 ...
- springBoot 2.x过滤器--监听器--拦截器
springboot 2.x过滤器 1.什么是 springboot 2.x过滤器 类似于检票员,检验游客的门票 2.springboot里的过滤器 ApplicationContextHeaderF ...
最新文章
- java动态加载配置文件
- JavaScript七种非常经典的创建对象方式
- 为什么越来越多的企业使用互联网电话(VoIP)?—Vecloud微云
- 为你的移动页面寻找一丝新意——手机互动网页项目总结(上)
- JMM中的happens-before
- 常用的函数式接口_Predicate接口练习_集合信息筛选
- 移植U-Boot.1.3.1到S3C2440和S3C2410
- 【渝粤教育】国家开放大学2018年秋季 2006T经济数学基础12 参考试题
- 第二章 Java基本语法(一)
- zap安装提示java_使用API调用进行ZAP身份验证
- java 8 java demo_Java 8 中的 Streams API Demo
- Post与Get传值读取方法
- Flex4_操作XML
- Bootstrap系列---按钮
- Lintcode 尾部的零
- 华为AI人工智能辅助宫颈癌筛查系统, 病理诊断更智能
- ❤️ 工厂模式:教你如何制造一台Huawei P50手机 ❤️
- PHP 使用用户排队机制解决网站大访问量的例子
- 986-Golang的chan数据结构
- iOS关于TestFlight的使用
热门文章
- 如何使用 Director 编写“拼图游戏”
- C++小游戏(第五弹)
- Salesforce Aura 组件
- VMware ESXi 宕机分析过程
- 计算机组成原理实验 内容,计算机组成原理实验报告
- android 编译 release版本,详细android gradle 只编译realse版本
- 配置SNAT实现共享上网: 搭建内外网案例环境 配置SNAT策略实现共享上网访问
- 甲方公司vs乙方公司
- java验证xml格式是否正确的是_java判断文件是否为xml格式的方法
- 51单片机控制小舵机