Servlet进阶
文章目录
- Cookie 对象
- 简介
- 创建、发送与获取
- 到期时间设置
- 路径设置
- 注意点
- HttpSession 对象
- 介绍与 JSESSIONID
- Session 域对象
- Session 对象的销毁
- ServletContext 对象
- 对象获取与常用方法
- 三大域对象对比
- 文件上传与下载
- 文件上传
- 文件下载
- 过滤器(Filter)
- 核心定义
- 核心特性
- 实现步骤
- 经典实例
- 请求乱码处理
- 用户非法访问拦截
- 监听器(Listener)
- 核心定义
- 分类
- 实现步骤
- 经典实例:在线人数统计
Cookie 对象
简介
- 浏览器端存储技术, Cookie 是服务器端保存在客户端的信息,下次请求时带回服务器,用于记住密码、跟踪会话等
- 格式:键值对用 “=” 连接,多个键值对用 “;” 分隔,存储在客户端,安全性较差
创建、发送与获取
- 创建与发送:
Cookie cookie = new Cookie("key", "value"); response.addCookie(cookie); - 获取:
Cookie[] cookies = request.getCookies();,遍历数组通过getName()和getValue()获取键值(需判断数组非空)
// 获取Cookie数组Cookie[] cookies = request.getCookies();
// 判断数组是否为空if (cookies != null && cookies.length > 0) {
// 遍历Cookie数组for (Cookie cookie : cookies){System.out.println(cookie.getName());System.out.println(cookie.getValue());}}
到期时间设置
- 负整数:默认值(-1),仅存于浏览器内存,关闭浏览器失效
- 正整数:存储指定秒数,保存到硬盘,重启电脑仍有效(如
cookie.setMaxAge(3*24*60*60)设置 3 天失效) - 0:删除 Cookie(浏览器内存和硬盘中均删除)
路径设置
- 路径决定服务器请求是否加载该 Cookie,默认路径为当前项目路径(
/项目名) - 常见场景:
cookie.setPath("/")(当前服务器下所有项目可访问)、cookie.setPath("/项目名/目录")(仅指定目录下资源可访问)
注意点
- 不支持中文:需通过
URLEncoder.encode()编码,URLDecoder.decode()解码 - 同名 Cookie:服务器发送重复 Cookie 会覆盖原有 Cookie
- 存储限制:不同浏览器对 Cookie 的存储数量和大小有上限(一般为4kb),且不能跨浏览器、跨电脑共享
总结:当访问的路径包含了cookie的路径时,则该请求将带上该cookie;如果访问路径不包含cookie路径,则该请求不会携带该cookie
HttpSession 对象
介绍与 JSESSIONID
- 服务器端会话技术,用于标识一次会话,在用户多次请求间共享数据,依赖 Cookie 实现
- JSESSIONID:服务器创建 Session 时生成的唯一标识,通过 Cookie 发送给客户端(默认关闭浏览器失效),客户端下次请求携带该 Cookie,服务器通过它找到对应 Session
Session 域对象
- 作用:在一次会话中共享数据,请求转发和重定向均有效。
- 核心方法:
-
session.setAttribute("key", "value")(设置数据)session.getAttribute("key")(获取数据)session.removeAttribute("key")(删除数据)
Session 对象的销毁
- 默认时间到期:Tomcat 默认 30 分钟不活动失效,可通过 conf/web.xml 的
<session-timeout>修改(不建议) - 手动设置:
session.setMaxInactiveInterval(秒)(设置最大不活动时间)、session.invalidate()(立刻销毁) - 其他情况:关闭浏览器(JSESSIONID 失效)、关闭服务器,Session 均会销毁
ServletContext 对象
对象获取与常用方法
- 每个 Web 应用仅有一个 ServletContext 对象(application对象),服务器启动时创建,关闭时销毁
- 获取方式:通过 request、session、ServletConfig 或直接调用
getServletContext()获取 -
- 通过
request对象获取
ServletContext context = request.getServletContext();
- 通过
HttpSession对象获取:
ServletContext context = session.getServletContext();
- 通过
ServletConfig对象获取
// 在 Servlet 的 init 方法中(或任何可获取 ServletConfig 的地方)
ServletContext context = getServletConfig().getServletContext();
- 直接获取
ServletContext context = getServletContext();
- 通过
- 常用方法:
getRealPath("/")(获取项目真实路径)、getServerInfo()(获取服务器版本信息)
三大域对象对比
- 作用:在整个应用程序中共享数据,数据一旦存储未手动移除则持续存在
- 三大域对象:
-
request 域:一次请求中有效,请求转发有效、重定向失效
-
session 域:一次会话中有效,请求转发和重定向均有效,Session 销毁后失效
-
ServletContext 域:整个应用程序中有效,服务器关闭后失效
-
文件上传与下载
文件上传
- 前端页面:表单需满足
method="post"、enctype="multipart/form-data",包含文件域(<input type="file" name="文件名">) - 后端实现:Servlet 需添加
@MultipartConfig注解,通过request.getPart("文件域name")获取 Part 对象,调用part.getSubmittedFileName()获取文件名,part.write(存储路径+文件名)保存文件
文件下载
- 超链接下载:浏览器不识别的资源自动下载,识别的资源需通过
download属性强制下载(如<a href="文件路径" download>) - 后台实现:设置响应类型(
response.setContentType("application/x-msdownload"))、响应头(Content-Disposition: attachment;filename=文件名),通过输入流读取服务器文件,输出流写入响应发送给客户端(货拉拉模式)
过滤器(Filter)
核心定义
Filter 用于在 Servlet 之前预处理 Request 或后处理 Response
核心特性
- 执行流程:请求时按配置顺序执行过滤器,响应时按相反顺序执行
- 核心能力:拦截请求 / 响应、修改头信息和数据、控制是否放行目标资源
实现步骤
- 编写 Java 类实现
javax.servlet.Filter接口,重写init()、doFilter()、destroy()方法 - 通过
@WebFilter注解配置拦截的资源(如/*表示拦截所有资源) - 关键对象
FilterChain:调用其doFilter()方法表示放行,否则拦截资源访问
经典实例
请求乱码处理
- POST 请求:直接通过
request.setCharacterEncoding("UTF-8")处理 - GET 请求(Tomcat8 以下):通过
new String(request.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8")转码,可通过自定义HttpServletRequestWrapper子类统一处理
用户非法访问拦截
- 拦截范围:所有资源(
/*) - 放行场景:登录 / 注册页面、静态资源(css/js/image)、登录 / 注册操作、已登录状态(通过 Session 判断)
- 拦截逻辑:未满足放行条件时,重定向至登录页面
监听器(Listener)
核心定义
Servlet 中的特殊类,用于监听 web 容器中的特定事件(如对象创建 / 销毁、属性变化),可在事件前后添加处理逻辑
分类
- 生命周期监听:
ServletRequestListener、HttpSessionListener、ServletContextListener - 属性变化监听:
ServletRequestAttributeListener、HttpSessionAttributeListener、ServletContextAttributeListener - Session 对象监听:由 JavaBean 直接实现对应接口
实现步骤
- 编写 Java 类实现对应监听器接口(如
HttpSessionListener) - 通过
@WebListener注解完成配置
经典实例:在线人数统计
- 核心接口:
HttpSessionListener,监听 Session 的创建(sessionCreated())和销毁(sessionDestroyed()) - 计数逻辑:Session 创建时在线人数 +1,销毁时 -1,将计数存储在
ServletContext作用域(全局共享) - 辅助 Servlet:提供登录、退出功能,读取全局在线人数并展示
