zoukankan      html  css  js  c++  java
  • filter添加水印

    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
  • 相关阅读:
    什么叫类属性 实例属性 以及区别
    移动端奇葩的多行文字省略隐藏
    CSS-三角形及其原理
    HTML5:在移动端禁用长按选中文本功能
    ffmpeg对mp4文件进行ts切片并生成m3u8文件
    mysql 查询时间戳格式化
    idea连接mysql报错Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property
    yii gii 访问不了
    mysql 添加用户 多主机 授权 连接
    js div scrollTop active 垂直居中显示
  • 原文地址:https://www.cnblogs.com/vhyc/p/6517042.html
Copyright © 2011-2022 走看看