Filter高级应用:
 Decorator模式 
 1)包装类需要和被包装对象 实现相同接口,或者继承相同父类
 2)包装类需要持有 被包装对象的引用 
  在包装类中定义成员变量,通过包装类构造方法,传入被包装对象 
 3)在包装类中,可以控制原来那些方法需要加强
 不需要加强 ,调用被包装对象的方法
 需要加强,编写增强代码逻辑 
 ServletRequestWrapper 和 HttpServletRequestWrapper 
 提供对request对象进行包装的方法,但是默认情况下每个方法都是调用原来request对象的方法,
 也就是说包装类并没有对request进行增强 
 如果要增强就可以在这两个包装类基础上,继承HttpServletRequestWrapper 和 HttpServletRequestWrapper 覆盖需要增强的方法即可
 6.完全解决get和post乱码的过滤器 
 在Filter中,对request对象进行包装,增强获得参数的方法 
 getParameter 
 getParameterValues
 getParameterMap
 参考代码:

 public class GenericEncodingFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 转型为与协议相关对象
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
// 对request包装增强
HttpServletRequest myrequest = new MyRequest(httpServletRequest);
chain.doFilter(myrequest, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
 // 自定义request对象
class MyRequest extends HttpServletRequestWrapper { private HttpServletRequest request; private boolean hasEncode; public MyRequest(HttpServletRequest request) {
super(request);// super必须写
this.request = request;
}
// 对需要增强方法 进行覆盖
@Override
public Map getParameterMap() {
// 先获得请求方式
String method = request.getMethod();
if (method.equalsIgnoreCase("post")) {
// post请求
try {
// 处理post乱码
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} else if (method.equalsIgnoreCase("get")) {
// get请求
Map<String, String[]> parameterMap = request.getParameterMap();
if (!hasEncode) { // 确保get手动编码逻辑只运行一次
for (String parameterName : parameterMap.keySet()) {
String[] values = parameterMap.get(parameterName);
if (values != null) {
for (int i = 0; i < values.length; i++) {
try {
// 处理get乱码
values[i] = new String(values[i]
.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
hasEncode = true;
}
return parameterMap;
}
return super.getParameterMap();
}
@Override
public String getParameter(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
if (values == null) {
return null;
}
return values[0]; // 取回参数的第一个值
}
@Override
public String[] getParameterValues(String name) {
Map<String, String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
return values;
}
}

增强Response对象,对响应数据进行压缩
 先说一下在Tomcat服务器内,提供对响应压缩 配置实现 
 在conf/server.xml 中 
 <Connector port="80" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443"/> 添加 compressableMimeType="text/html,text/xml,text/plain" compression="on"

 public class GzipFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 自定义缓冲区,重写response的getWriter和getOutputStream
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
// 字节缓存区
// 将数据写入内存数组中
final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
HttpServletResponse myresponse = new HttpServletResponseWrapper(
httpServletResponse) {
private PrintWriter out;
@Override
// 重写getWriter 流获得是对 getOutputStream 编码获得
public PrintWriter getWriter() throws IOException {
System.out.println("getWriter...");
if (out == null) {
// 确保PrintWriter只有一个对象,flushbuffer中输出缓冲区内容
out = new PrintWriter(new OutputStreamWriter(
byteArrayOutputStream, getCharacterEncoding()));
}
return out;
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
System.out.println("getOutputStream...");
return new ServletOutputStream() {
@Override
// 将数据写到哪
public void write(int b) throws IOException {
// 将响应数据 写入自定义缓存区
byteArrayOutputStream.write(b);
}
};
}
@Override
public void flushBuffer() throws IOException {
getOutputStream().flush();
getWriter().flush();
}
};
// 目标资源执行,只有目标资源执行后,才有响应数据
chain.doFilter(request, myresponse);
myresponse.flushBuffer();
// 目标资源已经执行过,数据已经在 byteArrayOutputStream 缓存区
byte[] data = byteArrayOutputStream.toByteArray(); // data是未压缩数据
System.out.println("未压缩数据长度:" + data.length);
// 读data数据进行压缩
byte[] gzipData = gzip(data);// gzipData是压缩后数据
System.out.println("压缩后数据长度:" + gzipData.length);
// 原来response 目的地是客户端浏览器
httpServletResponse.setHeader("Content-Encoding", "gzip");
httpServletResponse.setContentLength(gzipData.length);
httpServletResponse.getOutputStream().write(gzipData);
httpServletResponse.getOutputStream().flush();
}
// 对data数据进行gzip压缩
public byte[] gzip(byte[] data) {
// 定义字节缓存区,用gzip方式向缓存区写数据
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
try {
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(
arrayOutputStream);
gzipOutputStream.write(data);// 将原数据 压缩gzip格式写入新的缓存区\
gzipOutputStream.close();
arrayOutputStream.flush();
return arrayOutputStream.toByteArray();// 返回压缩后的内容
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("压缩失败!");
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}

天下代码一般仿写:http://blog.csdn.net/javadaddy/article/details/8142559

filter高级应用的更多相关文章

  1. Filter高级开发

    孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十三)——Filter高级开发 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以 ...

  2. javaweb学习总结(四十三)——Filter高级开发

    在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...

  3. javaweb学习总结——Filter高级开发

    在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...

  4. Servlet Filter 3

    11.MD5加密 /** * 使用md5的算法进行加密 */ public static String md5(String plainText) { byte[] secretBytes = nul ...

  5. 15.Filter(过滤器)

    1.管理所有WEB资源:(Jsp, Servlet, 静态图片文件或静态 html 文件等)文件等进行拦截,从而实现一些特殊的功能 2.Filter接口中有一个doFilter方法,当我们编写好Fil ...

  6. 【JavaWeb学习】过滤器Filter

    一.简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静 ...

  7. django 操作数据库--orm(object relation mapping)---models

    思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...

  8. 如何使用ASP.NET Web API OData在Oracle中使用Entity Framework 6.x Code-First方式开发 OData V4 Service

    环境: Visual Studio 2013 + .Net Framework 4.5.2 1.新建项目 2.安装OData,ODP.NET 安装的包: 下面是部分代码: using System; ...

  9. JavaWeb学习总结(转载)

    JavaWeb学习总结(五十三)--Web应用中使用JavaMail发送邮件      JavaWeb学习总结(五十二)--使用JavaMail创建邮件和发送邮件     JavaWeb学习总结(五十 ...

随机推荐

  1. poj2586 Y2K Accounting Bug(贪心)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=2586 ------ ...

  2. 合肥三洋股份,惠而浦家电携四大品牌-Take ,所有的市场

        大家都知道,数家电企业的日子并不好过.一方面,产品同质化竞争越发激烈.家电市场已进入了恶性价格战时代.还有一方面,消费者对家电产品的需求越发多元化.个性化.这意味着无法满足消费者需求的产品非常 ...

  3. 你好,C++(12)怎样管理多个类型同样性质同样的数据?3.6 数组

    3.6  数组 学过前面的基本数据类型之后,我们如今能够定义单个变量来表示单个的数据.比如,我们能够用int类型定义变量来表示公交车的216路:能够用float类型定义变量来表示西红柿3.5元一斤. ...

  4. Android(java)学习笔记215:多线程断点下载的原理(JavaSE实现)

    1. 为什么需要多线程下载?     服务器的资源有限,同时的平均地分配给每个客户端.开启的线程越多抢占的服务的资源就越多,下载的速度就越块. 2. 下载速度的限制条件? (1)你的电脑手机宽带的带宽 ...

  5. Android省电开发 浅析

    相信对于Android App省电的开发,一切性能优化都可以达到App的省电开发,所以一个省电的Android应用,性能优化占据很重要的位置.除此之外整理了几点关于Android应用省电的开发技巧. ...

  6. css sprint 生成工具 bg2css

    今天需要改个css sprint,之前使用过一个工具蛮好使,但是就是想不起叫什么名字,网上搜了很久,才再次找到,原来是bg2css,今天记录下,以备以后不时之需. 下载地址:http://www.cs ...

  7. myeclipse跟eclipse中使用github做版本控制工具

    今天早上花了一上午的时间,了解了在myeclipse跟eclipse中使用github. 好吧 说说怎么做的,让大伙少走一点路,我就简单描述下,需要软件的私信我 第一:下载git 第二:靠谱.但是pu ...

  8. DNX概述

    1. 什么是.NET执行环境 ? .NET Execution Environment(DNX) 是一个SDK 和运行时环境,它包含所有的你需要创建和运行.net应用程序的组件.它提供一个主机进程,C ...

  9. java mail 使用 gmail smtp 发送邮件

    smtp 服务器:smtp.gmail.com 使用ssl的端口:465 用户名:username@gmail.com 密码:password** 基本配置没有问题,关键在于Google对安全性要求非 ...

  10. 小试牛刀-嘿嘿,创建job了

    今天 周六,我写了这个存储过程.用意:检查 数据库中是否有 该类的 job,如果有那么取job_name  赋值给 job_old,    把job_old加上时间戳 改造成 job_new.那么jo ...