一  过滤器API

由容器实现的接口
–javax.servlet.Filter
–javax.servlet.FilterChain
–javax.servlet.FilterConfig
四个包装器类
–javax.servlet.ServletRequestWrapper
–javax.servlet.ServletResponseWrapper
–javax.servlet.http.HttpServletRequestWrapper
–javax.servlet.http.HttpServletResponseWrapper

二  使用请求和响应包装器

示例:

假如我们有个老系统用来产生普通的ASCII文本格式的报表,并将报表保存在扩展名为.txt的文本文件中。现在我们想让这些报表可以通过浏览器访问。我们把文件保存在/text/a.txt。

如果 If-Modified-Since 值指定的时间内容资源没有更改过,那么服务器就不需要发送资源。

将请求包装在 HttpServletRequestWrapper 中 并覆盖 getHeader()方法。

 package com.cy.wrapper;

 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; public class ReqWrapper extends HttpServletRequestWrapper{ public ReqWrapper(HttpServletRequest request) {
super(request);
} @Override
public String getHeader(String name) {
if("If-Modified-Since".equalsIgnoreCase(name)){
return null;
}else{
return super.getHeader(name);
}
} }

HttpServletResponseWrapper

 package com.cy.wrapper;

 import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper; public class RespWrapper extends HttpServletResponseWrapper{
//创建一个缓存字节流对象,用于缓存servlet写入的数据
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//创建一个自定义的字节输出流对象,提供给servlet调用。以便把数据写入缓存流对象
MyOutputStream mos = new MyOutputStream(baos);
//创建一个自定义的字符输出流对象,提供给servlet调用。以便把数据写入缓存流对象
PrintWriter pw = new PrintWriter(baos); public RespWrapper(HttpServletResponse response) {
super(response);
} @Override
public ServletOutputStream getOutputStream() throws IOException {
return mos;
} @Override
public PrintWriter getWriter() throws IOException {
return pw;
} /**
* 自定义一个ServletOutputStream的子类用于保存servlet端写入字节流数据
* @author hellokitty燕
*
*/
private static class MyOutputStream extends ServletOutputStream{
private ByteArrayOutputStream baos ; public MyOutputStream(ByteArrayOutputStream baos){
this.baos = baos;
}
@Override
public void write(int b) throws IOException {
baos.write(b);
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
baos.write(b, off, len);
}
@Override
public void write(byte[] b) throws IOException {
baos.write(b);
} } //将缓存流中的数据以String方式返回
public String toString(){
return baos.toString();
}
//将缓存流中的数据以字节数组方式返回
public byte[] toByteArray(){
return baos.toByteArray();
} }

将文本格式转化成所需的html格式

 package com.cy.filter;

 import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date; 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; import com.cy.wrapper.ReqWrapper;
import com.cy.wrapper.RespWrapper; public class TextFilter implements Filter{ @Override
public void destroy() {
// TODO Auto-generated method stub } @Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException { ReqWrapper req = new ReqWrapper((HttpServletRequest)arg0);
RespWrapper resp = new RespWrapper((HttpServletResponse)arg1); arg2.doFilter(req, resp);
arg1.setContentType("text/html;charset=utf-8");
PrintWriter pw = arg1.getWriter();
pw.print("<html>");
pw.print("<head>");
pw.print("</head>");
pw.print("<body style='background-color:green'>");
pw.print("<pre>");
pw.print("============== date:"+new Date().toString()+"===================<br/><br/>");
pw.print(resp.toString());
pw.print("<br/><br/>==========================================================");
pw.print("</pre>");
pw.print("</body>");
pw.print("</html>");
pw.close(); } @Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub } }

Servlet

 package com.cy.servlet;

 import java.io.FileInputStream;
import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class TextServlet extends HttpServlet{ @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取刚才覆盖以后的字节数出流。
ServletOutputStream sos = resp.getOutputStream();
String uri = req.getRequestURI();
String name = uri.substring(uri.lastIndexOf("/")+1);
String path = "/text/"+name;
//将相对路径转换为物理路径
path = getServletContext().getRealPath(path);
FileInputStream fis = new FileInputStream(path);
byte[] b = new byte[100];
int length = 0;
while(-1!=(length = fis.read(b, 0, 100))){
sos.write(b, 0, length);
}
sos.close();
fis.close();
} @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
} }

web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Filter</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <servlet>
<servlet-name>s_text</servlet-name>
<servlet-class>com.cy.servlet.TextServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>s_text</servlet-name>
<url-pattern>*.txt</url-pattern>
</servlet-mapping> <filter>
<filter-name>text</filter-name>
<filter-class>com.cy.filter.TextFilter</filter-class>
</filter> <filter-mapping>
<filter-name>text</filter-name>
<url-pattern>*.txt</url-pattern>
</filter-mapping> </web-app>

 应用HttpServletResponseWrapper对象,压缩内容。

 package com.cy.wrapper;

 import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException; import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper; public class RespGzipWrapper extends HttpServletResponseWrapper { public MyOutputStream mos=new MyOutputStream();
public RespGzipWrapper(HttpServletResponse response) {
super(response);
} @Override
public ServletOutputStream getOutputStream() throws IOException {
return mos;
} public class MyOutputStream extends ServletOutputStream{
ByteArrayOutputStream baos=new ByteArrayOutputStream();
@Override
public void write(int b) throws IOException {
baos.write(b);
}
@Override
public void write(byte[] b) throws IOException {
baos.write(b);
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
baos.write(b, off, len);
} public String toString(String encode){
try {
return baos.toString(encode);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null; } } }

filter

 package com.cy.filter;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader; 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; import com.cy.wrapper.RespGzipWrapper; public class GzipFilter implements Filter{ @Override
public void destroy() { } @Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)arg0;
String uri=req.getRequestURI();
//获取读取文件后缀名
String exName=uri.substring(uri.lastIndexOf("."));
RespGzipWrapper rgw=new RespGzipWrapper((HttpServletResponse)arg1);
//调用后面的资源
arg2.doFilter(arg0, rgw);
//用返回的字符串创建字符读取流
StringReader sr=new StringReader(rgw.mos.toString("utf-8"));
//根据上面读取的流创建缓存读取流
BufferedReader br=new BufferedReader(sr);
String line="";
//创建压缩后的文件缓存区
StringBuffer sb=new StringBuffer();
while((line=br.readLine())!=null){
//追加到缓存区
sb.append(line.trim());
}
//设置压缩后的文件大小
arg1.setContentLength(sb.toString().getBytes("iso-8859-1").length);
//根据请求后缀名来设置请求头
if(".html".equals(exName)){
arg1.setContentType("text/html;charset="+rgw.getCharacterEncoding());
}else if(".js".equals(exName)){
arg1.setContentType("text/javascript;charset="+rgw.getCharacterEncoding());
}else if(".css".equals(exName)){
arg1.setContentType("text/css;charset="+rgw.getCharacterEncoding());
}
//响应到客户端浏览器
arg1.getWriter().print(sb.toString());
arg1.getWriter().close();
} @Override
public void init(FilterConfig arg0) throws ServletException { } }

html;

 <!DOCTYPE html>
<html>
<head>
<title>index.html</title> <meta name="keywords" content="keyword1,keyword2,keyword3">
<meta name="description" content="this is my page">
<meta name="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" href="../css/index.css">
<script type="text/javascript" src="../js/index.js"></script> </head> <body>
This is my HTML page! <br>
</body>
</html>

css:

 *{

     margin:;
padding:;
color:red;
}

js

window.onload=function(){ alert("hello"); };

web.xml

 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>GZIP</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list> <filter>
<filter-name>GzipFilter</filter-name>
<filter-class>com.cy.filter.GzipFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>GzipFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

最终结果:

。。。。

第七章 过滤器 Filter(二)的更多相关文章

  1. 第七章 过滤器基础 Filter

    简介:SUN从Servlet2.3开始添加一项激动人心的功能,就是过滤器(Filter).WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图 ...

  2. 第六章 过滤器Filter

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

  3. 一、变量.二、过滤器(filter).三、标签(tag).四、条件分支tag.五、迭代器tag.六、自定义过滤器与标签.七、全系统过滤器(了解)

    一.变量 ''' 1.视图函数可以通过两种方式将变量传递给模板页面 -- render(request, 'test_page.html', {'变量key1': '变量值1', ..., '变量ke ...

  4. Java Spring Boot VS .NetCore (二)实现一个过滤器Filter

    Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...

  5. JavaWeb学习笔记(二十二)—— 过滤器filter

    一.什么是过滤器 过滤器filter是JavaWeb三大组件之一,它与Servlet很相似!不过过滤器是用来拦截请求的,而不是处理请求的.WEB开发人员通过Filter技术,对web服务器管理的所有w ...

  6. SpringBoot+Shiro学习(七):Filter过滤器管理

    SpringBoot+Shiro学习(七):Filter过滤器管理 Hiwayz 关注  0.5 2018.09.06 19:09* 字数 1070 阅读 5922评论 1喜欢 20 先从我们写的一个 ...

  7. sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)

    第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的  DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...

  8. 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...

  9. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二) 代码工程地址: https:/ ...

随机推荐

  1. Linq动态查询与模糊查询 ---转

    Linq动态查询与模糊查询(带源码示例) 继LINQ动态组合查询PredicateExtensions讲解 ----- 在用上面的方法时遇到了些问题 解决 LINQ to Entities 不支持 L ...

  2. Java数据类型、赋值、类型转换、==运算

    数据类型 基本数据类型:即int/char等这样的数值类型,共8种 引用类型:除了基本数据类型之外都是引用类型:包括API中的类:如String.File:也包括自定义的类:如Personal.ABC ...

  3. 基于MATLAB的Sobel边缘检测算法实现

    图像边缘就是图像灰度值突变的地方,也就是图像在该部分的像素值变化速度非常之快,就比如在坐标轴上一条曲线有刚开始的平滑突然来个大转弯,在变化出的导数非常大. Sobel算子主要用作边缘检测,它是一离散型 ...

  4. FNDLOAD使用大全

    FNDLOAD使用大全   Syntax FNDLOAD [username/password] 0 Y [mode] [configuration file] [target data file] ...

  5. FormatSQL

    核心提示:在一些论坛,常看到有人拼接SQL的时候,喜欢直接硬拼,结果就是出现一大堆加号和单引号,不仅写起来麻烦(你得小心该连续写多少个单引号),SQL的可读性也相当差....稍微好一点的方法是,使用Q ...

  6. 数据单位bit byte kb Mb Gb

    8 bit = 1 byte 2^10 bytes = 1 kb 2^10 kb = 1 Mb 2^10 Mb = 1Gb 2^32 bit = 2^2 * 2^10 * 2^10 * 2^10 bi ...

  7. MacOS卸载Jenkins安装包

    /Library/Application\ Support/Jenkins/Uninstall.command

  8. 键'attachdbfilename'的值无效。

    ---恢复内容开始--- ---恢复内容结束---

  9. WPF学习笔记(3):ListView根据内容自动调整列宽

    DataGrid中,只要不设置DataGrid的宽度和列宽度,或者将宽度设置为Auto,那么表格就会根据内容自动调整宽度,以显示所有内容.但如果是ListView,按以上方法设置,却达不到列宽自动调整 ...

  10. 第一章 在.net mvc生成EF入门

    一. 打开Visual Studio 2017(我使用的是2017) 新建一个mvc项目 命名为StudentEntity 二.1)建立完项目后在项目中右击选择新建项,找到ADO.NET实体数据模型 ...