乐趣区

关于java:024期JavaWeb面试题五Filter和Listener

开篇介绍

大家好,我是 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。

退出移动版