一  过滤器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. 02:OC和C对比

    1.源文件对比 C语言中常见源文件.h头文件,.c文件 文件扩展名 源类型 .h 头文件,用于存放函数声明 .c C语言源文件,用于实现头文件中声明的方法 OC中的源文件.h头文件,.m与.mm的实现 ...

  2. Java学习--数组的定义和使用

    1. 数组分配了空间,未赋值 public class ArrayDemo01{ public static void main(String args[]){ int score[] = null ...

  3. unigui1404在delphi10.2.2安装

    unigui1404在delphi10.2.2安装 UNIGUI1404不能直接在DELPHI10.2.2下面编译安装,在10.2.1下面是可以的. 这里讲下怎样安装的方法: 1)执行FMSoft_u ...

  4. mysql 返回结果按照指定的id顺序返回

    mysql> ,,,,) order by field(id,,,,,) limit ,; +----+-------+------+ | id | name | sex | +----+--- ...

  5. Python 学习第三部分函数——第一章函数基础

    函数是python 为了代码最大程度的重用和最小代码冗余而提供的最基本的程序结构.使用它我们可以将复杂的系统分解为可管理的部件. 函数相关语句 def...          创建一个对象并将其赋值给 ...

  6. 类库中使用WPF 资源文件

    1.类库的 后缀.csproj文件,第一个<PropertyGroup>中加入下面代码 <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-b ...

  7. MySQL赋权

    MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利.grant select ...

  8. lucene使用与优化

    lucene使用与优化 1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿 ...

  9. eslint 配置及规则说明

    中文官方网站 安装 可以全局安装,也可以在项目下面安装. 如下是在项目中安装示例,只需要在 package.json 中添加如下配置,并进行安装: “eslint”: “^4.11.0” 配置 配置方 ...

  10. Liferay7 BPM门户开发之2: BPMN 2.0 规范入门 (Activiti BPMN extensions)

    Liferay最大的问题是BPM弱,如果做企业开发,BPM必不可少,所以直入主题,做个BPMN2入门. 本文参考地址:http://activiti.org/userguide/index.html# ...