共计 1893 个字符,预计需要花费 5 分钟才能阅读完成。
开篇介绍
大家好,我是 Java 最全面试题库
的提裤姐,明天这篇是 JavaWeb 系列的第五篇,次要总结了 JavaWeb 中 Filter 和 Listener
相干的问题,在后续,会沿着第一篇开篇的常识线路始终总结上来,做到日更!如果我能做到百日百更,心愿你也能够跟着百日百刷,一百天养成一个好习惯。
什么是过滤器?
定义::
依赖于 servlet 容器;
在实现上 基于函数回调
,能够对简直所有申请进行过滤;
毛病是一个过滤器实例只能在容器初始化时调用一次;
作用 :
用来做一些过滤操作,获取咱们想要获取的数据:
在过滤器中批改字符编码;
在过滤器中批改 HttpServletRequest
的一些参数,包含:过滤低俗文字、危险字符等。
什么是监听器?
定义::
实现了 javax.servlet.ServletContextListener
接口的服务器端程序;
随 web 利用的启动而启动;只初始化一次;
随 web 利用的进行而销毁;
作用::
做一些初始化的内容增加工作、设置一些根本的内容、比方一些参数或者是一些固定的对象等等。如 SpringMVC
的监听器 org.springframework.web.context.ContextLoaderListener
,实现了SpringMVC 容器的加载
、Bean 对象创立
、DispatchServlet 初始化
等。
什么是拦截器?
依赖于 web 框架,在 SpringMVC 中就是依赖于 SpringMVC 框架;
在实现上基于 Java 的反射机制,属于面向切面编程(AOP)的一种使用;
毛病是只能对 controller 申请进行拦挡,对其余的一些比方间接拜访动态资源的申请则没方法进行拦挡解决;
因为拦截器是基于 web 框架的调用,因而能够应用 Spring 的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个 controller 生命周期之内能够屡次调用。
过滤器和拦截器的区别?
拦截器 | 过滤器 |
---|---|
基于 Java 反射机制 | 基于函数回调 |
不依赖 Servlet 容器 | 依赖 Servlet 容器 |
只能对 action 起作用 | 简直对所有申请起作用 |
能够拜访 action 上下文,值栈里的对象 | 能够拜访 action 上下文,值栈里的对象 |
在 Action 生命周期中,拦截器能够屡次被调用 | 过滤器只能在容器初始化时被调用一次 |
拦截器不能批改 request | 过滤器能够批改 request |
拦截器能够调用 IOC 容器中的各种依赖 | 过滤器不能调用 IOC 容器中的各种依赖 |
拦截器能够具体到每个办法 | 过滤器只能在申请的前后应用 |
过滤器次要是过滤出要的货色,如 requeset 中的信息;拦截器在做平安方面用的比拟多,比方终止一些流程
Servlet 与 Filter 的区别?
Filter 是一种特地的 Servlet,它们的作用是齐全不一样的。
Servlet 是用来解决申请的,而 Filter 是用来过滤查看申请的。
web.xml 的作用?
用于配置 Web 利用的相干信息
如:监听器(listener)、过滤器(filter)、Servlet、相干参数、会话超时工夫、平安验证形式、谬误页面等。
filter 的生命周期?
- 启动服务器时加载过滤器的实例,并调用
init()
办法来初始化实例; - 每一次申请时都只调用办法
doFilter()
进行解决; - 进行服务器时调用
destroy()
办法,销毁实例。
须要实现
javax.servlet
包的 Filter 接口的三个办法init()
、doFilter()
、destroy()
什么是 servlet?
servlet 是运行在 web 服务器中的小型 java 程序,通常通过 HTTP 协定承受和相应来自 web 客户端的申请。
- Servlet 对像,由 Servlet 容器创立。通常这个容器就是 tomcat。
- Servlet 是一个接口:位于 javax.servlet 包中。
Servlet 的生命周期?
servlet 被实例化后,调用 init 办法。申请达到时,运行 service()办法,调用 doGet()、doPost()等办法。当服务器决定将实例销毁时调用 destroy()办法。
init()
:第一次申请资源的时候,执行且只执行一次
init 办法。service()
:第二次往后,执行 service 办法,执行屡次
。在这个办法外部,依据申请形式的不同,进而持续调用不同的 doGet 和 doPost 办法。destory()
:当 Servlet 服务器失常敞开时,执行 destroy 办法,只执行一次
。
Servlet 和 CGI 的区别?
Servlet 通过多线程的形式运行 service 办法,一个实例能够服务于多个申请,并且实例个别不会被销毁。而 CGI 对每个申请都产生新的过程,服务实现后就销毁,所以效率上低于 Servlet。