博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
filter添加水印
阅读量:7122 次
发布时间:2019-06-28

本文共 4011 字,大约阅读时间需要 13 分钟。

1filter写法

先定义自己的responseWrapper

chain.doFilter(request,responseWrapper);

responseWrapper来输出

package water;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class WaterMarkFilter implements Filter {    private String waterMarkFile;    @Override    public void destroy() {        // TODO Auto-generated method stub    }    @Override    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        // TODO Auto-generated method stub        HttpServletResponse myResponse = (HttpServletResponse) response;        HttpServletRequest myRequest = (HttpServletRequest) request;        WaterMarkResponseWrapper waterMarkResponse = new WaterMarkResponseWrapper(                myResponse, waterMarkFile);        chain.doFilter(myRequest, waterMarkResponse);        waterMarkResponse.finishResponse();    }    @Override    public void init(FilterConfig filterConfig) throws ServletException {        // TODO Auto-generated method stub        String file = filterConfig.getInitParameter("waterMarkFile");        waterMarkFile = filterConfig.getServletContext().getRealPath(file);    }}
View Code

 

2WaterMarkResponseWrapper写法(自己定义的responseWrapper

重写自己的getOutputStream(也是自己定义的

finish()函数,处理水印函数

package water;import java.io.IOException;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;import util.ImageUtil;public class WaterMarkResponseWrapper extends HttpServletResponseWrapper {    private String waterMarkFile;    private HttpServletResponse response;    private WaterMarkOutputStream waterMarkOutputStream = new WaterMarkOutputStream();    public WaterMarkResponseWrapper(HttpServletResponse response,            String waterMarkFile) throws IOException {        super(response);        this.response = response;        this.waterMarkFile = waterMarkFile;    }    public void finishResponse() throws IOException {        // TODO Auto-generated method stub        byte[] imageData = waterMarkOutputStream.getByteArrayOutputStream()                .toByteArray();        byte[] image = ImageUtil.waterMark(imageData, waterMarkFile);        response.setContentLength(image.length);        response.getOutputStream().write(image);// 用原来的response输出的浏览器        waterMarkOutputStream.close();    }    public ServletOutputStream getOutputStream() throws IOException {        return waterMarkOutputStream;    }    public void flushBuffer() throws IOException {        waterMarkOutputStream.flush();    }}
View Code

 

3WaterMarkOutputStream(自定义的ServletOutputStream

内置一个ByteArrayOutputStream缓冲图片数据

重写write这些方法

原码

package water;import java.io.ByteArrayOutputStream;import java.io.IOException;import javax.servlet.ServletOutputStream;public class WaterMarkOutputStream extends ServletOutputStream {    private ByteArrayOutputStream byteArrayOutputStream;    @Override    public void write(int b) throws IOException {        // TODO Auto-generated method stub        byteArrayOutputStream.write(b);    }    public WaterMarkOutputStream() throws IOException {        byteArrayOutputStream = new ByteArrayOutputStream();    }    public void close() throws IOException {        byteArrayOutputStream.close();    }    public void flush() throws IOException {        byteArrayOutputStream.flush();    }    public void write(byte[] b, int off, int len) throws IOException {        byteArrayOutputStream.write(b, off, len);    }    public void write(byte[] b) throws IOException {        byteArrayOutputStream.write(b);    }    public ByteArrayOutputStream getByteArrayOutputStream() {        return byteArrayOutputStream;    }}
View Code

 

转载于:https://www.cnblogs.com/vhyc/p/6517042.html

你可能感兴趣的文章
Calendar工具类对跨年的星期的处理个人总结
查看>>
云计算和DevOps那点事
查看>>
什么是客户端负载均衡
查看>>
【mongoDB查询进阶】聚合管道(二) -- 阶段操作符
查看>>
2017-07-15 前端日报
查看>>
Android布局优化:ViewStub标签实现延迟加载(源码解析原理)
查看>>
Webpack快速入门
查看>>
HandlerThread与AsyncQueryHandler源码分析
查看>>
caffe原理之softmax函数
查看>>
数据分组统计
查看>>
记录fastclick中一次手动触发click事件失败
查看>>
云框架发布KONG API Gateway主题,开源求助攻~
查看>>
从一次报错聊聊 Point 事件
查看>>
JS attribute and prpperty
查看>>
SpringMVC配置太多?试试SpringBoot
查看>>
详解js深浅复制
查看>>
Laravel 服务容器实现原理
查看>>
stl map
查看>>
什么是with?
查看>>
LeetCode Weekly Contest 21
查看>>