0%

Java 过滤器(Filter):Java Web 中的请求与响应拦截器

过滤器(Filter)是 Java Web 中用于拦截和处理请求 / 响应的组件,基于 Servlet 容器的函数回调机制工作。它可以在请求到达目标资源(如 Servlet、JSP)前预处理请求,或在响应返回客户端前处理响应,常用于身份验证、日志记录、数据转换等场景。本文将详细解析 Filter 的工作原理、使用方式及典型应用。

Filter 核心概念与作用

什么是 Filter?

Filter 是实现 javax.servlet.Filter 接口的 Java 类,由 Servlet 容器管理,主要作用包括:

  • 请求拦截:在请求到达目标资源前进行处理(如验证登录状态、过滤非法参数)。
  • 响应处理:在响应返回客户端前进行处理(如压缩数据、添加统一响应头)。
  • 链式处理:多个 Filter 可组成过滤器链,按顺序对请求 / 响应进行多级处理。

常见 Filter 类型

根据功能,Filter 可分为以下类型:

  • 身份验证过滤器:验证用户登录状态,未登录则重定向到登录页。
  • 日志过滤器:记录请求 URL、访问时间、客户端 IP 等信息。
  • 数据压缩过滤器:对响应数据进行 GZIP 压缩,减少传输量。
  • 编码过滤器:统一设置请求 / 响应的字符编码(如 UTF-8)。
  • XSS 过滤器:过滤请求中的恶意脚本,防止跨站脚本攻击。

Filter 接口与生命周期

Filter 接口核心方法

阅读全文 »

hadoop操作Parquet 文件详解

在 Hadoop 生态中,Parquet 作为一种列式存储格式,凭借其高效的压缩率和查询性能,被广泛应用于大数据处理场景。当数据存储格式从 Text 转为 Parquet 后,如何正确读取 Parquet 文件成为关键问题。本文将详细介绍 Hadoop 读取 Parquet 文件的方法及相关注意事项。

依赖配置

读取 Parquet 文件前,需在项目中添加必要的 Parquet 依赖。以下是 Maven 配置示例:

1
2
3
4
5
6
7
8
9
10
11
<!--添加Parquet依赖-->
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-column</artifactId>
<version>1.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-hadoop</artifactId>
<version>1.8.1</version>
</dependency>

注意:需确保 Parquet 依赖版本与 Hadoop 版本兼容,避免出现版本冲突问题(如 Guava 库版本不一致等)。

核心读取代码实现

Parquet 文件的读取主要通过自定义 Mapper 来实现,核心在于正确配置输入格式和解析 Parquet 数据。

阅读全文 »

请求转发与重定向:Java Web 中的页面跳转机制

在 Java Web 开发中,页面跳转是常见需求,主要通过请求转发(Forward)请求重定向(Redirect) 两种方式实现。它们在原理、使用场景和特性上有显著区别,理解这些差异对构建高效的 Web 应用至关重要。本文将详细解析两种机制的实现、区别及适用场景。

请求转发(Forward)

请求转发是指服务器收到客户端请求后,将请求 “转发” 给内部另一个资源(如 Servlet、JSP)处理,最终由目标资源生成响应返回给客户端。整个过程在服务器内部完成,客户端感知不到中间转发步骤。

实现方式

通过 HttpServletRequestgetRequestDispatcher() 方法获取 RequestDispatcher 对象,再调用其 forward() 方法实现转发:

1
2
// 请求转发到 /targetServlet
request.getRequestDispatcher("/targetServlet").forward(request, response);

RequestDispatcher 接口

RequestDispatcher 由 Servlet 容器创建,用于封装目标资源并提供转发或包含功能,核心方法:

  • forward(request, response):将请求转发到目标资源,目标资源的响应会直接返回给客户端。
  • include(request, response):将目标资源的响应包含到当前响应中(如页面片段复用)。

接口中定义了多个常量(如 FORWARD_REQUEST_URIINCLUDE_CONTEXT_PATH),用于在转发 / 包含时传递原始请求的元信息(如 URI、路径等)。

转发的特性

  • 一次请求:客户端仅发起一次请求,服务器内部转发,requestresponse 对象在整个过程中复用。
  • 地址栏不变:客户端地址栏显示的仍是初始请求的 URL,不显示目标资源的路径。
  • 共享 request 数据:转发过程中,requestattribute 可在多个资源间共享(通过 setAttribute/getAttribute)。
  • 仅限内部资源:只能转发到当前 Web 应用内的资源(如 /target.jsp/servlet/demo),无法跨应用或跨域。
  • 路径规则:转发路径中的 / 代表当前 Web 应用的根目录(如 /target 等价于 http://localhost:8080/应用名/target)。
阅读全文 »

Java Web 响应处理:HttpServletResponse 详解

在 Java Web 开发中,服务器对客户端请求的响应由 HttpServletResponse 对象封装。它负责构建 HTTP 响应消息(状态行、响应头、响应正文),并将结果返回给客户端。本文将详细解析 HttpServletResponse 的核心功能,包括状态码设置、响应头管理、响应正文输出及常见应用场景。

HttpServletResponse 概述

HttpServletResponseServletResponse 接口的子接口,专门用于处理 HTTP 协议的响应。它由 Servlet 容器创建,通过 service() 方法传递给 Servlet,开发者通过其提供的方法构建响应内容。

1
2
3
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 通过 resp 构建响应...
}

状态行处理

HTTP 响应状态行由协议版本状态码状态描述组成(如 HTTP/1.1 200 OK)。状态码用于告知客户端请求处理结果,HttpServletResponse 提供以下方法设置状态码:

核心方法

  • setStatus(int sc):设置状态码(如 200 表示成功,404 表示资源不存在)。
  • sendError(int sc):发送错误状态码,并触发容器的错误页面机制(如 404 会显示自定义错误页)。
  • sendError(int sc, String msg):发送错误状态码及自定义描述信息。

常见状态码

状态码 含义 常量(HttpServletResponse) 应用场景
200 请求成功 SC_OK 正常返回响应正文
302 临时重定向 SC_FOUND 页面跳转(如登录后跳首页)
400 客户端请求错误 SC_BAD_REQUEST 参数格式错误
401 未认证 SC_UNAUTHORIZED 未登录访问受保护资源
403 权限不足 SC_FORBIDDEN 登录后无操作权限
404 资源不存在 SC_NOT_FOUND 请求 URL 错误
500 服务器内部错误 SC_INTERNAL_SERVER_ERROR 代码抛出异常

示例

阅读全文 »

Linux 定时任务全指南:at 与 crontab 详解

在 Linux 系统中,定时任务是自动化运维的核心工具,能够帮助用户在指定时间自动执行脚本或命令。本文将详细介绍两种常用的定时任务工具:at(一次性任务)和 crontab(周期性任务),包括它们的使用方法、配置规则及实战技巧。

at:一次性定时任务

at 工具用于安排在未来某个特定时间执行一次的任务(如临时备份、定时发送邮件),依赖 atd 服务。

启动 atd 服务

at 命令需要 atd 守护进程支持,使用前需确保服务已启动:

1
2
3
4
5
6
7
8
# 启动 atd 服务
sudo service atd start

# 设置开机自启动(CentOS)
sudo chkconfig atd on

# 设置开机自启动(Ubuntu)
sudo systemctl enable atd

at 命令基本用法

1
at [选项] 时间
常用选项
  • -f 脚本文件:指定要执行的脚本(默认从标准输入读取命令)。
  • -m:任务执行完成后,通过邮件通知用户(需系统配置邮件服务)。
  • -c 作业号:查看指定作业的具体内容。
时间格式

at 支持多种时间表达方式,灵活易用:

阅读全文 »