From e77de2860006013afc4ca541d9d689a99d205205 Mon Sep 17 00:00:00 2001 From: pbvfus8to <480171784@qq.com> Date: Wed, 18 Dec 2024 11:18:37 +0800 Subject: [PATCH] Update XssFilter.java --- .../yami/shop/common/filter/XssFilter.java | 48 +++++++++++++++---- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/yami-shop-common/src/main/java/com/yami/shop/common/filter/XssFilter.java b/yami-shop-common/src/main/java/com/yami/shop/common/filter/XssFilter.java index 870349b..774fd35 100644 --- a/yami-shop-common/src/main/java/com/yami/shop/common/filter/XssFilter.java +++ b/yami-shop-common/src/main/java/com/yami/shop/common/filter/XssFilter.java @@ -21,32 +21,62 @@ import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** - * 一些简单的安全过滤: - * xss + * `XssFilter`类实现了`Filter`接口,是一个用于进行简单安全过滤的过滤器类,主要针对跨站脚本攻击(XSS,Cross-Site Scripting)进行防范。 + * 在Web应用中,用户输入的数据可能包含恶意的脚本代码,如果不加以过滤处理,这些代码可能会在浏览器端被执行,从而导致安全问题,比如窃取用户信息、篡改页面内容等。 + * 此类通过将请求包装在`XssWrapper`中,对请求中的数据进行过滤处理,以达到防范XSS攻击的目的,并且作为一个Spring组件,可以方便地被Spring容器管理和配置到Web应用的过滤器链中。 + * * @author lgh */ -@Component +@Component // 表明这个类是一个Spring组件,会被Spring容器扫描并实例化,方便进行依赖注入等相关操作以及在Web应用中作为过滤器被正确管理和使用。 public class XssFilter implements Filter { + // 创建一个日志记录器,用于记录过滤器执行过程中的相关信息,比如记录请求的URI等情况,方便后续查看过滤器的执行情况以及排查可能出现的问题。 Logger logger = LoggerFactory.getLogger(getClass().getName()); + /** + * `init`方法是`Filter`接口中定义的初始化方法,在过滤器被创建并加载到Web容器时调用一次,用于进行一些初始化的配置操作。 + * 在这里,当前的实现为空方法体,意味着没有额外的初始化逻辑需要执行,如果后续有需要,比如读取配置文件中的过滤规则等操作,可以在此方法中添加相应的代码。 + * + * @param filterConfig 包含了过滤器的配置信息,通过这个参数可以获取到在Web应用配置文件中为该过滤器设置的初始化参数等内容,不过目前没有使用到。 + * @throws ServletException 如果在初始化过程中出现错误,例如读取配置文件出错等情况,可以抛出这个异常,由Web容器进行相应的处理。 + */ @Override public void init(FilterConfig filterConfig) throws ServletException { } + /** + * `doFilter`方法是`Filter`接口中最核心的方法,用于实现具体的过滤逻辑。每次有请求经过这个过滤器时,都会执行这个方法。 + * 其主要逻辑如下: + * 1. 首先将传入的`ServletRequest`和`ServletResponse`对象强制转换为`HttpServletRequest`和`HttpServletResponse`类型, + * 因为在Web应用中,通常处理的是基于HTTP协议的请求和响应,这样后续可以方便地使用HTTP相关的方法和属性进行操作。 + * 2. 通过日志记录器记录当前请求的URI(统一资源标识符),方便后续查看哪些请求经过了这个过滤器,对于调试和监控请求情况很有帮助。 + * 3. 进行XSS过滤操作,将原始的`HttpServletRequest`对象包装在`XssWrapper`对象中,`XssWrapper`类应该是实现了对请求数据进行XSS过滤的逻辑, + * 然后将包装后的请求对象传递给过滤器链的下一个环节(通过`chain.doFilter`方法),这样后续的过滤器或者请求处理的Servlet等就能接收到经过XSS过滤后的请求数据, + * 从而避免了恶意脚本代码通过请求进入到应用内部并造成安全风险。 + * + * @param request 表示客户端发来的请求对象,包含了请求的各种信息,如请求头、请求参数等内容,在这里会被转换为`HttpServletRequest`类型来进一步处理。 + * @param response 表示服务器端要返回给客户端的响应对象,包含了响应的相关信息,如响应头、响应体等内容,在这里会被转换为`HttpServletResponse`类型来进行相关操作。 + * @param chain 过滤器链对象,代表了整个Web应用中过滤器的执行顺序链条,通过调用`chain.doFilter`方法可以将请求传递到下一个过滤器或者最终的请求处理Servlet中继续处理。 + * @throws IOException 如果在处理请求或响应的过程中出现输入输出相关的错误,例如读取请求数据出错、向客户端写响应数据出错等情况,会抛出这个异常,由Web容器进行相应的处理。 + * @throws ServletException 如果在过滤器执行过程中出现与Servlet相关的错误,例如请求对象转换失败、过滤器链执行异常等情况,会抛出这个异常,由Web容器进行相应的处理。 + */ @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{ + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; - - logger.info("uri:{}",req.getRequestURI()); - // xss 过滤 - chain.doFilter(new XssWrapper(req), resp); + logger.info("uri:{}", req.getRequestURI()); + // xss 过滤,将原始的HttpServletRequest包装在XssWrapper中,XssWrapper类应该实现了对请求参数等数据进行XSS过滤的逻辑, + // 然后把包装后的请求对象传递给过滤器链的下一个环节,使得后续的处理流程接收到的是经过XSS过滤后的请求数据。 + chain.doFilter(new XssWrapper(req), resp); } + /** + * `destroy`方法是`Filter`接口中定义的销毁方法,在过滤器从Web容器中被移除时调用,用于释放过滤器占用的资源,比如关闭打开的文件流、释放数据库连接等操作。 + * 在这里,当前的实现为空方法体,意味着没有额外的资源释放逻辑需要执行,如果后续过滤器在运行过程中有占用相关资源的情况,可以在此方法中添加相应的代码来进行资源的清理工作。 + */ @Override public void destroy() { } -} +} \ No newline at end of file