过滤器第二篇【高级应用】

前言

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

编码过滤器

目的:解决全站的乱码问题

开发过滤器


    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

        //将request和response强转成http协议的
        HttpServletRequest httpServletRequest = (HttpServletRequest) req;
        HttpServletResponse httpServletResponse = (HttpServletResponse) resp;

        httpServletRequest.setCharacterEncoding("UTF-8");
        httpServletResponse.setCharacterEncoding("UTF-8");
        httpServletResponse.setContentType("text/html;charset=UTF-8");

        chain.doFilter(httpServletRequest, httpServletResponse);
    }

第一次测试

Servlet1中向浏览器回应中文数据,没有出现乱码。


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.getWriter().write("看完博客点赞!");

    }

这里写图片描述


分析

上面的过滤器是不完善的,因为浏览器用get方式提交给服务器的中文数据,单单靠上面的过滤器是无法完成的!

那么我们需要怎么做呢??我们之前解决get方式的乱码问题是这样的:使用request获取传递过来的数据,经过ISO 8859-1反编码获取得到不是乱码的数据(传到Servlet上的数据已经被ISO 8859-1编码过了,反编码就可以获取原来的数据),再用UTF-8编码,得到中文数据!

参考我之前的博文:http://blog.youkuaiyun.com/hon_3y/article/details/54632004#t9

在Servlet获取浏览器以GET方式提交过来的中文是乱码的根本原因是:getParameter()方法是以ISO 8859-1的编码来获取浏览器传递过来的数据的,得到的是乱码

既然知道了根本原因,那也好办了:过滤器传递的request对象,使用getParameter()方法的时候,获取得到的是正常的中文数据

也就是说,sun公司为我们提供的request对象是不够用的,因为sun公司提供的request对象使用getParameter()获取get方式提交过来的数据是乱码,于是我们要增强request对象(使得getParameter()获取得到的是中文)!

增强request对象

增强request对象,我们要使用包装设计模式!

包装设计模式的五个步骤:

  • 1、实现与被增强对象相同的接口
  • 2、定义一个变量记住被增强对象
  • 3、定义一个构造器,接收被增强对象
  • 4、覆盖需要增强的方法
  • 5、对于不想增强的方法,直接调用被增强对象(目标对象)的方法

sun公司也知道我们可能对request对象的方法不满意,于是提供了HttpServletRequestWrapper类给我们实现(如果实现HttpServletRequest接口的话,要实现太多的方法了!)



    class MyRequest extends HttpServletRequestWrapper {

        private HttpServletRequest request;

        public MyRequest(HttpServletRequest request) {
            super(request);
            this.request = request;
        }

        @Override
        public String getParameter(String name) {
            String value = this.request.getParameter(name);

            if (value == null) {
                return null;
            }

            //如果不是get方法的,直接返回就行了
            if (!this.request.getMethod().equalsIgnoreCase("get")) {
                return null;
            }

            try {

                //进来了就说明是get方法,把乱码的数据
                value = new String(value.getBytes("ISO8859-1"), this.request.getCharacterEncoding());
                return value ;

            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();

                throw new RuntimeException("不支持该编码");
            }

        }
    }

将被增强的request对象传递给目标资源,那么目标资源使用request调用getParameter()方法的时候,获取得到的就是中文数据,而不是乱码了!


        //将request和response强转成http协议的
        HttpServletRequest httpServletRequest = (HttpServletRequest) req;
        HttpServletResponse httpServletResponse = (HttpServletResponse) resp;

        httpServletRequest.setCharacterEncoding("UTF-8");
        httpServletResponse.setCharacterEncoding("UTF-8");
        httpServletResponse.setContentType("text/html;charset=UTF-8");

        MyRequest myRequest = new MyRequest(httpServletRequest);

        //传递给目标资源的request是被增强后的。
        chain.doFilter(myRequest, httpServletResponse);

第二次测试

  • 使用get方式传递中文数据给服务器

<form action="${pageContext.request.contextPath}/Servlet1" method="get">

    <input type="hidden" name="username" value="中国">


    <input type="submit" value="提交">
</form>

这里写图片描述


敏感词的过滤器

如果用户输入了敏感词(傻b、尼玛、操蛋等等不文明语言时),我们要将这些不文明用于屏蔽掉,替换成符号!

要实现这样的功能也很简单,用户输入的敏感词肯定是在getParameter()获取的,我们在getParameter()得到这些数据的时候,判断有没有敏感词汇,如果有就替换掉就好了!简单来说:也是要增强request对象

增强request对象


    class MyDirtyRequest extends HttpServletRequestWrapper {

        HttpServletRequest request;

        //定义一堆敏感词汇
        private List<String> list = Arrays.asList("傻b", "尼玛", "操蛋");

        public MyDirtyRequest(HttpServletRequest request) {
            super(request);
            this.request = request;
        }

        @Override
        public String getParameter(String name) {

            String value = this.request.getParameter(name);

            if (value == null) {
                return null;
            }

            //遍历list集合,看看获取得到的数据有没有敏感词汇
            for (String s : list) {

                if (s.equals(value)) {
                    value = "*****";
                }
            }

            return value ;
        }
    }

开发过滤器


    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

        //将request和response强转成http协议的
        HttpServletRequest httpServletRequest = (HttpServletRequest) req;
        HttpServletResponse httpServletResponse = (HttpServletResponse) resp;

        MyDirtyRequest dirtyRequest = new MyDirtyRequest(httpServletRequest);

        //传送给目标资源的是被增强后的request对象
        chain.doFilter(dirtyRequest, httpServletResponse);
    }

测试

这里写图片描述


压缩资源过滤器

按照过滤器的执行顺序:执行完目标资源,过滤器后面的代码还会执行。所以,我们在过滤器中可以获取执行完目标资源后的response对象!

我们知道sun公司提供的response对象调用write()方法,是直接把数据返回给浏览器的。我们要想实现压缩的功能,write()方法就不能直接把数据写到浏览器上!

这和上面是类似的,过滤器传递给目标资源的response对象就需要被我们增强,使得目标资源调用writer()方法的时候不把数据直接写到浏览器上!

增强response对象

response对象可能会使用PrintWriter或者ServletOutputStream对象来调用writer()方法的,所以我们增强response对象的时候,需要把getOutputSteam和getWriter()重写


    class MyResponse extends HttpServletResponseWrapper{

        HttpServletResponse response;
        public MyResponse(HttpServletResponse response) {
            super(response);
            this.response = response;
        }


        @Override
        public ServletOutputStream getOutputStream() throws IOException {
            return super.getOutputStream();
        }

        @Override
        public PrintWriter getWriter() throws IOException {
            return super.getWriter();
        }
    }

接下来,ServletOutputSteam要调用writer()方法,使得它不会把数据写到浏览器上。这又要我们增强一遍了!

增强ServletOutputSteam


    /*增强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);

        }
    }

增强PrintWriter

PrintWriter对象就好办了,它本来就是一个包装类,看它的构造方法,我们直接可以把ByteArrayOutputSteam传递给PrintWriter上。

这里写图片描述


    @Override
    public PrintWriter getWriter() throws IOException {
        printWriter = new PrintWriter(new OutputStreamWriter(byteArrayOutputStream, this.response.getCharacterEncoding()));

        return printWriter;
    }

获取缓存数据

我们把数据都写在了ByteArrayOutputSteam上了,应该提供方法给外界过去缓存中的数据!


    public byte[] getBuffer() {

        try {

            //防止数据在缓存中,要刷新一下!
            if (printWriter != null) {
                printWriter.close();
            }
            if (byteArrayOutputStream != null) {
                byteArrayOutputStream.flush();
                return byteArrayOutputStream.toByteArray();
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

增强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;
    }
}

过滤器


    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {


        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        MyResponse myResponse = new MyResponse(response);

        //把被增强的response对象传递进去,目标资源调用write()方法的时候就不会直接把数据写在浏览器上了
        chain.doFilter(request, myResponse);

        //得到目标资源想要返回给浏览器的数据
        byte[] bytes = myResponse.getBuffer();

        //输出原来的大小
        System.out.println("压缩前:"+bytes.length);


        //使用GZIP来压缩资源,再返回给浏览器
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
        gzipOutputStream.write(bytes);

        //得到压缩后的数据
        byte[] gzip = byteArrayOutputStream.toByteArray();

        System.out.println("压缩后:" + gzip.length);

        //还要设置头,告诉浏览器,这是压缩数据!
        response.setHeader("content-encoding", "gzip");
        response.setContentLength(gzip.length);
        response.getOutputStream().write(gzip);

    }

测试

  • 在Servlet上输出一大段文字:
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.getWriter().write("fdshfidsuhfidusfhuidsfhuidshdsuifhsd" +
                "uifhsduifffffdshfidsuhfidusfhuidsfhuidshdsuif" +
                "hsduifhsduifffffdshfidsuhfidusfhuidsfhuidshd" +
                "suifhsduifhsduifffffdshfidsuhfidusfhuidsfhuidsh" +
                "dsuifhsduifhsduifffffdshfidsuhfidusfhuidsfhuids" +
                "hdsuifhsduifhsduifffffdshfidsuhfidusfhuidsfhuid" +
                "shdsuifhsduifhsduiffdshfidsuhfidusfhuidsfhuids" +
                "hdsuifhsduifhsduifffffdshfidsuhfidusfhuidsfhui" +
                "dshdsuifhsduifhsduifffffdshfidsuhfidusfhuidsfh" +
                "uidshdsuifhsduifhsduifffffdshfidsuhfidusfhuids" +
                "fhuidshdsuifhsduifhsduifffffdshfidsuhfidusfhuid" +
                "sfhuidshdsuifhsduifhsduifffffdshfidsuhfidusfhui" +
                "dsfhuidshdsuifhsduifhsduifffffdshfidsuhfidusfh" +
                "uidsfhuidshdsuifhsduifhsduifffffdshfidsuhfidusf" +
                "huidsfhuidshdsuifhsduifhsduifffffdshfidsuhfidus" +
                "fhuidsfhuidshdsuifhsduifhsduifffffdshfidsuhfid" +
                "usfhuidsfhuidshdsuifhsduifhsduifffffdshfidsuhf" +
                "idusfhuidsfhuidshdsuifhsduifhsd" +
                "uifffffdshfidsuhfidusfhuidsfhuidshdsuifhsduifhsduifffffff");

    }
  • 效果:

这里写图片描述


HTML转义过滤器

只要把getParameter()获取得到的数据转义一遍,就可以完成功能了。

增强request



class MyHtmlRequest extends HttpServletRequestWrapper{

    private HttpServletRequest request;

    public MyHtmlRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }


    @Override
    public String getParameter(String name) {

        String value = this.request.getParameter(name);
        return this.Filter(value);

    }

    public String Filter(String message) {
        if (message == null)
            return (null);

        char content[] = new char[message.length()];
        message.getChars(0, message.length(), content, 0);
        StringBuffer result = new StringBuffer(content.length + 50);
        for (int i = 0; i < content.length; i++) {
            switch (content[i]) {
                case '<':
                    result.append("&lt;");
                    break;
                case '>':
                    result.append("&gt;");
                    break;
                case '&':
                    result.append("&amp;");
                    break;
                case '"':
                    result.append("&quot;");
                    break;
                default:
                    result.append(content[i]);
            }
        }
        return (result.toString());

    }

}

过滤器





    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {



        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        MyHtmlRequest myHtmlRequest = new MyHtmlRequest(request);

        //传入的是被增强的request!
        chain.doFilter(myHtmlRequest, response);

    }

测试

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);

    }

这里写图片描述


缓存数据到内存中

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

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

这个和压缩数据的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);


    }

测试

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

这里写图片描述


<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
HBase高级特性:过滤器(二) 1.过滤器执行步骤step1:客户端创建Scan过滤器;step2:发送过滤器数据的序列化Scan;使用过滤器对Scan进行序列化,并同时使用Scan和内部扫描。 阅读详情

相关推荐

咱们继续学Java——高级篇 第一百七十九篇:之Java高级Swing编程之格式化文本框的高级应用

在Java编程的学习道路上,我们一路同行,不断深入探索知识的每一个细节。今天,我们将继续深入学习Java高级Swing编程中关于格式化文本框的高级应用部分,包括过滤器的更多用途、校验器的使用、其他标准格式器以及定制格式器等内容,帮助大家进一步提升在处理格式化文本输入方面的能力,打造更加健壮、用户友好的应用程序。

wj_rdk的博客 2159

我的世界java版进不去服务器_Minecraft-Java版服务器常见报错解决方案

Can't resolve hostname服务器IP输入错误,或者目前网络状态极差Connection refused: connect寻找不到服务器,或者服务器关闭中,建议检测IP是否正确Connection Timed Out服务器或者你的网络极差,或者服务器正在执行大型数据计算,例如使用Worldedit插件编辑大量方块时Failed to login: User not premium ...

weixin_32925455的博客 3万+

高级数据结构应用:并查集、跳表、布隆过滤器与缓存结构

并查集是一种用于管理不相交集合的树形结构,通过路径压缩和按秩合并优化,可以实现近乎常数时间的操作复杂度。它在处理连通性问题、查找等价关系和构建最小生成树等场景中有广泛应用。跳表是一种随机化的多层链表结构,在保持插入删除操作简单的同时,实现了对数级别的查找复杂度。它被用于实现有序集合、数据库索引以及作为平衡树的替代方案。布隆过滤器是一种空间效率极高的概率型数据结构,可以快速判断元素是否可能存在于集合中。它广泛应用于缓存过滤、重复检测、拼写检查等需要空间高效的场景。缓存结构。

刘念卿的博客 892

Minecraft服务器连接错误排查与合规管理方案详解

在Minecraft服务器运维中,网络连接异常是常见的技术挑战。理解TCP/IP协议栈的工作原理是基础,当客户端与服务器通信时,连接建立、数据包交换和会话维持等环节都可能出现问题。从技术原理层面看,`connection reset`这类错误通常意味着TCP连接被对端异常关闭,可能源于服务器进程崩溃、防火墙规则拦截或网络设备故障。其技术价值在于帮助管理员快速定位网络层或应用层的故障点,避免服务中断。在Minecraft服务器生态中,这直接关系到玩家体验和服务器稳定性。应用场景涵盖服务器部署、日常运维和故障恢

weixin_32175665的博客 434

Wireshark显示过滤器的高级应用

本篇博客深入探讨了Wireshark中显示过滤器的使用方法,包括如何精确地筛选出特定的数据包、使用逻辑运算符组合过滤条件、利用范围语法提取数据包字段、以及隐藏字段的使用和显示。通过具体的例子和详细解释,帮助读者在实际网络分析中更好地运用Wireshark的高级过滤功能。

weixin_28840811的博客 630

Java Web过滤器与JavaBean的实战应用

本文还有配套的精品资源,点击获取 简介:过滤器是Java Web开发中的关键组件,用于请求和响应的预处理与后处理。它通过实现javax.servlet.Filter接口,在web.xml中配置执行顺序和URL模式,具有init(), doFilter(), 和 destroy()生命周期方法。JavaBean则是Java中用于封装业务逻辑的标准对象。在过滤器中使用JavaB...

weixin_33205138的博客 1060

Web基础笔记Day06 过滤器

过滤器 Filter基础 Filter,Servlet,Listener是Servlet规范的三大组件。 Filter过滤器,在请求到达目标资源之前先对请求进行拦截过滤,及对请求进行一些处理。也可以在响应到达客户端之前先对响应进行拦截过滤,即对响应进行一些处理。 Filter的生命周期 Filter的生命周期与Servlet的声明周期类似,其主要生命周期阶段有四个,Filter对象的创建,Filter对象的初始化,Filter执行doFilter()方法,及最终...

qq_53157982的博客 791

字符过滤器

jsp 中的字符过滤器,屏蔽网页中或JFreeChart中的乱码问题

掌握Pandoc Lua过滤器:从入门到高级应用的完整指南

Pandoc作为一款强大的通用标记转换器,其Lua过滤器功能为文档转换提供了无限可能。本文将带你深入探索Pandoc Lua过滤器的核心功能、实用示例和高级技巧,帮助你轻松实现文档自动化处理与定制化转换。 ## 什么是Pandoc Lua过滤器? Pandoc Lua过滤器是基于Lua语言的脚本,能够在文档转换过程中修改抽象语法树(AST),实现对文档内容的精细控制。无论是格式调整、内容提取还

gitblog_00347的博客 907

基于UCD3138的数字控制硬开关全桥DC-DC电源设计实战解析

在开关电源设计中,数字控制技术正逐步取代传统模拟方案,以其卓越的灵活性、可编程性和强大的数据处理能力,成为应对复杂动态响应与智能化需求的关键。其核心原理在于通过高精度模数转换器(ADC)实时采样电压、电流信号,经由数字信号处理器(如ARM内核)运行PID等控制算法,动态调整数字脉宽调制(DPWM)输出,从而实现对功率级的精确控制。这种技术价值体现在能够轻松实现高级算法(如输入电压前馈、非线性补偿)、灵活配置保护参数,并通过PMBus等接口实现智能化监控与管理。其典型应用场景包括通信基站、服务器电源以及工业设

1312

数据标注的下一代SOP,可能不是Word,而是一段Prompt

再给几个反例:“这个只是正常纹理,不算。真正用于数据生产的Prompt,可能至少包含:任务定义、正例、反例、边界案例、优先级、输出格式、验收逻辑。一个项目100个人,如果100个人对这句话有100种理解,最后返工的就不是一个框,而可能是几十万帧数据。一个项目启动以后,项目经理先研究SOP,培训组长,组长再培训标注员,最后几百个人按照同一套规则干活。实际上一个成熟的项目经理,最重要的能力之一,就是:把客户的业务语言翻译成生产规则。真正让项目难交付的,从来不是80%的普通数据,而是那20%的长尾数据。

AI数据标注猿 296

PHP 高级过滤器

PHP 的高级过滤器是一种非常实用的功能,可以用于数据验证、清理和转换。通过合理地使用过滤器,可以确保应用程序的安全性、健壮性和准确性。本文介绍了 PHP 过滤器的原理、使用方法以及在实际开发中的应用,希望对您有所帮助。

xyq2024的博客 334

RC4加密算法详解

RC4(也称为 Rivest Cipher 4)是流密码的一种形式,流密码逐字节操作数据流。RC4 流密码是使用最广泛的流密码之一,它通过算法一次一个字节地加密消息,简单并且操作速度快。RC4是一种在电子信息领域加密的技术手段,用于无线通信网络,是一种电子密码,只有经过授权的用户才能享受该服务,使用 64 位或 128 位密钥大小。它通常用于安全套接层 (SSL)、传输层安全 (TLS) 等应用,也用于 IEEE 802.11 无线 LAN 标准。在存储大量的信息时,RC4展现出它的实用性,面对大量的数据,

weixin_43211186的博客 1万+

Django 自定义过滤器filter —— 掌握过滤器创建、使用与高级技巧

摘要:本文详细介绍了Django模板系统中自定义过滤器的创建与使用。主要内容包括:1)过滤器基础概念,解释内置过滤器用法和链式调用特性;2)创建自定义过滤器的完整步骤,从建立templatetags目录到编写过滤器函数;3)参数传递规则,涵盖单参数、多参数处理和默认值设置;4)多种注册方法和命名技巧;5)HTML安全处理机制,包括自动转义控制;6)高级应用如时区处理和国际化支持;7)单元测试方法。文章通过大量代码示例展示了Django过滤器的强大功能和灵活应用场景。

YAnt的博客 1161

ArcMap|时空地理加权回归(GTWR)

ArcGIS的GTWR插件下载地址:https://www.researchgate.net/publication/329518786_GTWR_ADDIN_Valid_till_Dec_31_2022 更详细的操作参考: https://www.bilibili.com/video/BV1fR4y1M7xB?spm_id_from=333.999.0.0 https://blog.youkuaiyun.com/weixin_40008135/article/details/112693520 双击“GTWR_Be

个人学习笔记 1万+

2026华为OD面试题029:勇攀数字高峰

在给定的数字地形图里寻找登山路径,数字代表当前位置的海拔高度。要求从最低海拔出发,不断攀登,最终到达最高山峰。地图保证最低海拔和最高山峰都只有一个。 登山规则: - 路径上的海拔必须严格递增 - 只能向上下左右 4 个方向移动 - 路径必须从最低海拔开始,到最高海拔结束 - 每个地点只能走一次 - 每一步的攀登高度差必须大于 0,且不超过指定值 `K` 输出满足条件的登山路径的数量。

琅嬛福地 116

网关 Spring Cloud Gateway 自定义过滤器(全局过滤器以及网关过滤器)

1.简介 2.项目设置 2.1 API网关配置 3.创建全局过滤器 3.1 编写全局“前置”过滤器逻辑 3.2 编写全局“后”过滤器逻辑 4.创建网关GatewayFilter 4.1 定义GatewayFilterFactory 4.2 用配置注册GatewayFilter 4.3 GatewayFilter顺序 4.4 以编程方式注册GatewayFilter 5.高级方案 5.1 检查和修改请求 5.2 修改响应 5.3 将请求链接到其他服务 本文Spring Cloud Gateway 版本:202

laker的博客 3348

【YOLO11[基础]】分类任务的热力图可视化实践 | 论文必备 | 分类任务 | 即插即用 | 可选GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiR

【YOLO11[基础]】分类任务的热力图可视化实践 | 论文必备 | 分类任务 | 即插即用 | 可选GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM等

静谧、淡雅 2389

深入浅出解析布隆过滤器在Java中的高级应用

布隆过滤器是一种高效的空间节省型数据结构,由Burton Howard Bloom于1970年提出,主要用于判断一个元素是否可能存在于一个集合中。它的核心思想是使用一个很长的二进制向量和多个随机映射函数(哈希函数)。当一个元素被添加到布隆过滤器时,它会被多个哈希函数映射到二进制向量的不同位置,这些位置的值被设置为1。查询时,如果所有映射位置的值均为1,则认为该元素可能存在于集合中;反之,则一定不存在。

无休居士的博客 1318

SPMI总线协议(一)

系统电源管理接口( System Power Management Interface简称SPMI)是一种双线串行接口,用于连接片上系统(SoC)处理器系统的集成电源控制器(PC)与一个或多个电源管理集成电路(PMIC)电压调节系统。SPMI 使系统能够使用单个 SPMI 总线动态调整 SoC 内部电压域的电源和衬底偏置电压。移动设备和其他便携式设计正日益采用系SPMI)协议,实现多主多从系统,根据实时系统需求监测和动态控制供电电压。设计人员可以在系统级实现更低的功率。

qflook的博客 887

QT+QGIS跨平台编译(基于Qt,采用一套代码、一套框架,完成QGIS第三方库、核心库、应用程序的跨平台编译)

QT+QGIS跨平台编译。 基于Qt,采用一套代码、一套框架,完成QGIS第三方库、核心库、应用程序的跨平台编译。

LuckyHanMo的博客 4378

《深入解析 Java Web 高级技术:过滤器(Filter)的原理与应用》

过滤器(Filter)是 Java Web 开发中的一项重要技术,它允许开发者在请求到达目标资源(如 Servlet、JSP 等)之前或响应返回客户端之前,对请求和响应进行拦截和处理。通过 Filter 技术,可以实现诸如权限控制、日志记录、字符编码设置、敏感词过滤、请求预处理等多种功能。

868

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: 过滤器第一篇【介绍、入门、简单应用】
下一篇: java: Multiple encodings set for module chunk test "GBK" will be used by compiler
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值