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);
} }

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();
} }

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;
}
}

filter添加水印的更多相关文章

  1. django 操作数据库--orm(object relation mapping)---models

    思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...

  2. JavaWeb之Filter过滤器

    原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可以锻炼锻炼.言归正传,过滤器从字面理解她的话有拦网.过滤的功 ...

  3. 由于开发需求需要在附件查看页面添加水印,于是网上看到一位大牛写了一个js加水印的方法觉得很实用,也很方便,记录一下,哈哈

    大牛的博客链接:https://www.cnblogs.com/daixinyu/p/6715398.html 提供给大家学习 我优化了几点 1,我把水印的样式单独提出来,这样会提高渲染水印的性能 2 ...

  4. 第六章 过滤器Filter

    Filter概述 Filter不用于客户端请求,只用于对request,response进行修改或对context,session,request事件进行监听. 1.概述 如上图,多个filter组成 ...

  5. ffmpeg一些filter用法、以及一些功能命令

    来源:http://blog.csdn.net/dancing_night/article/details/46776903 1.加字幕 命令:ffmpeg -i <input> -fil ...

  6. Servlet高级部分Filter(过滤器)

    一:Filter称之为"过滤器",用在Servlet外,对request和response进行修改.它是AOP(面向切面编程思想的一种体现),Filter中有一个FilterCha ...

  7. js为页面元素添加水印

    近期有需求为页面部分区域添加上水印,通过在网上找到了js为页面添加水印的方法,后来经过自己的改进,可以实现为页面部分元素添加水印,最终效果如下图: 代码如下: function watermark(s ...

  8. ffmpeg 视频教程 添加水印附源码

    本文主要讲述如何利用Ffmpeg向视频文件 添加水印这一功能,文中最后会给出源代码下载地址以及视频 下载地址,视频除了讲述添加水印的基本原理以及代码实现,还提到了要注意的一些地方,因为直接运行 dem ...

  9. PHP-生成缩略图和添加水印图-学习笔记

    1.开始 在网站上传图片过程,经常用到缩略图功能.这里我自己写了一个图片处理的Image类,能生成缩略图,并且可以添加水印图. 2.如何生成缩略图 生成缩略图,关键的是如何计算缩放比率. 这里,我根据 ...

随机推荐

  1. Repeat a string repeat a string

    重要的事情说3遍! 重复一个指定的字符串 num次,如果num是一个负数则返回一个空字符串. 这是一些对你有帮助的资源: Global String Object 这道题的思路就是按照题目要求一步一步 ...

  2. java程序设计基础篇 复习笔记 第二单元

    1原始数据类型(primitive data type) == 基本类型 (fundamental type)byte short int long float double char boolean ...

  3. 添加git 忽略文件

    在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交. Git 忽略文件提交的方法 有三种方法可以实现忽略Gi ...

  4. Struts13---Ognl

    模拟初始化的jsp页面 <body> <a href="user/login">登录</a> </body> public clas ...

  5. C++设计模式之-建造者模式

    建造者模式的定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示(DP).<大话设计模式>举了一个很好的例子——建造小人,一共需建造6个部分,头部.身体.左右手.左 ...

  6. 剑指offer--45.二叉树的深度

    时间限制:1秒 空间限制:32768K 热度指数:139716 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. -- ...

  7. Mysql双机热备--预备知识

    1.双机热备 对于双机热备这一概念,我搜索了很多资料,最后,还是按照大多数资料所讲分成广义与狭义两种意义来说. 从广义上讲,就是对于重要的服务,使用两台服务器,互相备份,共同执行同一服务.当一台服务器 ...

  8. SQL Server(MSSQLSERVER)启动失败,提示“请求失败或服务未及时响应

    1.SQL Server(MSSQLSERVER)启动失败,提示“请求失败或服务未及时响应. --------------------------- SQL Server 配置管理器 -------- ...

  9. 《Unity 3D游戏客户端基础框架》消息系统

    功能分析: 首先,我们必须先明确一个消息系统的核心功能: 一个通用的事件监听器 管理各个业务监听的事件类型(注册和解绑事件监听器) 全局广播事件 广播事件所传参数数量和数据类型都是可变的(数量可以是 ...

  10. 3PC

    3PC,是Three-Phase Commit的缩写,即三阶段提交,是2PC的改进版,其二阶段提交协议的"提交事务请求"过程一分为二,形成了由CanCommit,PreCommit ...