想什么来什么,终于g到动态代理实现filter的代码
package cn.itcast.web.filter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GzipFilter2 implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//利用代理类,生成代理对象
ResponseProxy proxy = new ResponseProxy(response);
chain.doFilter(request, proxy.getResponse());
byte source[] = proxy.getBuffer();
System.out.println(new String(source));
}
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
// 写一个类来创建response代理对象
class ResponseProxy {
//1.创建被代理对象.
HttpServletResponse response;
ByteArrayOutputStream out = new ByteArrayOutputStream();
PrintWriter writer = null;
//构造方法中传入被代理的对象.
public ResponseProxy(HttpServletResponse response) {
this.response = response;
}
//获取被代理对象的方法
public HttpServletResponse getResponse() {//利用Proxy.newProxyInstance来创建被代理的对象
return (HttpServletResponse) Proxy.newProxyInstance(ResponseProxy.class
.getClassLoader(), response.getClass().getInterfaces(),
new InvocationHandler() {
//内部类实现InvocationHandler的方法,
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
if (method.getName().equals("getWriter")) {
writer = new PrintWriter(new OutputStreamWriter(
out, response.getCharacterEncoding()));
return writer;
}
if (method.getName().equals("getOutputStream")) {
return new YouServletOutputStream(out);
}
return method.invoke(response, args);
}
});
}
public byte[] getBuffer() {
if (writer != null) {
writer.flush();
}
return out.toByteArray();
}
}
class YouServletOutputStream extends ServletOutputStream {
ByteArrayOutputStream out;
public YouServletOutputStream(ByteArrayOutputStream out) {
this.out = out;
}
@Override
public void write(int b) throws IOException {
out.write(b);
}
}
分享到:
相关推荐
内网nginx正向代理外网,并实现高德地图:web资源服务器A,搭建nginx转发服务,和webJsAPI的字符替换,涉及两个包nginx-1.22.1.tar.gz、ngx_http_substitutions_filter_module-master.zip代理服务器B,搭建nginx外网...
2. **实现Filter代理或Servlet代理** Spring提供了两种现成的代理类,用于处理Filter或Servlet的代理,分别是`org.springframework.security.util.FilterToBeanProxy`和`org.springframework.web.filter....
以下是一段简单的动态代理实现代码: ```java interface MyInterface { void doSomething(); } class MyTarget implements MyInterface { @Override public void doSomething() { System.out.println("Doing ...
Servlet过滤器(Filter)遵循Servlet规范,是一个实现了javax.servlet.Filter接口的类。过滤器在请求到达目标Servlet之前和之后被调用,可以用来修改请求和响应,或者进行预处理和后处理操作。在我们的场景中,过滤...
Java Servlet Filter实现全站动态转静态是一种常见的优化网站性能的技术,它通过在服务器端拦截请求,将原本需要动态生成的页面转换为预先生成的静态HTML文件进行返回,从而减轻服务器负担,提高页面加载速度,提升...
- **实现原理**:Interceptor是基于AOP(面向切面编程)思想的,利用动态代理技术实现在目标方法执行前后的操作。Interceptor更侧重于对请求处理逻辑的拦截和扩展,可以灵活地控制请求是否继续向下传递。 - **生命...
在Spring Boot中,我们可以利用`ProxyServlet`实现反向代理,将请求转发到不同的微服务,同时保持对外接口的一致性。 实现步骤如下: 1. 添加依赖:在`pom.xml`文件中引入Spring Boot的`spring-boot-starter-web`...
以下是一个简单的动态代理实现的步骤: 1. 创建一个接口,定义代理对象需要实现的方法。 2. 实现该接口的代理类,通常这个类会实现InvocationHandler接口。 3. 使用Proxy.newProxyInstance()方法创建代理对象,传入...
动态代理是Java提供的一种机制,允许在运行时创建代理类,这些代理类可以作为原对象的代理,实现代理对象对原对象的增强或扩展。Java通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来...
动态代理在Java中主要用于实现AOP(面向切面编程)和接口方法的拦截。通过Java的InvocationHandler接口和Proxy类,我们可以创建一个动态代理对象,这个代理对象能够调用目标对象的接口方法,并在调用前后添加额外的...
在Java中,动态代理允许我们在运行时创建一个实现了特定接口的代理类。这种技术常用于实现AOP(面向切面编程)或者为已有的接口添加额外的行为,如日志、事务管理等。Java的动态代理主要通过`java.lang.reflect....
- `DelegatingFilterProxy`:Spring提供的Filter,用于代理Spring的Bean,例如Spring Security的Filter链。 - 编写自定义Filter:扩展`javax.servlet.Filter`类,实现`doFilter`方法,然后在`web.xml`中配置。 3....
Java的动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建代理实例,而InvocationHandler接口定义了代理对象调用方法时的处理逻辑。 接下来,我们转向...
在Java中,动态代理允许我们在运行时创建一个实现了一组特定接口的代理类。这种代理类可以用来拦截方法调用,添加额外的行为,如日志记录、性能监控或事务管理。动态代理主要由`java.lang.reflect.Proxy`类和`java....
创建动态代理的步骤包括定义一个或多个接口,创建实现了这些接口的InvocationHandler,然后通过Proxy.newProxyInstance方法生成代理对象。当通过代理对象调用方法时,实际的处理工作由InvocationHandler的invoke方法...
动态代理是在运行时创建接口的实现类,这种实现类能够在运行时对方法调用进行拦截和处理。Java通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现这一功能。动态代理通常用于AOP...
然而,MyBatisPlugin在实现上稍有不同,它结合了动态代理模式来构建职责链。动态代理模式允许在运行时创建代理对象,从而能够在不修改原始代码的情况下,为方法调用添加额外的行为。 MyBatis Plugin的主要功能是在...
Proxy类用于创建一个实现了指定一组接口的动态代理对象,而InvocationHandler接口定义了一个方法,即`invoke()`,当通过代理对象调用方法时,实际的执行逻辑由这个方法处理。动态代理通常用于AOP(面向切面编程)...
例如,`Castle.DynamicProxy`库就是基于动态代理实现AOP的。动态代理在运行时创建代理类,可以针对接口或者抽象类,而不需要重新编译源代码。这使得代码更加灵活,但性能相比静态织入略低。 3. **特性驱动编程**: ...