HttpServlet详解

HttpServlet详解

一,什么是HttpServlet?

1.1 概念

HttpServletJava Servlet API 的一部分,它是一个抽象类,旨在简化基于HTTP协议的web应用程序开发,通过扩展HttpServlet类,开发者可以创建处理HTTP请求(如GetPost等)的Servlet

1.2 来源

HttpServlet 是Java EE标准的一部分,由Sun Microsystem (现为Oracle Corparation)发起,并由Java社区过程维护。它是Java平台用于构建动态网站和web应用程序的核心技术之一;

1.3 作用

1.3.1 处理http请求 : HttpServlet子类可以通过覆盖doGet(),doPost(),doPut(),doDelete()等方法来处理不同的Http请求;
1.3.2: 生成Http响应: 在这些方法中,开发者可以使用HttpServletRequestHttpServletResponse对象来访问请求数据并且构造响应内容
1.3.3 生命周期管理: Servlet生命周期包括初始化(init),服务方法,以及销毁方法,这允许开发者执行必要的初始化和清理工作;
1.3.4 会话跟踪: 虽然不是直接功能,但是HttpServlet可以和HttpSession结合使用来实现用户会话管理,从而支持用户状态保持

***1.3.5 过滤器和监听器:***结合使用Servlet的过滤器和事件监听器,可以增强应用的功能,比如日志记录,权限检查等。

二,关于HttpServlet得生命周期

2.1 Sevlet的生命周期:
  1. 加载和实例化: web容器负责加载Servlet类并创建其实例
  2. 初始化(init方法): 一旦Sevlet实例被创建,容器就会调用init方法来执行任何必要的初始化工作
  3. 服务(service方法) : 这是处理客户端请求的核心部分。每当有请求到达时,容器就会调用service方法,并根据请求数据类型(GETPOST等)分发给相应的doGetdoPost等方法
  4. 销毁(destory方法) :当Servlet不在需要时,容器将调用destory方法来释放资源
2.2 Init方法何时被调用

init方法在HttpServlet生命周期中是一个重要得组成部分,它用于初始化Servlet
启动时机:

  1. 首次请求时: 如果你的Servlet没有设置在Web应用程序启动时立即加载,那么init方法将会在Servlet首次被请求时由Web容器(比如Tomcat)自动调用。这意味着,在第一个用户请求到达之前,Servelet不会进行任何初始化工作;(这种模式被称为"懒加载",它延迟了Servlet的初始化时间,减少了应用启动时的负载)
  2. Web容器启动时: 如果你希望Servlet在应用程序启动就完成初始化,而不是等待第一个请求,可以在web.xml文件中通过<load-on-startup>元素指定这一点(这里的load-on-startup标签值可以是任何正整数,数字越小表示优先级越高。如果设置为0或者不设置,则默认情况Servlet只会在首次请求时被初始化)
xml 复制代码
<servlet>
<servlet-name>sampleInitialServlet</servley-name>
<servlet-class>com.example.SampleInitializerServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
  1. 重启或者重新部署:每当web应用程序重启或者重新部署时,Servlet也会经历同样的生命周期过程,包括调用init方法进行初始化; (当你重新启动应用服务器或者重新部署应用的时候,所有已经存在的Servlet实例都会被销毁,然后根据需求重新加载)

三, Servlet的过滤器和事件监听器

3.1 Servlet过滤器

Servlet过滤器是一个对象,可以拦截请求和响应,并对他们进行预处理或后处理。通过实现javax.servlet.Filter 接口,可以定义自己的过滤逻辑。过滤器非常适合用于跨切关注点(cross-cutting concerns),如 日志记录,性能监控,认证和授权等

3.1.1 如何使用过滤器
  1. 创建过滤器,首先,需要创建一个实现了Filter接口的类,并且重写doFilter方法
java 复制代码
import javax.servlet.*;
import java.io.IOException;
public class LoggingFilter implements Filter{
 @Override
 public void init(FilterConfig filterConfig)throws ServletException{
  // 初始化过滤器时调用
}

@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{
  HttpServletRequest req=(HttpServletRequest)request;
  //在处理请求之前执行操作
  chain.doFilter(request,response); // 将请求传递给下一个过滤器或目标Sevlet
// 在处理完成请求之后操作
System.out.println("longging Respons");
}
@Override
public void destory(){// 摧毁过滤器时调用}
}
  1. 配置过滤器 过滤器需要在web.xml 中配置,或者如果使用的是注解,则可以直接在过滤器类上添加注解
  • 使用web.xml配置
xml 复制代码
<filter>
<filter-name>loggingFilter</filter-name>
<filter-class>com.example.LoggingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loggingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
  • 使用注解
java 复制代码
@WebFilter("/*")
Public class LoggingFilter implements Filter{...}
3.2 事件监听器

Servlet事件监听器 允许你在特定的事件发生时执行代码。这些事件包括 SevletContext, HttpSessionServletRequest的创建,销毁,和属性的变化等。通过实现响应的监听器接口,就可以监听并且响应这些事件

3.2.1 如何使用监听器
  1. 创建监听器类
    创建一个实现了响应监听器接口的类,如,如果你想监听会话的创建,可以实现HttpSessionListener接口:
java 复制代码
import javax.servlet.http.HttpSessionEvent;
import javax.sevlet.http.HttpSessionListener;
public class SessionCounterLister implements HttpSessionListener{
private static int totalActiveSession;
public static int getTotalActiveSessions(){
return totalActiveSessions;
}
@Override
public void sessionCreated(HttpSessionEvent se){
 totalActiveSessions++;
 System.out.println("Session Created: total active sessions:"+ totalActiveSessions );
}
@Override
public void sessionDestroyed(HttpSessionEvent se){
 totalActiveSession--;
 System.out.println("Session Destoryed: total active session:"+ totalActiveSessions);
}
} 
  1. 配置监听器 同样需要在web.xml中配置或者使用注解
  • 使用web.xml配置
xml 复制代码
<listener>
 <listener-class>com.example.SessionCounterListener</listener-class>
<listener>
  • 注解
java 复制代码
@WebListener
public class SessionCounterListener implements HttpSessionListener{...}

四, 过滤器和拦截器区别

虽然过滤器和拦截器都可以处理请求前后的逻辑,如权限校验,日志记录等,但是他们在实现机制,配置方式和应用场景上存在一些差异

4.1 实现机制
  • 过滤器(Filter
    • 是sevlet规范的一部分,基于javaEE 标准
    • 需要实现javax.servlet.Filter接口,并且通常通过web.xml文件或注解进行配置
    • 可以在请求到达Servlet之前或者响应返回给客户端之前执行代码。
    • 主要作用于请求的预处理和后处理,能直接访问HttpServletRequestHttpServletResponse对象
  • 拦截器(Interceptor
    • 主要存在于Spring框架中,是Spring MVC的一部分
    • 需要实现 org.springframework.web.sevlet.HandlerInterceptor接口
    • 拦截器围绕这控制器(Controller)方法调用,可以由选择的在请求处理的不同阶段(如 preHandlepostHandleafterCompletion等)进行拦截
    • 更适合处理业务逻辑层面上的操作,不如权限控制,事务管理等
4.2 应用场景
  • 过滤器 更适合用于需要对所有进入应用的Http请求进行统一的处理场景。入 字符编码设置,日志记录,安全检查等。由于其工作在更底层的位置,所以它可以影响到整个web应用程序的所有请求。
  • 拦截器则更适用于针对特定的Controller或者Handler方法进行处理的情况,特别是在Spring MVC环境中,它允许你根据不同的URL模式或者具体的handle方法来决定是否执行某些逻辑,从而提高更高的灵活性
4.3 使用便捷性
  • 过滤器需要更多的配置工作,特别是当涉及到多个过滤器时,可能还需要考虑过滤器链的顺序问题
  • 拦截器在Spring框架内使用起来相对更加直观,尤其是当你已经使用spring boot 这样的快速开发框架时,只需要简单的第一一个类并注册为Bean即可;
相关推荐
LeonNo113 小时前
Gentleman:优雅的Go语言HTTP客户端工具包
开发语言·http·golang
Мартин.3 小时前
[Meachines] [Easy] Horizontall Strapi RCE+KTOR-HTTP扫描+Laravel Monolog 权限提升
网络协议·http·laravel·ctf
天线枫枫4 小时前
QT- HTTP + JSON(还需完善)
c++·qt·http
Cedric_Anik7 小时前
HTTP和HTTPS详解
网络协议·http·https
7yewh8 小时前
嵌入式知识点总结 网络编程 专题提升(二)-HTTP/IP
网络·arm开发·物联网·网络协议·http·硬件工程
菠菠萝宝9 小时前
【Java八股文】08-计算机网络面试篇
java·计算机网络·http·面试·https·udp·tcp
qincjun10 小时前
HTTP入门
网络·网络协议·http
小羊在奋斗11 小时前
【Linux】序列化、守护进程、应用层协议HTTP、Cookie和Session
linux·运维·http
黑客呀11 小时前
HTTP与网络安全
网络协议·web安全·http
m0_7482368311 小时前
Nginx中$http_host、$host、$proxy_host的区别
运维·nginx·http