过滤器第二篇【编码、敏感词、压缩、转义过滤器】(三)

简介: 在上篇博文中,我们已经讲解了过滤器的基本概念,使用以及简单的Servlet应用了。这篇博文主要讲解过滤器的高级应用。。

测试

jsp代码:

  <form action="${pageContext.request.contextPath}/Servlet1" method="post">
        <input type="hidden" name="username" value="<h1>你好i好<h1>">
        <input type="submit" value="提交">
    </form>

Servlet代码:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String value = request.getParameter("username");
        response.getWriter().write(value);
    }

0.jpg

缓存数据到内存中

在前面我们已经做过了,让浏览器不缓存数据【验证码的图片是不应该缓存的】。

现在我们要做的是:缓存数据到内存中【如果某个资源重复使用,不轻易变化,应该缓存到内存中】

这个和压缩数据的Filter非常类似的,因为让数据不直接输出给浏览器,把数据用一个容器(ByteArrayOutputSteam)存起来。如果已经有缓存了,就取缓存的。没有缓存就执行目标资源!

增强response对象

class MyResponse extends HttpServletResponseWrapper {
    private ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    private PrintWriter printWriter ;
    private HttpServletResponse response;
    public MyResponse(HttpServletResponse response) {
        super(response);
        this.response = response;
    }
    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        //这个的ServletOutputSteam对象调用write()方法的时候,把数据是写在byteArrayOutputSteam上的
        return new MyServletOutputStream(byteArrayOutputStream);
    }
    @Override
    public PrintWriter getWriter() throws IOException {
        printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream, this.response.getCharacterEncoding()));
        return printWriter;
    }
    public byte[] getBuffer() {
        try {
            //防止数据在缓存中,要刷新一下!
            if (printWriter != null) {
                printWriter.close();
            }
            if (byteArrayOutputStream != null) {
                byteArrayOutputStream.flush();
                return byteArrayOutputStream.toByteArray();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
//增强ServletOutputSteam,让writer方法不把数据直接返回给浏览器
class MyServletOutputStream extends ServletOutputStream {
    private ByteArrayOutputStream byteArrayOutputStream;
    public MyServletOutputStream(ByteArrayOutputStream byteArrayOutputStream) {
        this.byteArrayOutputStream = byteArrayOutputStream;
    }
    //当调用write()方法的时候,其实是把数据写byteArrayOutputSteam上
    @Override
    public void write(int b) throws IOException {
        this.byteArrayOutputStream.write(b);
    }
}

过滤器

  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //定义一个Map集合,key为页面的地址,value为内存的缓存
        Map<String, byte[]> map = new HashMap<>();
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        //得到客户端想要请求的资源
        String uri = request.getRequestURI();
        byte[] bytes = map.get(uri);
        //如果有缓存,直接返回给浏览器就行了,就不用执行目标资源了
        if (bytes != null) {
            response.getOutputStream().write(bytes);
            return ;
        }
        //如果没有缓存,就让目标执行
        MyResponse myResponse = new MyResponse(response);
        chain.doFilter(request, myResponse);
        //得到目标资源想要发送给浏览器的数据
        byte[] b = myResponse.getBuffer();
        //把数据存到集合中
        map.put(uri, b);
        //把数据返回给浏览器
        response.getOutputStream().write(b);
    }

测试

尽管是刷新,获取得到的也是从缓存拿到的数据!

0.gif


目录
相关文章
|
17天前
|
JavaScript 前端开发 Java
如何使用这个正则表达式来验证一个字符串是否符合特定的格式要求?
如何使用这个正则表达式来验证一个字符串是否符合特定的格式要求?
|
1月前
|
JavaScript Java 容器
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
本文简要回顾了Servlet过滤器Filter的概念和使用,通过实例演示了如何创建过滤器以过滤请求字符编码,并解释了在web.xml中配置过滤器时使用`/`、`/*`和`/**`的区别。
servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别
|
4月前
分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤
分享JavaWeb中filter过滤器的案例妙用 - 脏话过滤/编码过滤/代码过滤
32 0
|
前端开发
前端学习案例3-正则概述-字符组和非字符组2
前端学习案例3-正则概述-字符组和非字符组2
68 0
前端学习案例3-正则概述-字符组和非字符组2
|
前端开发
前端学习案例2-正则概述-字符组和非字符组1
前端学习案例2-正则概述-字符组和非字符组1
74 0
前端学习案例2-正则概述-字符组和非字符组1
|
Web App开发 JavaScript 前端开发
小技巧!前端JS实现过滤指定内容~
小技巧!前端JS实现过滤指定内容~
|
缓存
过滤器第二篇【编码、敏感词、压缩、转义过滤器】(二)
在上篇博文中,我们已经讲解了过滤器的基本概念,使用以及简单的Servlet应用了。这篇博文主要讲解过滤器的高级应用。。
148 0
过滤器第二篇【编码、敏感词、压缩、转义过滤器】(二)
|
设计模式
过滤器第二篇【编码、敏感词、压缩、转义过滤器】(一)
在上篇博文中,我们已经讲解了过滤器的基本概念,使用以及简单的Servlet应用了。这篇博文主要讲解过滤器的高级应用。。
150 0
过滤器第二篇【编码、敏感词、压缩、转义过滤器】(一)
|
前端开发
前端必备正则处理方法
前端必备正则处理方法
836 0