第七章 过滤器 Filter(二)
一 过滤器API
二 使用请求和响应包装器
示例:
假如我们有个老系统用来产生普通的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(二)的更多相关文章
- 第七章 过滤器基础 Filter
简介:SUN从Servlet2.3开始添加一项激动人心的功能,就是过滤器(Filter).WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图 ...
- 第六章 过滤器Filter
Filter概述 Filter不用于客户端请求,只用于对request,response进行修改或对context,session,request事件进行监听. 1.概述 如上图,多个filter组成 ...
- 一、变量.二、过滤器(filter).三、标签(tag).四、条件分支tag.五、迭代器tag.六、自定义过滤器与标签.七、全系统过滤器(了解)
一.变量 ''' 1.视图函数可以通过两种方式将变量传递给模板页面 -- render(request, 'test_page.html', {'变量key1': '变量值1', ..., '变量ke ...
- Java Spring Boot VS .NetCore (二)实现一个过滤器Filter
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- JavaWeb学习笔记(二十二)—— 过滤器filter
一.什么是过滤器 过滤器filter是JavaWeb三大组件之一,它与Servlet很相似!不过过滤器是用来拦截请求的,而不是处理请求的.WEB开发人员通过Filter技术,对web服务器管理的所有w ...
- SpringBoot+Shiro学习(七):Filter过滤器管理
SpringBoot+Shiro学习(七):Filter过滤器管理 Hiwayz 关注 0.5 2018.09.06 19:09* 字数 1070 阅读 5922评论 1喜欢 20 先从我们写的一个 ...
- sql 入门经典(第五版) Ryan Stephens 学习笔记 (第六,七,八,九,十章,十一章,十二章)
第六章: 管理数据库事务 事务 是 由第五章 数据操作语言完成的 DML ,是对数据库锁做的一个操作或者修改. 所有事务都有开始和结束 事务可以被保存和撤销 如果事务在中途失败,事务中的任何部分都不 ...
- 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记
注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第七章:在Direct3D中绘制(二) 代码工程地址: https:/ ...
随机推荐
- android 数据库更新
SQLiteOpenHelper封装 继承SQLiteOpenHelper类,在构造方法中分别需要传入Context,数据库名称,CursorFactory(一般传入null,为默认数据库 ...
- kafka_shell操作
单机版 开启进程: ./bin/kafka-server-start.sh config/server.properties 查看topic列表: ./bin/kafka-topics.sh --li ...
- PB常用函数
弹出窗口:messagebox() 基本写法:Messagebox('标题','内容') 完整写法: MessageBox ( '标题','内容',图标,按键,默认值) (1)其中标题与内容为要显示的 ...
- find的用法(完整)
一.根据文件或者正则表达式进行匹配 1.列出当前目录(/.code)及子目录下所有文件和文件夹 find . 2.在当前目录(/.code)下查找以.pdf结尾的文件名 find . -name & ...
- 关于DFS和BFS的理解 以及坐标的定义
http://blog.csdn.net/bool_isprime/article/details/5803018DFS: 1: 坐标类型搜索 :这种类型的搜索题目通常来说简单的比较简单,复杂的通常在 ...
- Android-HttpClient-Get与Post请求登录功能
HttpClient 是org.apache.http.* 包中的: 第一种方式使用httpclient-*.jar (需要在网上去下载httpclient-*.jar包) 把httpclient-4 ...
- 【C#】简单的发送socket字符串
1 打开VS,新建一个C#窗口程序 2 添加按钮 3 写按钮的事件代码 双击这个按钮 进入代码界面 输入如下内容,注意IP和端口 private void button1_Click(object s ...
- JVM活学活用——GC算法 垃圾收集器
概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本地方 ...
- [JavaScript] js实现保存文件到本地
function fake_click(obj) { var ev = document.createEvent("MouseEvents"); ev.initMouseEvent ...
- Vue + Bootstrap 制作炫酷个人简历(二)
没想到隔了这么久才来更新. 用vue做简历,不是非常适合,为什么呢. 因为简历没什么数据上的操作,一般都是静态的内容. 不过都说了用Vue来做,也只能强行续命了. 这里是我做好的成品 非一般简历 由 ...