第七章 过滤器 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:/ ...
随机推荐
- ETL化的IOTA架构
经过这么多年的发展,已经从大数据1.0的BI/Datawarehouse时代,经过大数据2.0的Web/APP过渡,进入到了IOT的大数据3.0时代,而随之而来的是数据架构的变化. ▌Lambda架构 ...
- bootstrap阶段测验【答案】
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- springMVC一个Controller处理所有用户请求的并发问题
有状态和无状态的对象基本概念: 有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的.一般是prototype scope. 无状态对象(Stateless ...
- 8.ajax与django后台json数据的交互
1新建django项目名为json_ajax,应用名为app,在templates模板中新建ajax.html文件 ajax.html <!DOCTYPE html> <html l ...
- CentOS7下让Asp.Net Core的网站自动运行
一.安装Nginx yum install nginx 二.配置Nginx vi /etc/nginx/nginx.conf location / { proxy_pass http://127.0. ...
- 3.怎样将ASP.NET MVC应用程序发布到IIS
这一篇,教大家怎么将ASP.NET MVC应用程序发布到本地或者IIS中.打开上一篇创建的ASP.NET MVC 5.0应用程序.[PS:上一篇--->2.第一个ASP.NET MVC 5.0应 ...
- MVC+Nhibernate+spring.net(一)
所用数据库是我之前所写的Nhibernate入门篇的数据库https://www.cnblogs.com/pandorabox/p/PandoraBox.html 第一步:创建一个mvc项目 第二步: ...
- Lerning Entity Framework 6 ------ Introduction to TPH
Sometimes, you have created two models. They have the same parent class like this: public class Pers ...
- [HNOI2015]开店(树剖+主席树+标记永久化)
听说正解点分树?我不会就对了 此题是 \([LNOI2014]LCA\) 强化版,也是差分一下,转化为区间加区间和 不过权值有大小要求,那么我们按照权值排序,依次加入主席树,询问的时候 \(lower ...
- Java代码审计连载之—SQL注入
前言近日闲来无事,快两年都没怎么写代码了,打算写几行代码,做代码审计一年了,每天看代码都好几万行,突然发现自己都不会写代码了,真是很DT.想当初入门代码审计的时候真是非常难,网上几乎找不到什么java ...