关键是要重写response和PirntWriter(或者OutputStream)
重写PirntWriter:
package com.xs.servlet.changeresponse;
import java.io.PrintWriter;
import java.io.Writer;
public class MyWriter extends PrintWriter{
private StringBuilder buffer;
public MyWriter(Writer out) {
super(out);
buffer = new StringBuilder();
@Override
public void write(char[] buf, int off, int len) {
// super.write(buf, off, len);
char[] dest = new char[len];
System.arraycopy(buf, off, dest, 0, len);
buffer.append(dest);
System.out.println("write1");
@Override
public void write(char[] buf) {
super.write(buf);
System.out.println("write2");
@Override
public void write(int c) {
super.write(c);
System.out.println("write3");
@Override
public void write(String s, int off, int len) {
super.write(s, off, len);
System.out.println("write4");
@Override
public void write(String s) {
super.write(s);
System.out.println("write5");
public String getContent(){
return buffer.toString();
重写OutputStream:package com.xs.servlet.changeresponse;
import java.io.IOException;
import javax.servlet.ServletOutputStream;
* 这只是示例,可以参考MyWriter
* @author Administrator
public class MyOutputStream extends ServletOutputStream {
private ServletOutputStream outputStream;
public MyOutputStream(ServletOutputStream outputStream) {
this.outputStream = outputStream;
@Override
public void write(int b) throws IOException {
outputStream.write(b);
System.out.println("output1");
@Override
public void write(byte[] b, int off, int len) throws IOException {
super.write(b, off, len);
System.out.println("output2");
@Override
public void write(byte[] b) throws IOException {
super.write(b);
System.out.println("output3");
重写response:
package com.xs.servlet.changeresponse;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class MyResponseWrapper extends HttpServletResponseWrapper {
private MyWriter myWriter;
private MyOutputStream myOutputStream;
public MyResponseWrapper(HttpServletResponse response) {
super(response);
@Override
public PrintWriter getWriter() throws IOException {
myWriter = new MyWriter(super.getWriter());
return myWriter;
@Override
public ServletOutputStream getOutputStream() throws IOException {
myOutputStream = new MyOutputStream(super.getOutputStream());
return myOutputStream;
public MyWriter getMyWriter() {
return myWriter;
public MyOutputStream getMyOutputStream() {
return myOutputStream;
过滤器ChangeResponseFilter:
package com.xs.servlet.changeresponse;
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.HttpServletResponse;
public class ChangeResponseFilter implements Filter {
@Override
public void destroy() {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
MyResponseWrapper responseWrapper = new MyResponseWrapper((HttpServletResponse) response);
chain.doFilter(request, responseWrapper);
MyWriter writer = responseWrapper.getMyWriter();
if (writer != null) {
String content = writer.getContent();
content = content.replace("$replace$", "This is replaced!");
response.getWriter().write(content);
@Override
public void init(FilterConfig arg0) throws ServletException {
过滤器配置:
<filter>
<filter-name>changeResponseFilter</filter-name>
<filter-class>com.xs.servlet.changeresponse.ChangeResponseFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>changeResponseFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
请求资源http://localhost/test/index.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<title>Test index</title>
<script type="text/javascript" src="/test/js/jquery-1.4.2.js"></script>
<script type="text/javascript">
</script>
</head>
index page.<br/>
$replace$
</body>
</html>
测试结果:
一、引子有时候,我们相对返回数据做进一步处理,而 httpServletResponse 不允许我们读取其内容,所以我们需要对其自定义包装二、自定义response wrapperpublic cla...
来自: 琼华
有时候在开发过程中会有这样一个场景,有时需要对返回的数据进行处理。比如加密啊,添加某些标记啊等等。这种情况我们可以通过过滤器去处理。过滤器是什么就不介绍了,百度一下,你就知道。看看代码吧:返回值输出代...
来自: Gogym的博客
Filter 先拦截request, doFilter放行, response响应回来, Filter再次拦截 ,执行doFilter()后面的代码执行过程:发出request请求,服务器封装requ...
来自: qq_27886997的博客
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。七月初内推了字节跳动的提前批,因为内...
来自: ljh_shuai的博客
java-springmvc+filter 替换输出流、response、响应内容一、问题1.描述:在使用 filter 替换、修改 response 输出内容时常见的错误如下异常提示getWrite...
来自: 草青工作室 的专栏
主要是继承实现Cefsharp的IRquestHandler对象,废话不多说上代码:publicclassrequest:IRequestHandler{publiceventAction<st...
来自: 年少时的博客
第一步:开发一个Servlet输出数据;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.Servl...
来自: xiaobiaobiao521的专栏
MSDN:获取或设置一个包装筛选器对象,该对象用于在传输之前修改 HTTP 实体主体。这个的关键在于实现筛选器对像,查看Filter接受的类型是Stream。所以可以自定义一个Stream类,当创建 ...
来自: weixin_30909575的博客
物联网大致可分为感知层、网络层、设备管理层、应用层等四个层次。其中最能体现物联网特征的,就是物联网的感知层。感知层由各种各样的传感器、协议转换网关、通信网关、智能终端等终端设备组成。这些终端大部分都是...
来自: tijos803的博客
本篇只谈安装,后续会深入讲解Redis,比如它的内存管理,快照,订阅等待。针对不同的用户,Redis有Windows和Linux两种环境安装,官网上下的是Statble版是Linux,大家一定要注意。...
来自: 鱼骨头科技
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次...
来自: 程序员宜春的博客
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私......
来自: 爱开发
7)Filter对Response的改变:HttpServletResponseWrapper的工作原理马 克-to-win:前面我们讲的知识,主要说的是由于Filter的参与,用户的访问路径被改变的...
来自: mark_to_win的专栏
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,...
来自: 帅地
标签一键保存:您必备的标签工具 当您打开多个标签时,通过标签一键保存可以立刻保存所有标签,当您下次想打开时,可以一键全部打开。 功能介绍: 1. 一键保存当前窗口所有标签 2. 一键打开保存的所有标签...
来自: wangyetao@linux_u1604:~$
实现原理普通http请求MyServletResponseWrapper重写HttpServletResponseWrapper的getWriter()返回MyPrintWriterMyPrintWr...
来自: 天下皆白
一.入门及硬件连接自从2017年12月10号收到在深圳比特跳动技术有限公司的淘宝网上购买的百度dueros人工智能-R01开发板,当拆开快递包裹的时候,我本以为可以到手就玩,结果当场就懵了,配件如下图...
来自: happy896235的博客
1. 继承HttpServletResponseWrapper 重新覆盖Response对象,用来获取response中的返回值package com.example.demo.wrapper;imp...
来自: aiyongbo123456的博客
createtableaaa(idbigintidentity(1,1)notnullPRIMARYkey,namenvarchar(255));navicat没办法给主键列,加identity,只能...
来自: mingwulipo的博客
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢...
来自: Nicky's blog
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。于是乎用h5 audio的加上js简单的播放器完工了。演示地点演示html代码如下` music 这个年纪 七月的风...
来自: qq_44210563的博客
[PyTorch]PyTorch中反卷积的用法 文章来源:https://www.jianshu.com/p/01577e86e506pytorch中的2D卷积层和2D反卷积层函数分别...
来自: 急流勇进
需求描述,Controller接口定义的返回实体类型,但是前端需要jsonp格式,就是传入callback参数时,对返回的数据进行包裹::形如callback(data),现在需要一个统一的方法对所有...
来自: rui15111的博客
点击蓝色“程序猿DD”关注我回复“资源”获取独家整理的学习资料!近日,又有一个开源项目加入了这个Java开源界大名鼎鼎的Apache基金会,开始进行孵化器。项目名称:AP......
来自: 程序猿DD
菜鸟独白Python语言非常优美,语法简洁而功能强大,容易上手,学好Python能干很多事情:比如爬虫,数据分析呀,机器学习啊,web开发,其实Python还能帮你赚钱,比如自己做一个量化分析的小工具...
来自: Python学习部落
快过年了,回家了,发个非技术博客吧。最近被百家号恶心到不行,搜了下屏蔽方法,在家懒得翻墙用谷歌,又懒得装插件设置屏蔽,找到了一个简单有效的方法,直接在搜索内容后边加-(baijiahao),效果还不错...
来自: 慢慢积累
1、四大组件是什么?Activity【活动】:用于表现功能。 Service【服务】:后台运行服务,不提供界面呈现。 BroadcastReceiver【广播接收器】:用来接收广播。 ContentP...
来自: dsd的博客
前几天我们项目总监给了我一个任务,就是将请求的接口数据进行压缩,以达到节省流量的目的。对于实现该功能,有以下思路:1.获取到response中的值,2.对数据进行gzip压缩(因为要求前端不变,所以只...
来自: 落尘
本期目录1.使用@Controller构造型2.实现控制器接口3.扩展AbstractController类4.为处理程序方法指定URL映射5.为处理程序方法指定HTTP请求方法6.将请求参数映射到处...
来自: 失控的狗蛋~
原始代码来源:https://github.com/amdegroot/ssd.pytorch我修改后的代码:https://github.com/Andy-zhujunwen/ssd-use-you...
来自: ZJE
应用HttpServletResponseWrapper对象,压缩响应正文内容。思路:通过filter向目标页面传递一个自定义的response对象。在自定义的response对象中,重写getOut...
来自: weixin_33947521的博客
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。声明:本文不会下关于Mybatis和JPA两个持久层框架哪个...
来自: 十步杀一人-千里不留行
其实从去年已经隐隐约约感觉到数据库的有变化,只是没有想到变得这么快。今年的一些事情实实在在地给了某些数据库重击,如果以前去某数据库还是喊喊,然后该用还用,今年从传统领域刮起的去某数据库的风,已经开始了...
来自: Leo的博客