过滤器压缩全站jsp

过滤器:
public class Gzip implements Filter {
public void destroy() {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletResponse resp=(HttpServletResponse) response;
MyResp myResp=new MyResp(resp);//包装过的response
chain.doFilter(request, myResp);//放行
byte[] srcBytes= myResp.getSrcByte();//获取源数据
ByteArrayOutputStream bOutStream=new ByteArrayOutputStream();//目标容器
GZIPOutputStream zipOutStream=new GZIPOutputStream(bOutStream);//压缩工具
zipOutStream.write(srcBytes);//写到容器中
zipOutStream.close();//如果不关闭,会在缓存中,不写出
byte[] descByte=bOutStream.toByteArray();
System.out.println("-------------------");
System.out.println("压缩前:"+srcBytes.length);
System.out.println("压缩后:"+ descByte.length);
System.out.println("-------------------");
//使用原生response输出
resp.setContentType("text/html;charset=utf-8");
resp.setHeader("Content-Encoding", "Gzip");
resp.setContentLength(srcBytes.length);
//输出
OutputStream out=resp.getOutputStream();
out.write(descByte);//关闭
}
public void init(FilterConfig filterConfig) throws ServletException {}
}
class MyResp extends HttpServletResponseWrapper
{
private PrintWriter outWrite;
private ByteArrayOutputStream srcByte;
//获取原生数据
public byte[] getSrcByte() {
if(outWrite!=null)//如果不关闭流,不会显示,因为数据在缓存中,没有写出
{
outWrite.close();
}
return srcByte.toByteArray();
}
public MyResp(HttpServletResponse response) {
super(response);
}
//包装getWrite()方法,jsp页面输出内容使用的是response.getWriter().write("")
//所以要包装
@Override
public PrintWriter getWriter() throws IOException {
srcByte=new ByteArrayOutputStream();//输出的源数据
outWrite=new PrintWriter(new OutputStreamWriter(srcByte,"utf-8"));
return outWrite;
}
}
如果过滤器需要过滤Servlet,则需要用response.getWriter().write("")输出,否则不会被过滤
response.setContentType("text/html;charset=utf-8");
String str="你好,同学;Hello World";
PrintWriter writer=response.getWriter();
writer.write(str);
writer.close();
如果Servlet中使用response.getOutputStream().write("")输出,则需要包装getOutputStream()方法
response.setContentType("text/html;charset=utf-8");
String str="你好,同学;Hello World";
String times=request.getParameter("times");
int n=Integer.valueOf(times);
OutputStream out=response.getOutputStream();
for (int i = 0; i < n; i++) {
out.write(str.getBytes("utf-8"));
}
out.close();
包装getOutputStream()方法
@Override
public ServletOutputStream getOutputStream() throws IOException {
srcByte =new ByteArrayOutputStream();//输出的源数据
ServletOutputStream out=new ServletOutputStream() {
@Override
public void write(int b) throws IOException {
srcByte.write(b);
}
};
return out;
}
过滤器压缩全站jsp的更多相关文章
- 【Java EE 学习 19】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】
一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: ...
- shiro:10个过滤器;10个jsp标签;5个@注解
10个过滤器 过滤器简称 对应的java类 anon org.apache.shiro.web.filter.authc.AnonymousFilter authc org.apache.shiro. ...
- 过滤器Filter(拦截jsp页面的跳转)案例:
创建一个 Filter , class类: 其继承于 接口 Filte(接口导包:import javax.servlet.Filter;) 在 web.xml 文件中配置并映射该 Filter. 其 ...
- javaweb的Filter过滤器设置全站编码
FIlter配置全站编码有一种方法是重写getParameter方法,也就是继承HttpServletRequestWrapper在重写getParameter方法,还有一种就是如下: public ...
- jsp提交表单数据乱码,内置对象,以及过滤器
jsp提交表单数据乱码解决方案 通过form表单给服务器提交数据的时候,如果提交的是中文数据,那么可能会出现乱码,如果表单的请求方式是post请求,那么可以使用如下方案解决乱码: 在调用getPara ...
- Servlet和JSP中的过滤器都是Java类
JSP 过滤器 Servlet和JSP中的过滤器都是Java类,它们存在的目的如下: 在请求访问后端资源时拦截它 管理从服务器返回给客户端的响应 下面列出了多种常用的过滤器类型: 认证过滤器 数据压缩 ...
- DATASNAP压缩过滤器的使用
ZLIBCOMPRESSION FILTER 作为范例,我们使用已随D2010提供的DataSnap过滤器.可用于在客户端和服务端压缩数据流.这里说的ZlibCompression过滤器可以在DbxC ...
- Web jsp开发学习——终极解决jsp中request和response中文乱码的问题(加个过滤器)
中文乱码真的很烦人的.而且每次都要写,可麻烦了,而且有时候写了还不一定管用,所以我们可以试试过滤器 1.每个jsp头上当然要写上utf8啦 <%@ page language="jav ...
- Servlet过滤器
Servlet过滤器 [TOC] 1.过滤器的基本概念 1.1.基本概念 过滤器(Filter)属于tomcat服务器中的Servlet功能.在普通的javaweb服务中,jsp中的请求要被Servl ...
随机推荐
- 使用js 在IE和火狐firfox 里动态增加select 的option
使用js 在IE和火狐firfox 里动态增加select 的option <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transition ...
- 活动倒计时代码(精确到毫秒)jquery插件
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 类似a:hover的伪类的注解
a:link { font-size: 14pt; text-decoration: underline; color: blue; } /*设置a对象在未被访问前的样式表属性 .*/ a:hover ...
- Python学习笔记整理(十)Python的if测试
if语句是选取要执行的操作. 一.if语句 1.通用格式 形式是if测试,后面跟着一个或多个可选的elif(else if)测试,以及一个最终选用的else块.测试和else部分可以结合嵌套语句块,缩 ...
- Linux_shell条件判断if中的-a到-z的意思
[ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则 ...
- Java比较两个日期的大小
public static String getComparedSBQDate(String yxqq,String starttime){ String str = starttime; Simpl ...
- 调试单片机内部扩展RAM
51单片机内部只有128字节的RAM(8051),而8052有256字节的RAM,低128字节RAM直接或间接寻址都可以,高128字节RAM与SRF特殊功能寄存器共用地址,SFR只能直接寻址,高128 ...
- SolrCloud 5.2.1 installation and configuration
虽然不是很有技术含量的事情,主要依靠的是阅读能力,然而知识的东西还是记录一下,以备后继待查. 环境相关 1. Server:h1,h2,h3 2. OS RHEL 6.2 3. Zookeeper 3 ...
- ubuntu安装使用kdevelop
vim是好用,但是有时候操作不那么人性化,用一个ide可能感觉比较好,ubuntu下面比较好的c/c++ ide出名的有kdevelop,Qt等. kdevelop安装: sudo apt-get u ...
- 8.2.1.3 Range Optimization
8.2.1.3 Range Optimization 范围访问方法使用一个单个的索引来检索表记录的自己,包含在一个或者索引值区间. 它可以用于一个单独的部分或者多个部分的索引,下面章节给出了一个详细的 ...