|
|
|
|
@ -1,7 +1,6 @@
|
|
|
|
|
package com.hua.filter;
|
|
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
|
|
|
|
|
import javax.servlet.Filter;
|
|
|
|
|
import javax.servlet.FilterChain;
|
|
|
|
|
import javax.servlet.FilterConfig;
|
|
|
|
|
@ -12,18 +11,25 @@ import javax.servlet.http.HttpServletRequest;
|
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 自定义的 HttpFilter, 实现自 Filter 接口
|
|
|
|
|
*
|
|
|
|
|
* 自定义的 HttpFilter,实现自 Filter 接口
|
|
|
|
|
* 该类作为一个抽象类,为基于 HTTP 协议的 Servlet 过滤器提供了一个基础框架,
|
|
|
|
|
* 定义了一些通用的方法以及规范了子类需要实现的抽象方法,方便在具体业务场景中创建自定义的过滤器。
|
|
|
|
|
*/
|
|
|
|
|
public abstract class HttpFilter implements Filter {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用于保存 FilterConfig 对象.
|
|
|
|
|
* 用于保存 FilterConfig 对象.
|
|
|
|
|
* FilterConfig 对象包含了过滤器的初始化配置信息,例如初始化参数等,
|
|
|
|
|
* 通过这个成员变量可以在过滤器的其他方法中获取相关配置信息来进行相应处理。
|
|
|
|
|
*/
|
|
|
|
|
private FilterConfig filterConfig;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 不建议子类直接覆盖. 若直接覆盖, 将可能会导致 filterConfig 成员变量初始化失败
|
|
|
|
|
* 该方法重写了 Filter 接口中的 init 方法,用于接收 FilterConfig 对象并进行初始化操作,
|
|
|
|
|
* 先将传入的 FilterConfig 对象赋值给类中的成员变量 filterConfig,然后调用无参的 init 方法,
|
|
|
|
|
* 留给子类一个机会在初始化时进行一些额外的自定义操作(通过无参 init 方法),
|
|
|
|
|
* 同时提醒子类不要直接重写这个有参的 init 方法,以免破坏成员变量的初始化流程。
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void init(FilterConfig filterConfig) throws ServletException {
|
|
|
|
|
@ -32,50 +38,63 @@ public abstract class HttpFilter implements Filter {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 供子类继承的初始化方法. 可以通过 getFilterConfig() 获取 FilterConfig 对象.
|
|
|
|
|
* 供子类继承的初始化方法. 可以通过 getFilterConfig() 获取 FilterConfig 对象.
|
|
|
|
|
* 这个无参的 init 方法是提供给子类重写的,子类在重写时可以利用 getFilterConfig 方法获取到 FilterConfig 对象,
|
|
|
|
|
* 进而获取过滤器的初始化配置参数等信息,进行一些和具体业务相关的初始化操作,例如加载一些配置文件、初始化某些资源等。
|
|
|
|
|
*/
|
|
|
|
|
protected void init() {}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 直接返回 init(ServletConfig) 的 FilterConfig 对象
|
|
|
|
|
* 提供了一个对外的方法,方便子类或者其他类获取已经初始化的 FilterConfig 对象,
|
|
|
|
|
* 以便获取过滤器相关的配置信息来进行后续操作,比如获取初始化参数的值等。
|
|
|
|
|
*/
|
|
|
|
|
public FilterConfig getFilterConfig() {
|
|
|
|
|
return filterConfig;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 原生的 doFilter 方法, 在方法内部把 ServletRequest 和 ServletResponse
|
|
|
|
|
* 转为了 HttpServletRequest 和 HttpServletResponse, 并调用了
|
|
|
|
|
* 原生的 doFilter 方法,在方法内部把 ServletRequest 和 ServletResponse
|
|
|
|
|
* 转为了 HttpServletRequest 和 HttpServletResponse, 并调用了
|
|
|
|
|
* doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
|
|
|
|
*
|
|
|
|
|
* 若编写 Filter 的过滤方法不建议直接继承该方法. 而建议继承
|
|
|
|
|
* doFilter(HttpServletRequest request, HttpServletResponse response,
|
|
|
|
|
* FilterChain filterChain) 方法
|
|
|
|
|
* 此方法重写了 Filter 接口中的 doFilter 方法,它的主要作用是将传入的通用 Servlet 请求和响应对象(ServletRequest 和 ServletResponse)
|
|
|
|
|
* 转换为基于 HTTP 协议的请求和响应对象(HttpServletRequest 和 HttpServletResponse),
|
|
|
|
|
* 因为在实际的 HTTP 相关业务场景中,通常需要使用 HttpServletRequest 和 HttpServletResponse 来处理请求和响应的更多细节信息,
|
|
|
|
|
* 转换完成后,调用了另一个抽象的 doFilter 方法(接收 HttpServletRequest 等参数的那个),
|
|
|
|
|
* 该抽象方法需要由子类去具体实现针对 HTTP 请求的过滤逻辑,
|
|
|
|
|
* 同时也提醒了编写过滤器的过滤方法时不建议直接继承这个方法,而是建议继承后面那个专门针对 HTTP 请求定制的 doFilter 方法。
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void doFilter(ServletRequest req, ServletResponse resp,
|
|
|
|
|
FilterChain chain) throws IOException, ServletException {
|
|
|
|
|
FilterChain chain) throws IOException, ServletException {
|
|
|
|
|
HttpServletRequest request = (HttpServletRequest) req;
|
|
|
|
|
HttpServletResponse response = (HttpServletResponse) resp;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
doFilter(request, response, chain);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 抽象方法, 为 Http 请求定制. 必须实现的方法.
|
|
|
|
|
* @param request
|
|
|
|
|
* @param response
|
|
|
|
|
* @param filterChain
|
|
|
|
|
* @throws IOException
|
|
|
|
|
* @throws ServletException
|
|
|
|
|
* 抽象方法,为 Http 请求定制. 必须实现的方法.
|
|
|
|
|
* 这个抽象方法是留给子类去具体实现的,它定义了针对 HTTP 请求进行过滤处理的逻辑框架,
|
|
|
|
|
* 子类需要根据具体的业务需求,在这个方法中编写代码来实现诸如请求拦截、验证、修改请求/响应内容等过滤操作,
|
|
|
|
|
* 例如检查用户权限、验证请求参数、设置响应头信息等,然后根据情况决定是否放行请求(通过调用 filterChain.doFilter 方法)。
|
|
|
|
|
* @param request 基于 HTTP 协议的请求对象,包含了请求的各种详细信息,如请求头、请求参数等,子类可以利用这些信息进行过滤判断。
|
|
|
|
|
* @param response 基于 HTTP 协议的响应对象,子类可以设置响应的内容类型、状态码、响应头以及向客户端输出内容等操作。
|
|
|
|
|
* @param filterChain 过滤器链对象,用于将请求传递给下一个过滤器或者最终的目标 Servlet,子类在完成自身的过滤逻辑后,
|
|
|
|
|
* 根据情况调用 filterChain.doFilter 方法来放行请求,让请求继续处理流程。
|
|
|
|
|
* @throws IOException 如果在处理请求或响应的输入输出操作过程中出现 I/O 异常时抛出该异常。
|
|
|
|
|
* @throws ServletException 如果在 Servlet 相关的处理过程中(如调用 Servlet 方法等)出现异常时抛出该异常。
|
|
|
|
|
*/
|
|
|
|
|
public abstract void doFilter(HttpServletRequest request, HttpServletResponse response,
|
|
|
|
|
FilterChain filterChain) throws IOException, ServletException;
|
|
|
|
|
public abstract void doFilter(HttpServletRequest request, HttpServletResponse response,
|
|
|
|
|
FilterChain filterChain) throws IOException, ServletException;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 空的 destroy 方法。
|
|
|
|
|
* 空的 destroy 方法。
|
|
|
|
|
* 该方法重写了 Filter 接口中的 destroy 方法,目前方法体为空,
|
|
|
|
|
* 主要是留给子类在过滤器销毁时(例如 Web 应用关闭等情况)进行一些资源释放、清理等操作的,
|
|
|
|
|
* 子类可以根据实际情况重写这个方法来实现相应的销毁逻辑,比如关闭数据库连接、释放文件资源等。
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public void destroy() {}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|