网站要怎么做才专业,2022电商平台用户排行榜,谷歌广告联盟网站,网站变灰 兼容一、什么是责任链模式 责任链模式#xff08;Chain of Responsibility Pattern#xff09;是一种行为型设计模式。其核心思想是将请求的发送者和接收者解耦#xff0c;通过一个中介链来传递请求#xff0c;使得多个对象都有可能接收请求#xff0c;从而避免请求发送者和接…一、什么是责任链模式 责任链模式Chain of Responsibility Pattern是一种行为型设计模式。其核心思想是将请求的发送者和接收者解耦通过一个中介链来传递请求使得多个对象都有可能接收请求从而避免请求发送者和接收者之间的耦合关系。
二、责任链模式的角色 抽象处理者Handler角色作为责任链模式的核心这个接口定义了统一的处理请求的方法并定义了如何将请求传递给下一个处理者。 具体处理者Concrete Handler角色实现抽象处理者的处理方法判断能否处理本次请求。如果可以处理请求则直接处理否则将请求传递给下一个处理者。 三、责任链模式的典型应用
多层拦截器在Web开发中可以使用责任链模式来实现多层拦截器每个拦截器都可以对请求进行预处理或后处理实现多层拦截的功能 。 可改变顺序的处理者必须按顺序执行多个处理者尤其在运行时执行顺序可改变时可以使用责任链模式。 多个对象可以处理请求当系统中存在多个对象每个对象都可能处理同一个请求但具体由哪个对象处理应在运行时决定。避免复杂的条件判断当请求需要根据多个条件进行不同的处理可以使用责任链模式避免使用嵌套的if-else语句使代码更加简洁易读。
四、责任链模式在FilterChain中的应用
责任链模式在FilterChain中的应用是Java Servlet API中一个经典的例子。在这种应用中每个过滤器Filter都有机会处理HTTP请求并且可以决定是否将请求传递给链中的下一个过滤器或目标资源。以下是每个类在责任链模式中的角色以及一个简单的代码案例 抽象处理者Handler 在FilterChain中Filter接口扮演了抽象处理者的角色。它定义了所有过滤器必须实现的doFilter方法该方法接收请求ServletRequest、响应ServletResponse和一个FilterChain实例 。 具体处理者Concrete Handler 具体过滤器类实现了Filter接口。在doFilter方法中每个过滤器可以对请求和响应进行处理然后通过调用FilterChain的doFilter方法将请求传递给链中的下一个过滤器 。 客户端Client 在这个上下文中客户端可以是任何发起HTTP请求的实体如Web浏览器。客户端发送请求到Servlet容器该容器负责构建过滤器链并处理请求 。 FilterChain责任链 FilterChain接口定义了doFilter方法用于调用链中的下一个过滤器或最终的资源如Servlet。FilterChain的实现类负责管理过滤器链的执行顺序 。
以下是一个简单的代码案例展示了两个过滤器如何在FilterChain中按顺序工作
1.定义第一个过滤器LoggingFilter
public class LoggingFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println(LoggingFilter 初始化);}Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println(LoggingFilter: 请求开始...);// 执行下一个过滤器或目标资源chain.doFilter(request, response);System.out.println(LoggingFilter: 响应返回...);}Overridepublic void destroy() {System.out.println(LoggingFilter 销毁);}
}
2.定义第二个过滤器AuthenticationFilter
public class AuthenticationFilter implements Filter {Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println(AuthenticationFilter 初始化);}Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpRequest (HttpServletRequest) request;Cookie[] cookies httpRequest.getCookies();if (cookies ! null) {for (Cookie cookie : cookies) {System.out.println(Found cookie: cookie.getName() cookie.getValue());}}// 继续执行过滤器链chain.doFilter(request, response);}Overridepublic void destroy() {System.out.println(AuthenticationFilter 销毁);}
}
3.定义目标资源DemoServlet
public class DemoServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(DemoServlet: 处理请求...);resp.getWriter().write(Hello, FilterChain!);}
}
在这个例子中LoggingFilter和AuthenticationFilter是具体处理者它们实现了Filter接口并在doFilter方法中处理请求。FilterChain的实例通过chain.doFilter(request, response)调用传递请求给下一个过滤器或最终的Servlet资源。当访问DemoServlet时过滤器链将按顺序执行首先执行LoggingFilter然后是AuthenticationFilter最后是DemoServlet处理请求 。