You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.0 KiB
111 lines
3.0 KiB
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
// 请求处理接口
|
|
interface HttpRequestHandler {
|
|
void handle(HttpRequest request);
|
|
}
|
|
|
|
// 基础处理器
|
|
class CoreHandler implements HttpRequestHandler {
|
|
public void handle(HttpRequest request) {
|
|
System.out.println("Core processing: " + request.getPath());
|
|
}
|
|
}
|
|
|
|
// 装饰器抽象类
|
|
abstract class MiddlewareDecorator implements HttpRequestHandler {
|
|
protected HttpRequestHandler nextHandler;
|
|
|
|
public MiddlewareDecorator(HttpRequestHandler handler) {
|
|
this.nextHandler = handler;
|
|
}
|
|
}
|
|
|
|
// 具体装饰器实现
|
|
class AuthMiddleware extends MiddlewareDecorator {
|
|
public AuthMiddleware(HttpRequestHandler handler) {
|
|
super(handler);
|
|
}
|
|
|
|
public void handle(HttpRequest request) {
|
|
if (!request.getHeaders().containsKey("Authorization")) {
|
|
throw new SecurityException("Unauthorized");
|
|
}
|
|
nextHandler.handle(request);
|
|
}
|
|
}
|
|
|
|
class LoggingMiddleware extends MiddlewareDecorator {
|
|
public LoggingMiddleware(HttpRequestHandler handler) {
|
|
super(handler);
|
|
}
|
|
|
|
public void handle(HttpRequest request) {
|
|
System.out.println("Request logged: " + request.getMethod());
|
|
nextHandler.handle(request);
|
|
}
|
|
}
|
|
|
|
// 请求对象
|
|
class HttpRequest {
|
|
private String method;
|
|
private String path;
|
|
private List<String> headers = new ArrayList<>();
|
|
|
|
public HttpRequest(String method, String path) {
|
|
this.method = method;
|
|
this.path = path;
|
|
}
|
|
|
|
public void addHeader(String header) {
|
|
headers.add(header);
|
|
}
|
|
|
|
// getters...
|
|
}
|
|
|
|
// 管道构建器
|
|
class MiddlewarePipeline {
|
|
private HttpRequestHandler pipeline;
|
|
|
|
public void addMiddleware(HttpRequestHandler middleware) {
|
|
if (pipeline == null) {
|
|
pipeline = middleware;
|
|
} else {
|
|
// 找到最后一个处理器并添加新装饰器
|
|
HttpRequestHandler current = pipeline;
|
|
while (current instanceof MiddlewareDecorator) {
|
|
MiddlewareDecorator decorator = (MiddlewareDecorator) current;
|
|
if (decorator.nextHandler == null) {
|
|
decorator.nextHandler = middleware;
|
|
break;
|
|
}
|
|
current = decorator.nextHandler;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void execute(HttpRequest request) {
|
|
if (pipeline != null) {
|
|
pipeline.handle(request);
|
|
}
|
|
}
|
|
}
|
|
|
|
// 客户端使用
|
|
public class ChallengeMiddlewarePipeline {
|
|
public static void main(String[] args) {
|
|
MiddlewarePipeline pipeline = new MiddlewarePipeline();
|
|
|
|
// 构建处理链(顺序重要)
|
|
pipeline.addMiddleware(new LoggingMiddleware(null));
|
|
pipeline.addMiddleware(new AuthMiddleware(new CoreHandler()));
|
|
|
|
// 执行请求
|
|
HttpRequest request = new HttpRequest("GET", "/api/data");
|
|
request.addHeader("Authorization: Bearer token123");
|
|
|
|
pipeline.execute(request);
|
|
}
|
|
} |