Java Web中的Servlet及Filter

JavaWeb的三大组件(Servlet、Filter、Listener) 前言: 之前介绍了关于JavaWeb的一些知识点。其中包括一些JavaWeb的核心内容。前几篇有对JavaWeb三大组件之一的Servlet作了一定的知识了解。因此这篇文章主要介绍JavaWeb三大组件的Servlet和Filter(过滤器)和Listenter(监听器)的知识。 Servlet 1. Servlet相关信息 1.概念: Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。运行在服务器端的小程序。 将来我们自定义一个类,实现Servlet接口,复写方法。 2 阅读详情

原文传送门:http://lib.youkuaiyun.com/article/java/63495


在Servlet到底是什么的文章中已经做了说明,下面简单说下Servlet,以便和Filter做个对比

一、Servlet

Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础。

1.1Servlet的介绍

1.2Servlet的使用

通常情况下,我们自己定义的 servlet 并不是直接去实现 javax.servlet.servlet 接口,而是去继承更简单的 HttpServlet 类或者 GenericServlet 类,我们可以有选择的覆盖相应方法去实现我们要完成的工作。

HttpServlet 类包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是继承的。

(1) init() 方法
在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。 可以 配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。 无论有多少客户机访问 Servlet,都不会重复执行 init() 。
缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法来覆盖它,典型的是管理 服务器端资源。 例如,可能编写一个定制 init() 来只用于一次装入 GIF 图像,改进 Servlet 返回 GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的 init() 方法设置了 Servlet 的初始化参数,并用它的 ServletConfig 对象参数来启动配置, 因此所有覆盖 init() 方法的 Servlet 应调用 super.init() 以确保仍然执行这些任务。在调用 service() 方法之前,应确保已完成了 init() 方法。
(2) service() 方法
service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了。
Servlet 的响应可以是下列几种类型:
一个输出流,浏览器根据它的内容类型(如 text/html)进行解释。
一个 HTTP 错误响应,重定向到另一个 URL、servlet、JSP。
(3) doGet() 方法
当一个客户通过 HTML  表单发出一个 HTTP GET 请求或直接请求一个 URL 时,doGet() 方法被调用。与 GET 请求相关的参数添加到 URL 的后面,并与这个请求一起发送。当不会修改 服务器端的数据时,应该使用 doGet() 方法。
(4) doPost() 方法
当一个客户通过 HTML 表单发出一个 HTTP POST 请求时,doPost() 方法被调用。与 POST 请求相关的参数作为一个单独的 HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用 doPost() 方法。
(5) destroy() 方法
destroy() 方法仅执行一次,即在服务器停止且卸装 Servlet 时执行该方法。典型的,将 Servlet 作为服务器进程的一部分来关闭。缺省的 destroy() 方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果 Servlet 在运行时会累计统计数据,则可以编写一个 destroy() 方法,该方法用于在未装入 Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。
当 服务器卸装 Servlet 时,将在所有 service() 方法调用完成后,或在指定的时间间隔过后调用 destroy() 方法。一个 Servlet 在运行 service() 方法时可能会产生其它的线程,因此请确认在调用 destroy() 方法时,这些线程已终止或完成。
(6) getServletConfig() 方法
getServletConfig() 方法返回一个 ServletConfig 对象,该对象用来返回初始化参数和 ServletContext。ServletContext 接口提供有关 servlet 的环境信息。
(7) getServletInfo() 方法
getServletInfo() 方法是一个可选的方法,它提供有关 servlet 的信息,如作者、版本、版权。
当 服务器调用 sevlet 的 service()、doGet() 和 doPost() 这三个方法时,均需要 “请求”和“响应”对象作为参数。“请求”对象提供有关请求的信息,而“响应”对象提供了一个将响应信息返回给浏览器的一个通信途径。
javax.servlet 软件包中的相关类为 ServletResponse 和 ServletRequest,而 javax.servlet. http 软件包中的相关类为 HttpServletRequest 和 HttpServletResponse。Servlet 通过这些对象与 服务器通信并最终与客户端通信。Servlet 能通过调用"请求"对象的方法获知客户端环境,服务器环境的信息和所有由客户机提供的信息。Servlet 可以调用“响应”对象的方法发送响应,该响应是准备发回客户端的。

web.xml配置
 <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.hhl.servlet.HelloServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

servlet实现
public class HelloServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = -468861535655735406L;

	/**
	 * Constructor of the object.
	 */
	public HelloServlet() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
//			response.setContentType("text/html");
			PrintWriter out = response.getWriter();
//			out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
//			out.println("<HTML>");
//			out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
//			out.println("  <BODY>");
			out.print("    This is ");
			out.print(this.getClass());
			out.println(", using the GET method");
//			out.println("  </BODY>");
//			out.println("</HTML>");
			out.flush();
			out.close();
		
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.print("    This is ");
		out.print(this.getClass());
		out.println(", using the POST method");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occurs
	 */
	public void init() throws ServletException {
		System.out.println("servlet init");
	}


}

1.3 说明
Servlet 的确已经能够帮我们完成所有的工作了,但是现在的 web 应用很少有直接将交互全部页面都用 servlet 来实现,而是采用更加高效的 MVC 框架(例如struts、SpringMVC)来实现。这些 MVC 框架基本的原理都是将所有的请求都映射到一个 Servlet,然后去实现 service 方法,这个方法也就是 MVC 框架的入口。


二、 Filter
Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

2.2 使用
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。简单说,就是可以实现web容器对某资源的访问前截获进行相关的处理,还可以在某资源向web容器返回响应前进行截获进行处理。

1> 通过控制对chain.doFilter的方法的调用,来决定是否需要访问目标资源。
比如,可以在用户权限验证等等。判断用户是否有访问某些资源的权限,有权限放行,没权限不执行chain.doFilter方法。
2> 通过在调用chain.doFilter方法之前,做些处理来达到某些目的。
比如,解决中文乱码的问题等等。可以在doFilter方法前,执行设置请求编码与响应的编码。甚至可以对request接口进行封装装饰来处理get请求方式的中文乱码问题(重写相应的request.getParameter方法)。
3> 通过在调用chain.doFilter方法之后,做些处理来达到某些目的。
比如对整个web网站进行压缩。在调用chain.doFilter方法之前用类A对response对象进行封装装饰,重写getOutputStream和重写getWriter方法。在类A内部中,将输出内容缓存进ByteArrayOutputStream流中,然后在chain.doFilter方法执行后,获取类A中ByteArrayOutputStream流缓存数据,用GZIPOutputStream流进行压缩下。

web.xml中配置
<filter>
		<filter-name>baseFilter</filter-name>
		<filter-class>com.mango.filter.BaseFilter</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>baseFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
实现
public class BaseFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		String context = httpRequest.getContextPath();
		request.setAttribute("CONTEXT", context);
		chain.doFilter(request, response);
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

}



2.3原理
Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。

2.4生命周期
和Servlet一样Filter的创建和销毁也是由WEB服务器负责。不过与Servlet区别的是,它是1>在应用启动的时候就进行装载Filter类(与Servlet的load-on-startup配置效果相同)。2>容器创建好Filter对象实例后,调用init()方法。接着被Web容器保存进应用级的集合容器中去了等待着,用户访问资源。3>当用户访问的资源正好被Filter的url-pattern拦截时,容器会取出Filter类调用doFilter方法,下次或多次访问被拦截的资源时,Web容器会直接取出指定Filter对象实例调用doFilter方法(Filter对象常驻留Web容器了)。4>当应用服务被停止或重新装载了,则会执行Filter的destroy方法,Filter对象销毁。
注意:init方法与destroy方法只会直接一次。
某银行大数据分析平台之云原生架构 软考架构师论文 阅读详情

相关推荐

基于Multisim设计电子密码锁

一、设计任务与要求:(可软件仿真实现)1)基本要求:设计一个数字密码锁,要求只有按正确的顺序,输入正确的密码,方能输出开锁信号,实现开锁。设置三个正确的密码键和若干个伪键,任何伪键按下后,密码锁都无法打开。每次只能接受四次按键信号,而且第四个键只能是“确定”或者“重输键”,其他无效。能显示已输入键的个数2)扩展要求:第一次密码输错后,可以输入第二次,但是连续三次输错,密码将被锁,必须按复位键才能解锁。

ablinger的博客 4417

java filter与servlet_filter与servlet的比较

最近在开java的东西,还记得刚开始使用servlet是在调试一个ajax的时候,那时候不知道如何使用,就知道写一个路径去调用,总是提示404错误,以为是相对路径与绝对路径的问题,到最后自己一点点的调通了,知道servlet是需要服务器编译运行,是需要配置web.xml的。到学习filter,发现他们的套路完全是一样的,也需要在web.xml中进行相应的配置。可以说是基本一样的,我不禁要问,他们之...

weixin_36241311的博客 741

自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之二)

具有相同电荷的电子相互排斥。结果,为了在极其拥挤的环境中相互超越,他们不得不改变自己的行为。剑桥大学和英国伯明翰大学于 2009 年 7 月发表的研究表明,电子可以通过量子隧穿从金属表面跳到相近位置的量子线上,这样做后,将分离成两个准粒子,命名为的自旋子和全子。Van den Brink、Khomskii 和 Sawatzky 在 1997-1998 年对轨道子进行了理论上的预测。在 2011 年 9 月发给出版商的论文中报告了它作为一个单独的准粒子的实验观察结果。

qq_32515081的博客 1万+

JavaWeb-servlet6中过滤器和监听器

servlet监听器也叫web监听器。是servlet中一种特殊类。能够帮助开发者监听web应用中的特定事件。比如ServletContext,ServletSession,ServletRequest的创建和销毁,变量的创建和销毁等。监听器常用的用途:统计在线人数,利用HttpSessionListener加载初始化信息:利用ServletContextListener统计网站访问量:利用ServletRequestListener。

卿着飞翔 847

systermverilog中for循环中的fork join执行情况分析

仅为本人学习记录,如有错误感谢指正!

qq_63807221的博客 1461

Windows 11 IoT企业版LTSC 24H2/25H2中文版安装指南(含OEM激活教程)

本文详细介绍了Windows 11 IoT企业版LTSC 24H2/25H2中文版的安装与OEM激活全流程。从系统镜像准备、硬件兼容性检查到自动化安装配置,再到OEM激活方案(包括SLIC注入和数字许可证激活),为工业自动化、数字标牌等物联网设备提供稳定可靠的系统部署指南。

weixin_29198045的博客 8840

JavaServlet和Filter

1.背景介绍 1. 背景介绍 Java Servlet 和 Filter 是 Java 网络应用程序开发中的重要组件,它们在处理 HTTP 请求和响应时发挥着关键作用。Servlet 是用于处理 HTTP 请求的 Java 程序,Filter 是用于处理 HTTP 请求和响应的 Java 程序,用于对请求和响应进行预处理和后处理。 在这篇文章中,我们将深入探讨 Java Servlet 和 ...

AI天才研究院 871

Ubuntu22.04+Docker一键部署Autoware Universe避坑指南(附鱼香ROS配置)

本文详细介绍了在Ubuntu22.04系统中使用Docker一键部署Autoware Universe的完整流程,包括鱼香ROS工具链配置、Docker环境优化及VSCode开发环境集成。通过实战指南帮助开发者快速搭建自动驾驶开发环境,解决常见部署问题,提升开发效率。

weixin_29254673的博客 413

java web请求三大器——listener、filter、servlet

一、servlet 1、什么是servlet Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。 2、servlet与tomcat Tomcat 是Web应用服务器,是一个Servlet/JSP容器.Tomcat 作为Servlet容器,将http请求文本...

西木风落 2297

MBIST --- PATR1.Memorybist测试原理

mem bist作为现在design设计中不可或缺的DFT设计内容,越发重要。本章节主要介绍mem bist组成部分,测试的原理以及注意事项。

sinat_27691203的博客 1万+

【WLAN】【调试】再谈如何使用Wireshark解密WiFi数据包——使用TK信息

- 本文介绍了一种wireshark使用TK信息解密空口报文的方式,该方式对是否有关联过程的报文没有要求。

一介草民,只为生活。 1187

java filter web.xml_Java中Servlet Filter配置(web.xml详解)

Java中Servlet Filter配置(web.xml详解)Java中Servlet Filter在web.xml中配置时有2个用于过滤器的元素,分别是filter和filter-mapping。filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。Filter配置过滤器元素filter元素filter元素位于部署描述符文件(web.xml)的前...

weixin_29535345的博客 525

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java Servlet Filter实现Web页面执行时间过滤器

 以下是本人在项目中用Servlet Filter实现的Web页面执行时间过滤器:package com.sunfairs.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterCo

独行者的专栏 2062

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java web—Servlet过滤器(Filter)

前言: 过滤器是Servlet中一个非常重要的组成部分,进行WEB开发时无不用到过滤器;因此这篇blog来单独总结下关于过滤器的知识点。

未完成的歌~的博客 748

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【java web】Filter Servlet Inteceptor Listener 区别与联系

一,区别 1.使用范围 Filter是Servlet中定义的,所以只能用于Web程序中; Interceptor是Spring定义的,既可以用于web程序中,也可以用于其他程序中(Application、Swing); 2.实现机制 拦截器是基于j...

engineer_hzl 225

Java Web的三大组件——Servlet\Filter\Listener

Servlet,Filter, Listener 是java web的三大组件,每个组件编写完成后都需要配置。 SpringMVC框架 : 是基于servlet实现的。 Struts2 框架: 是基于Filter实现的。 web.xml中,可以配置哪些东西? 1、Servlet 2、Filter 3、Listener 4、servletConte...

krismile__qh的博客 700

请解释Java Web中的Filter的作用和使用场景。什么是Java Web中的JSP?请解释其与Servlet的关系及各自优势。

Java Web中的Filter提供了灵活的方式来修改或增强请求和响应的数据,同时不影响Web应用程序的其他部分。通过合理设计和使用Filter,可以提高Web应用程序的安全性、可维护性和可扩展性。在实际开发中,可以根据具体需求编写自定义的Filter,并通过配置文件或注解进行配置和使用。什么是Java Web中的JSP?请解释其与Servlet的关系及各自优势。JSP(全称Java Server Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。

weixin_53180424的博客 1211

10 分钟上手 Magisk_AsoulOpt:Android 游戏线程调整 Magisk 模块完整安装指南

手机里的大型游戏掉帧、操作有延迟,很多时候不是硬件不行,而是系统给游戏线程的调度不够合理。Magisk_AsoulOpt 就是一个专门做游戏线程调整的 Magisk 模块:它只针对支持列表里的游戏优化线程分配,覆盖了不少主流大作,也收了一些小众独立游戏。这份指南按真实使用顺序走——先查你的游戏支不支持,再装模块,最后讲配置细节和排障。 ## 先弄懂:游戏线程调整到底在调什么 先说结论:它不是给

gitblog_00151的博客 696

Java Web之三 Servlet Filter Listener

一、Servlet概述 1.sun公司提供的动态web资源开发技术。本质是上一段java小程序,要求这个小程序必须实现Servlet接口,以便服务器能够调用。 *Servlet容器 -- 能够运行Servlet的环境就叫做Servlet容器. --- tomcat *web容器 -- 能够运行web应用的环境就叫做web容器 --- tomcat 2.开发Servlet的两个步骤

你今天的日积月累,早晚会成为别人的望尘莫及。 1312

java web的Servlet基础之Filter的简单使用

概念 filter,过滤器,顾名思义,即在执行相关请求时,通过过滤器可以将请求拦截,并作出处理,再对请求放行,从而达到对请求拦截能力;比如,客户端提交数据时的敏感词过滤,编码的统一过滤,登录过滤等。 Filter的实现原理 Filter创建与使用 创建类实现Filter接口 实现doFilter方法 配置Filter a. 基于注解配置(添加@WebFilter(需要过滤的内容)注解) b. 通过web.xml配置(web-app标签内添加) <filter> <f

qq_2531184499的博客 325

【Java.Web】Servlet/Filter中的 <url-pattern>

【Java.Web】Servlet/Filter中的 标签: Java Web 2014-09-27 22:59 6013人阅读 评论(2) 收藏 举报 本文章已收录于: 分类: Java.Web(66) 作者同类文章X 版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?

autumn20080101的专栏 494

java filter servlet_关于java web中Filter和Servlet的一些理解

做java web开发 无论是新手还是老手 都不可避免的要接触到filter和servlet 乃至于很多情况下都要自定义filter和servlet 他们都是有生命周期的 基本的类似初始化方法和销毁方法比较好理解 不再赘述。filter 是拦截器 过滤器的意思 当客户端发起一个请求的时候 请求信息以request对象的方法传入到服务端 在web.xml中 可以自定义很多filter ...

weixin_35683330的博客 183

Java web项目listener Filter servlet启动顺序和配置

Java web项目listener Filter servlet启动顺序和配置一、 1、启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取 和两个结点。 2、紧急着,容创建一个ServletContext(servlet上下文),这个 web项目的所有部分都将共享这个上下文。 3、容器将转换为键值对,并交给 servletContext。 ---》容器的一些常量4、容器

11点睡觉... 734

《Java Web程序设计任务教程》简要复盘:第八章 Servlet的高级特性-Filter和Listener

《Java Web程序设计任务教程》简要复盘:第八章 Servlet的高级特性-Filter和ListenerFilter 过滤器Filter 概述 作者:氯磷Rolin 目录: 第一章:网页开发基础(无) 第二章:Java Web概述 第三章:Servlet基础 第四章:请求与响应 第五章:会话及其会话技术 第六章:JSP技术 第七章:EL表达式和JSTL 第八章:Servlet的高级特性 第九章:JDBC 第十章:数据库连接池与DBUtils工具 第十一章:JSP开发模型 第十二章:文件的上传和下载

oALiKongZuo的博客 658
上一篇: Java模拟新浪微博登陆抓取数据
下一篇: jqGrid使用整理
CapsLockWY
博客等级 码龄9年 9粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值