一  过滤器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()方法。

  1. package com.cy.wrapper;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletRequestWrapper;
  5.  
  6. public class ReqWrapper extends HttpServletRequestWrapper{
  7.  
  8. public ReqWrapper(HttpServletRequest request) {
  9. super(request);
  10. }
  11.  
  12. @Override
  13. public String getHeader(String name) {
  14. if("If-Modified-Since".equalsIgnoreCase(name)){
  15. return null;
  16. }else{
  17. return super.getHeader(name);
  18. }
  19. }
  20.  
  21. }

HttpServletResponseWrapper

  1. package com.cy.wrapper;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6.  
  7. import javax.servlet.ServletOutputStream;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpServletResponseWrapper;
  10.  
  11. public class RespWrapper extends HttpServletResponseWrapper{
  12. //创建一个缓存字节流对象,用于缓存servlet写入的数据
  13. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  14. //创建一个自定义的字节输出流对象,提供给servlet调用。以便把数据写入缓存流对象
  15. MyOutputStream mos = new MyOutputStream(baos);
  16. //创建一个自定义的字符输出流对象,提供给servlet调用。以便把数据写入缓存流对象
  17. PrintWriter pw = new PrintWriter(baos);
  18.  
  19. public RespWrapper(HttpServletResponse response) {
  20. super(response);
  21. }
  22.  
  23. @Override
  24. public ServletOutputStream getOutputStream() throws IOException {
  25. return mos;
  26. }
  27.  
  28. @Override
  29. public PrintWriter getWriter() throws IOException {
  30. return pw;
  31. }
  32.  
  33. /**
  34. * 自定义一个ServletOutputStream的子类用于保存servlet端写入字节流数据
  35. * @author hellokitty燕
  36. *
  37. */
  38. private static class MyOutputStream extends ServletOutputStream{
  39. private ByteArrayOutputStream baos ;
  40.  
  41. public MyOutputStream(ByteArrayOutputStream baos){
  42. this.baos = baos;
  43. }
  44. @Override
  45. public void write(int b) throws IOException {
  46. baos.write(b);
  47. }
  48. @Override
  49. public void write(byte[] b, int off, int len) throws IOException {
  50. baos.write(b, off, len);
  51. }
  52. @Override
  53. public void write(byte[] b) throws IOException {
  54. baos.write(b);
  55. }
  56.  
  57. }
  58.  
  59. //将缓存流中的数据以String方式返回
  60. public String toString(){
  61. return baos.toString();
  62. }
  63. //将缓存流中的数据以字节数组方式返回
  64. public byte[] toByteArray(){
  65. return baos.toByteArray();
  66. }
  67.  
  68. }

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

  1. package com.cy.filter;
  2.  
  3. import java.io.IOException;
  4. import java.io.PrintWriter;
  5. import java.util.Date;
  6.  
  7. import javax.servlet.Filter;
  8. import javax.servlet.FilterChain;
  9. import javax.servlet.FilterConfig;
  10. import javax.servlet.ServletException;
  11. import javax.servlet.ServletRequest;
  12. import javax.servlet.ServletResponse;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15.  
  16. import com.cy.wrapper.ReqWrapper;
  17. import com.cy.wrapper.RespWrapper;
  18.  
  19. public class TextFilter implements Filter{
  20.  
  21. @Override
  22. public void destroy() {
  23. // TODO Auto-generated method stub
  24.  
  25. }
  26.  
  27. @Override
  28. public void doFilter(ServletRequest arg0, ServletResponse arg1,
  29. FilterChain arg2) throws IOException, ServletException {
  30.  
  31. ReqWrapper req = new ReqWrapper((HttpServletRequest)arg0);
  32. RespWrapper resp = new RespWrapper((HttpServletResponse)arg1);
  33.  
  34. arg2.doFilter(req, resp);
  35. arg1.setContentType("text/html;charset=utf-8");
  36. PrintWriter pw = arg1.getWriter();
  37. pw.print("<html>");
  38. pw.print("<head>");
  39. pw.print("</head>");
  40. pw.print("<body style='background-color:green'>");
  41. pw.print("<pre>");
  42. pw.print("============== date:"+new Date().toString()+"===================<br/><br/>");
  43. pw.print(resp.toString());
  44. pw.print("<br/><br/>==========================================================");
  45. pw.print("</pre>");
  46. pw.print("</body>");
  47. pw.print("</html>");
  48. pw.close();
  49.  
  50. }
  51.  
  52. @Override
  53. public void init(FilterConfig arg0) throws ServletException {
  54. // TODO Auto-generated method stub
  55.  
  56. }
  57.  
  58. }

Servlet

  1. package com.cy.servlet;
  2.  
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5.  
  6. import javax.servlet.ServletException;
  7. import javax.servlet.ServletOutputStream;
  8. import javax.servlet.http.HttpServlet;
  9. import javax.servlet.http.HttpServletRequest;
  10. import javax.servlet.http.HttpServletResponse;
  11.  
  12. public class TextServlet extends HttpServlet{
  13.  
  14. @Override
  15. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  16. throws ServletException, IOException {
  17. //获取刚才覆盖以后的字节数出流。
  18. ServletOutputStream sos = resp.getOutputStream();
  19. String uri = req.getRequestURI();
  20. String name = uri.substring(uri.lastIndexOf("/")+1);
  21. String path = "/text/"+name;
  22. //将相对路径转换为物理路径
  23. path = getServletContext().getRealPath(path);
  24. FileInputStream fis = new FileInputStream(path);
  25. byte[] b = new byte[100];
  26. int length = 0;
  27. while(-1!=(length = fis.read(b, 0, 100))){
  28. sos.write(b, 0, length);
  29. }
  30. sos.close();
  31. fis.close();
  32. }
  33.  
  34. @Override
  35. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  36. throws ServletException, IOException {
  37. doGet(req, resp);
  38. }
  39.  
  40. }

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <display-name>Filter</display-name>
  4. <welcome-file-list>
  5. <welcome-file>index.html</welcome-file>
  6. <welcome-file>index.htm</welcome-file>
  7. <welcome-file>index.jsp</welcome-file>
  8. <welcome-file>default.html</welcome-file>
  9. <welcome-file>default.htm</welcome-file>
  10. <welcome-file>default.jsp</welcome-file>
  11. </welcome-file-list>
  12.  
  13. <servlet>
  14. <servlet-name>s_text</servlet-name>
  15. <servlet-class>com.cy.servlet.TextServlet</servlet-class>
  16. </servlet>
  17.  
  18. <servlet-mapping>
  19. <servlet-name>s_text</servlet-name>
  20. <url-pattern>*.txt</url-pattern>
  21. </servlet-mapping>
  22.  
  23. <filter>
  24. <filter-name>text</filter-name>
  25. <filter-class>com.cy.filter.TextFilter</filter-class>
  26. </filter>
  27.  
  28. <filter-mapping>
  29. <filter-name>text</filter-name>
  30. <url-pattern>*.txt</url-pattern>
  31. </filter-mapping>
  32.  
  33. </web-app>

 应用HttpServletResponseWrapper对象,压缩内容。

  1. package com.cy.wrapper;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.UnsupportedEncodingException;
  6.  
  7. import javax.servlet.ServletOutputStream;
  8. import javax.servlet.http.HttpServletResponse;
  9. import javax.servlet.http.HttpServletResponseWrapper;
  10.  
  11. public class RespGzipWrapper extends HttpServletResponseWrapper {
  12.  
  13. public MyOutputStream mos=new MyOutputStream();
  14. public RespGzipWrapper(HttpServletResponse response) {
  15. super(response);
  16. }
  17.  
  18. @Override
  19. public ServletOutputStream getOutputStream() throws IOException {
  20. return mos;
  21. }
  22.  
  23. public class MyOutputStream extends ServletOutputStream{
  24. ByteArrayOutputStream baos=new ByteArrayOutputStream();
  25. @Override
  26. public void write(int b) throws IOException {
  27. baos.write(b);
  28. }
  29. @Override
  30. public void write(byte[] b) throws IOException {
  31. baos.write(b);
  32. }
  33. @Override
  34. public void write(byte[] b, int off, int len) throws IOException {
  35. baos.write(b, off, len);
  36. }
  37.  
  38. public String toString(String encode){
  39. try {
  40. return baos.toString(encode);
  41. } catch (UnsupportedEncodingException e) {
  42. e.printStackTrace();
  43. }
  44. return null;
  45.  
  46. }
  47.  
  48. }
  49.  
  50. }

filter

  1. package com.cy.filter;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.StringReader;
  6.  
  7. import javax.servlet.Filter;
  8. import javax.servlet.FilterChain;
  9. import javax.servlet.FilterConfig;
  10. import javax.servlet.ServletException;
  11. import javax.servlet.ServletRequest;
  12. import javax.servlet.ServletResponse;
  13. import javax.servlet.http.HttpServletRequest;
  14. import javax.servlet.http.HttpServletResponse;
  15.  
  16. import com.cy.wrapper.RespGzipWrapper;
  17.  
  18. public class GzipFilter implements Filter{
  19.  
  20. @Override
  21. public void destroy() {
  22.  
  23. }
  24.  
  25. @Override
  26. public void doFilter(ServletRequest arg0, ServletResponse arg1,
  27. FilterChain arg2) throws IOException, ServletException {
  28. HttpServletRequest req=(HttpServletRequest)arg0;
  29. String uri=req.getRequestURI();
  30. //获取读取文件后缀名
  31. String exName=uri.substring(uri.lastIndexOf("."));
  32. RespGzipWrapper rgw=new RespGzipWrapper((HttpServletResponse)arg1);
  33. //调用后面的资源
  34. arg2.doFilter(arg0, rgw);
  35. //用返回的字符串创建字符读取流
  36. StringReader sr=new StringReader(rgw.mos.toString("utf-8"));
  37. //根据上面读取的流创建缓存读取流
  38. BufferedReader br=new BufferedReader(sr);
  39. String line="";
  40. //创建压缩后的文件缓存区
  41. StringBuffer sb=new StringBuffer();
  42. while((line=br.readLine())!=null){
  43. //追加到缓存区
  44. sb.append(line.trim());
  45. }
  46. //设置压缩后的文件大小
  47. arg1.setContentLength(sb.toString().getBytes("iso-8859-1").length);
  48. //根据请求后缀名来设置请求头
  49. if(".html".equals(exName)){
  50. arg1.setContentType("text/html;charset="+rgw.getCharacterEncoding());
  51. }else if(".js".equals(exName)){
  52. arg1.setContentType("text/javascript;charset="+rgw.getCharacterEncoding());
  53. }else if(".css".equals(exName)){
  54. arg1.setContentType("text/css;charset="+rgw.getCharacterEncoding());
  55. }
  56. //响应到客户端浏览器
  57. arg1.getWriter().print(sb.toString());
  58. arg1.getWriter().close();
  59. }
  60.  
  61. @Override
  62. public void init(FilterConfig arg0) throws ServletException {
  63.  
  64. }
  65.  
  66. }

html;

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>index.html</title>
  5.  
  6. <meta name="keywords" content="keyword1,keyword2,keyword3">
  7. <meta name="description" content="this is my page">
  8. <meta name="content-type" content="text/html; charset=UTF-8">
  9.  
  10. <link rel="stylesheet" type="text/css" href="../css/index.css">
  11. <script type="text/javascript" src="../js/index.js"></script>
  12.  
  13. </head>
  14.  
  15. <body>
  16. This is my HTML page! <br>
  17. </body>
  18. </html>

css:

  1. *{
  2.  
  3. margin:;
  4. padding:;
  5. color:red;
  6. }

js

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

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <display-name>GZIP</display-name>
  4. <welcome-file-list>
  5. <welcome-file>index.html</welcome-file>
  6. <welcome-file>index.htm</welcome-file>
  7. <welcome-file>index.jsp</welcome-file>
  8. <welcome-file>default.html</welcome-file>
  9. <welcome-file>default.htm</welcome-file>
  10. <welcome-file>default.jsp</welcome-file>
  11. </welcome-file-list>
  12.  
  13. <filter>
  14. <filter-name>GzipFilter</filter-name>
  15. <filter-class>com.cy.filter.GzipFilter</filter-class>
  16. </filter>
  17. <filter-mapping>
  18. <filter-name>GzipFilter</filter-name>
  19. <url-pattern>/*</url-pattern>
  20. </filter-mapping>
  21. </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. android 数据库更新

    SQLiteOpenHelper封装       继承SQLiteOpenHelper类,在构造方法中分别需要传入Context,数据库名称,CursorFactory(一般传入null,为默认数据库 ...

  2. kafka_shell操作

    单机版 开启进程: ./bin/kafka-server-start.sh config/server.properties 查看topic列表: ./bin/kafka-topics.sh --li ...

  3. PB常用函数

    弹出窗口:messagebox() 基本写法:Messagebox('标题','内容') 完整写法: MessageBox ( '标题','内容',图标,按键,默认值) (1)其中标题与内容为要显示的 ...

  4. find的用法(完整)

    一.根据文件或者正则表达式进行匹配 1.列出当前目录(/.code)及子目录下所有文件和文件夹 find . 2.在当前目录(/.code)下查找以.pdf结尾的文件名 find .  -name & ...

  5. 关于DFS和BFS的理解 以及坐标的定义

    http://blog.csdn.net/bool_isprime/article/details/5803018DFS: 1: 坐标类型搜索 :这种类型的搜索题目通常来说简单的比较简单,复杂的通常在 ...

  6. Android-HttpClient-Get与Post请求登录功能

    HttpClient 是org.apache.http.* 包中的: 第一种方式使用httpclient-*.jar (需要在网上去下载httpclient-*.jar包) 把httpclient-4 ...

  7. 【C#】简单的发送socket字符串

    1 打开VS,新建一个C#窗口程序 2 添加按钮 3 写按钮的事件代码 双击这个按钮 进入代码界面 输入如下内容,注意IP和端口 private void button1_Click(object s ...

  8. JVM活学活用——GC算法 垃圾收集器

    概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本地方 ...

  9. [JavaScript] js实现保存文件到本地

    function fake_click(obj) { var ev = document.createEvent("MouseEvents"); ev.initMouseEvent ...

  10. Vue + Bootstrap 制作炫酷个人简历(二)

    没想到隔了这么久才来更新. 用vue做简历,不是非常适合,为什么呢. 因为简历没什么数据上的操作,一般都是静态的内容. 不过都说了用Vue来做,也只能强行续命了. 这里是我做好的成品  非一般简历 由 ...