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
  • 相关阅读:
    C指针典例
    20150310 块设备驱动程序
    python连接redis
    利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
    将一个正整数分解质因数。例如输入90,打印出90=2*3*3*5
    python 中输入一个字符串,判断这个字符串中有多少个字符、数字、空格、特殊字符
    学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用利用条件运算符的嵌套来完成此题:C表示。
    nginx在基于域名访问的时候是下载的界面
    mysql数据库二进制初始化出现:170425 17:47:04 [ERROR] /application/mysql//bin/mysqld: unknown option '--skip-locking' 170425 17:47:04 [ERROR] Aborting 解决办法
    赛马问题
  • 原文地址:https://www.cnblogs.com/vhyc/p/6517042.html
Copyright © 2011-2022 走看看