面试题答案
一键面试1. 定义过滤器接口
public interface Filter {
void doFilter(Request request, Response response, FilterChain chain);
}
2. 定义FilterChain类
import java.util.ArrayList;
import java.util.List;
public class FilterChain {
private List<Filter> filters = new ArrayList<>();
private int index = 0;
public FilterChain addFilter(Filter filter) {
filters.add(filter);
return this;
}
public void doFilter(Request request, Response response) {
if (index < filters.size()) {
Filter filter = filters.get(index);
index++;
filter.doFilter(request, response, this);
}
}
}
3. 具体过滤器实现
身份验证过滤器
public class AuthenticationFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
if (isAuthenticated(request)) {
chain.doFilter(request, response);
} else {
response.setMessage("Authentication failed");
}
}
private boolean isAuthenticated(Request request) {
// 实际的身份验证逻辑
return request.getCredentials() != null && request.getCredentials().equals("valid");
}
}
权限检查过滤器
public class AuthorizationFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
if (hasPermission(request)) {
chain.doFilter(request, response);
} else {
response.setMessage("Authorization failed");
}
}
private boolean hasPermission(Request request) {
// 实际的权限检查逻辑
return request.getPermissions().contains("requiredPermission");
}
}
日志记录过滤器
public class LoggingFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("Logging request: " + request.getDetails());
chain.doFilter(request, response);
System.out.println("Logging response: " + response.getMessage());
}
}
4. 定义请求和响应类
public class Request {
private String credentials;
private List<String> permissions;
private String details;
// getters and setters
public String getCredentials() {
return credentials;
}
public void setCredentials(String credentials) {
this.credentials = credentials;
}
public List<String> getPermissions() {
return permissions;
}
public void setPermissions(List<String> permissions) {
this.permissions = permissions;
}
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
}
public class Response {
private String message;
// getters and setters
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
5. 使用示例
public class Main {
public static void main(String[] args) {
Request request = new Request();
request.setCredentials("valid");
request.setPermissions(List.of("requiredPermission"));
request.setDetails("Some request details");
Response response = new Response();
FilterChain filterChain = new FilterChain()
.addFilter(new AuthenticationFilter())
.addFilter(new AuthorizationFilter())
.addFilter(new LoggingFilter());
filterChain.doFilter(request, response);
System.out.println("Final response: " + response.getMessage());
}
}
性能优化说明
- 提前终止:在每个具体过滤器的
doFilter
方法中,当请求不符合条件时(如身份验证失败、权限不足),直接处理并设置响应信息,不再调用chain.doFilter
,从而避免不必要的链传递。 - 过滤器顺序优化:将能够快速判断请求是否合法的过滤器(如身份验证过滤器)放在责任链的前面,尽早终止不合法请求的处理,减少后续过滤器的调用开销。
以上是基于Java语言实现的责任链模式处理Web应用程序过滤器的示例,其他编程语言也可以参照类似的设计思路来实现。