过滤器入门看这一篇就够了(修订版)

CSS字体样式全攻略 🧱 让文字有空间感,适合标题或LOGO。🖋️适合插画、创意工作者的个人页面。🔥 适合标题、品牌名,视觉冲击力强。🧘‍♀️适合极简设计、文化类网站。✨适合科技类网站、博客、作品集。🚀适合游戏、AI、科技类项目。🐰 适合儿童类网站或节日氛围。📖适合时尚、生活方式类内容。🌫️ 适合神秘、梦幻主题。🌃 夜店风、科技感十足。具体效果是文字会上下跳动。 阅读详情

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

什么是过滤器

过滤器是Servlet的高级特性之一,也别把它想得那么高深,只不过是实现Filter接口的Java类罢了!

首先,我们来看看过滤器究竟Web容器的哪处:

640?wx_fmt=png

从上面的图我们可以发现,当浏览器发送请求给服务器的时候,先执行过滤器,然后才访问Web的资源。服务器响应Response,从Web资源抵达浏览器之前,也会途径过滤器。。

我们很容易发现,过滤器可以比喻成一张滤网。我们想想现实中的滤网可以做什么:在泡茶的时候,过滤掉茶叶。那滤网是怎么过滤茶叶的呢?规定大小的网孔,只要网孔比茶叶小,就可以实现过滤了!

引申在Web容器中,过滤器可以做:过滤一些敏感的字符串【规定不能出现敏感字符串】、避免中文乱码【规定Web资源都使用UTF-8编码】、权限验证【规定只有带Session或Cookie的浏览器,才能访问web资源】等等等,过滤器的作用非常大,只要发挥想象就可以有意想不到的效果

也就是说:当需要限制用户访问某些资源时、在处理请求时提前处理某些资源、服务器响应的内容对其进行处理再返回、我们就是用过滤器来完成的!


为什么需要用到过滤器

直接举例子来说明吧:

没有过滤器解决中文乱码问题

<form action="${pageContext.request.contextPath}/Demo1" method="post">    <input type="text" name="username">    <input type="submit" value="提交"></form>

    <input type="text" name="username">

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

</form>
640?wx_fmt=gif

Servlet中如何解决中文乱码问题,我的其他博文中有写(参考Servlet Request对象的文章)

也就是说:如果我每次接受客户端带过来的中文数据,在Serlvet中都要设定编码。这样代码的重复率太高了!!!!


有过滤器解决中文乱码问题

有过滤器的情况就不一样了:只要我在过滤器中指定了编码,可以使全站的Web资源都是使用该编码,并且重用性是非常理想的!


过滤器 API

只要Java类实现了Filter接口就可以称为过滤器!Filter接口的方法也十分简单:

640?wx_fmt=png

其中init()和destory()方法就不用多说了,他俩跟Servlet是一样的。只有在Web服务器加载和销毁的时候被执行,只会被执行一次!

值得注意的是doFilter()方法,它有三个参数(ServletRequest,ServletResponse,FilterChain),从前两个参数我们可以发现:过滤器可以完成任何协议的过滤操作!

那FilterChain是什么东西呢?我们看看:

640?wx_fmt=png

FilterChain是一个接口,里面又定义了doFilter()方法。这究竟是怎么回事啊??????

我们可以这样理解:过滤器不单单只有一个,那么我们怎么管理这些过滤器呢?在Java中就使用了链式结构。把所有的过滤器都放在FilterChain里边,如果符合条件,就执行下一个过滤器(如果没有过滤器了,就执行目标资源)。

上面的话好像有点拗口,我们可以想象生活的例子:现在我想在茶杯上能过滤出石头和茶叶出来。石头在一层,茶叶在一层。所以茶杯的过滤装置应该有两层滤网。这个过滤装置就是FilterChain,过滤石头的滤网和过滤茶叶的滤网就是Filter。在石头滤网中,茶叶是属于下一层的,就把茶叶放行,让茶叶的滤网过滤茶叶。过滤完茶叶了,剩下的就是茶(茶就可以比喻成我们的目标资源)


快速入门

写一个简单的过滤器

public class FilterDemo1 implements Filter {    public void destroy() {    }    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {        //执行这一句,说明放行(让下一个过滤器执行,如果没有过滤器了,就执行执行目标资源)        chain.doFilter(req, resp);    }    public void init(FilterConfig config) throws ServletException {    }}class FilterDemo1 implements Filter {
    public void destroy() {
    }

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

        //执行这一句,说明放行(让下一个过滤器执行,如果没有过滤器了,就执行执行目标资源)
        chain.doFilter(req, resp);
    }

    public void init(FilterConfig config) throws ServletException {

    }
}

filter部署

过滤器和Servlet是一样的,需要部署到Web服务器上的。

第一种方式:在web.xml文件中配置

filter

<filter>用于注册过滤器

<filter>         <filter-name>FilterDemo1</filter-name>         <filter-class>FilterDemo1</filter-class>         <init-param>         <param-name>word_file</param-name>          <param-value>/WEB-INF/word.txt</param-value>         </init-param></filter>
         <filter-name>FilterDemo1</filter-name>
         <filter-class>FilterDemo1</filter-class>
         <init-param>
         <param-name>word_file</param-name> 
         <param-value>/WEB-INF/word.txt</param-value>
         </init-param>
</filter>

<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class>元素用于指定过滤器的完整的限定类名。
<init-param>元素用于为过滤器指定初始化参数,它的子元素指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。

filter-mapping

<filter-mapping>元素用于设置一个Filter 所负责拦截的资源。

一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径

<filter-mapping>    <filter-name>FilterDemo1</filter-name>    <url-pattern>/*</url-pattern></filter-mapping>
    <filter-name>FilterDemo1</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-name>子元素用于设置filter的注册名称。该值必须是在元素中声明过的过滤器的名字
<url-pattern>设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>指定过滤器所拦截的Servlet名称。
<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。

dispatcher

子元素可以设置的值及其意义:

第二种方式:通过注解配置

@WebFilter(filterName = "FilterDemo1",urlPatterns = "/*")"FilterDemo1",urlPatterns = "/*")

上面的配置是“/*”,所有的Web资源都需要途径过滤器

如果想要部分的Web资源进行过滤器过滤则需要指定Web资源的名称即可!


过滤器的执行顺序

上面已经说过了,过滤器的doFilter()方法是极其重要的,FilterChain接口是代表着所有的Filter,FilterChain中的doFilter()方法决定着是否放行下一个过滤器执行(如果没有过滤器了,就执行目标资源)。

测试一

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {    System.out.println("我是过滤器1");    //执行这一句,说明放行(让下一个过滤器执行,或者执行目标资源)    chain.doFilter(req, resp);}

    System.out.println("我是过滤器1");

    //执行这一句,说明放行(让下一个过滤器执行,或者执行目标资源)
    chain.doFilter(req, resp);
}
640?wx_fmt=gif

我们发现test.jsp(我们的目标资源)成功访问到了,并且在服务器上也打印了字符串!


测试二

我们来试试把chain.doFilter(req, resp);这段代码注释了看看!

640?wx_fmt=gif

test.jsp页面并没有任何的输出(也就是说,并没有访问到jsp页面)。


测试三

直接看下面的代码。我们已经知道了”准备放行“会被打印在控制台上和test.jsp页面也能被访问得到,但“放行完成“会不会打印在控制台上呢?

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {    System.out.println("准备放行");    //执行这一句,说明放行(让下一个过滤器执行,或者执行目标资源)    chain.doFilter(req, resp);    System.out.println("放行完成");}

    System.out.println("准备放行");

    //执行这一句,说明放行(让下一个过滤器执行,或者执行目标资源)
    chain.doFilter(req, resp);

    System.out.println("放行完成");
}

答案也非常简单,肯定会打印在控制台上的。我们来看看:

640?wx_fmt=gif

注意,它的完整流程顺序是这样的:客户端发送http请求到Web服务器上,Web服务器执行过滤器,执行到”准备放行“时,就把字符串输出到控制台上,接着执行doFilter()方法,Web服务器发现没有过滤器了,就执行目标资源(也就是test.jsp)。目标资源执行完后,回到过滤器上,继续执行代码,然后输出”放行完成“

测试四

我们再多加一个过滤器,看看执行顺序。

System.out.println("过滤器1开始执行");//执行这一句,说明放行(让下一个过滤器执行,或者执行目标资源)chain.doFilter(req, resp);System.out.println("过滤器1开始完毕");

//执行这一句,说明放行(让下一个过滤器执行,或者执行目标资源)
chain.doFilter(req, resp);

System.out.println("过滤器1开始完毕");
System.out.println("过滤器2开始执行");chain.doFilter(req, resp);System.out.println("过滤器2开始完毕");
chain.doFilter(req, resp);
System.out.println("过滤器2开始完毕");
System.out.println("我是Servlet1");

当我们访问Servlet1的时候,看看控制台会出现什么:

640?wx_fmt=png

执行顺序是这样的:先执行FilterDemo1,放行,执行FilterDemo2,放行,执行Servlet1,Servlet1执行完回到FilterDemo2上,FilterDemo2执行完毕后,回到FilterDemo1上


注意:过滤器之间的执行顺序看在web.xml文件中mapping的先后顺序的,如果放在前面就先执行,放在后面就后执行!如果是通过注解的方式配置,就比较urlPatterns的字符串优先级


Filter简单应用

禁止浏览器缓存所有动态页面

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {    //让Web资源不缓存,很简单,设置http中response的请求头即可了!    //我们使用的是http协议,ServletResponse并没有能够设置请求头的方法,所以要强转成HttpServletRequest    //一般我们写Filter都会把他俩强转成Http类型的    HttpServletRequest request = (HttpServletRequest) req;    HttpServletResponse response = (HttpServletResponse) resp;    response.setDateHeader("Expires", -1);    response.setHeader("Cache-Control", "no-cache");    response.setHeader("Pragma", "no-cache");    //放行目标资源的response已经设置成不缓存的了    chain.doFilter(request, response);}

    //让Web资源不缓存,很简单,设置http中response的请求头即可了!

    //我们使用的是http协议,ServletResponse并没有能够设置请求头的方法,所以要强转成HttpServletRequest

    //一般我们写Filter都会把他俩强转成Http类型的
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;

    response.setDateHeader("Expires", -1);
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Pragma", "no-cache");

    //放行目标资源的response已经设置成不缓存的了
    chain.doFilter(request, response);
}
640?wx_fmt=png
640?wx_fmt=png

实现自动登陆

开发实体、集合模拟数据库、Dao

private String username ;private String password;public User() {}public User(String username, String password) {    this.username = username;    this.password = password;}//各种setter和getter
private String password;


public User() {
}

public User(String username, String password) {
    this.username = username;
    this.password = password;
}

//各种setter和getter
public class UserDB {    private static List<User> users = new ArrayList<>();    static {        users.add(new User("aaa", "123"));        users.add(new User("bbb", "123"));        users.add(new User("ccc", "123"));    }    public static List<User> getUsers() {        return users;    }    public static void setUsers(List<User> users) {        UserDB.users = users;    }}class UserDB {

    private static List<User> users = new ArrayList<>();



    static {
        users.add(new User("aaa", "123"));
        users.add(new User("bbb", "123"));
        users.add(new User("ccc", "123"));
    }

    public static List<User> getUsers() {
        return users;
    }

    public static void setUsers(List<User> users) {
        UserDB.users = users;
    }
}
public User find(String username, String password) {    List<User> userList = UserDB.getUsers();    //遍历List集合,看看有没有对应的username和password    for (User user : userList) {        if (user.getUsername().equals(username) && user.getPassword().equals(password)) {            return user;        }    }    return null;}

    List<User> userList = UserDB.getUsers();

    //遍历List集合,看看有没有对应的username和password
    for (User user : userList) {
        if (user.getUsername().equals(username) && user.getPassword().equals(password)) {
            return user;
        }
    }
    return null;
}

登陆界面

<form action="${pageContext.request.contextPath}/LoginServlet">    用户名<input type="text" name="username">    <br>    密码<input type="password" name="password">    <br>    <input type="radio" name="time" value="10">10分钟    <input type="radio" name="time" value="30">30分钟    <input type="radio" name="time" value="60">1小时    <br>    <input type="submit" value="登陆"></form>

    用户名<input type="text" name="username">
    <br>
    密码<input type="password" name="password">
    <br>

    <input type="radio" name="time" value="10">10分钟
    <input type="radio" name="time" value="30">30分钟
    <input type="radio" name="time" value="60">1小时
    <br>

    <input type="submit" value="登陆">

</form>

处理登陆的Servlet

//得到客户端发送过来的数据String username = request.getParameter("username");String password = request.getParameter("password");UserDao userDao = new UserDao();User user = userDao.find(username, password);if (user == null) {    request.setAttribute("message", "用户名或密码是错的!");    request.getRequestDispatcher("/message.jsp").forward(request, response);}//如果不是为空,那么在session中保存一个属性request.getSession().setAttribute("user", user);request.setAttribute("message", "恭喜你,已经登陆了!");//如果想要用户关闭了浏览器,还能登陆,就必须要用到Cookie技术了Cookie cookie = new Cookie("autoLogin", user.getUsername() + "." + user.getPassword());//设置Cookie的最大声明周期为用户指定的cookie.setMaxAge(Integer.parseInt(request.getParameter("time")) * 60);//把Cookie返回给浏览器response.addCookie(cookie);//跳转到提示页面request.getRequestDispatcher("/message.jsp").forward(request, response);
String username = request.getParameter("username");
String password = request.getParameter("password");

UserDao userDao = new UserDao();
User user = userDao.find(username, password);

if (user == null) {
    request.setAttribute("message", "用户名或密码是错的!");
    request.getRequestDispatcher("/message.jsp").forward(request, response);
}

//如果不是为空,那么在session中保存一个属性
request.getSession().setAttribute("user", user);
request.setAttribute("message", "恭喜你,已经登陆了!");

//如果想要用户关闭了浏览器,还能登陆,就必须要用到Cookie技术了
Cookie cookie = new Cookie("autoLogin", user.getUsername() + "." + user.getPassword());

//设置Cookie的最大声明周期为用户指定的
cookie.setMaxAge(Integer.parseInt(request.getParameter("time")) * 60);

//把Cookie返回给浏览器
response.addCookie(cookie);

//跳转到提示页面
request.getRequestDispatcher("/message.jsp").forward(request, response);

过滤器

HttpServletResponse response = (HttpServletResponse) resp;HttpServletRequest request = (HttpServletRequest) req;//如果用户没有关闭浏览器,就不需要Cookie做拼接登陆了if (request.getSession().getAttribute("user") != null) {    chain.doFilter(request, response);    return;}//用户关闭了浏览器,session的值就获取不到了。所以要通过Cookie来自动登陆Cookie[] cookies = request.getCookies();String value = null;for (int i = 0; cookies != null && i < cookies.length; i++) {    if (cookies[i].getName().equals("autoLogin")) {        value = cookies[i].getValue();    }}//得到Cookie的用户名和密码if (value != null) {    String username = value.split("\\.")[0];    String password = value.split("\\.")[1];    UserDao userDao = new UserDao();    User user = userDao.find(username, password);    if (user != null) {        request.getSession().setAttribute("user", user);    }}chain.doFilter(request, response);

//如果用户没有关闭浏览器,就不需要Cookie做拼接登陆了
if (request.getSession().getAttribute("user") != null) {
    chain.doFilter(request, response);
    return;
}

//用户关闭了浏览器,session的值就获取不到了。所以要通过Cookie来自动登陆
Cookie[] cookies = request.getCookies();
String value = null;
for (int i = 0; cookies != null && i < cookies.length; i++) {
    if (cookies[i].getName().equals("autoLogin")) {
        value = cookies[i].getValue();
    }
}

//得到Cookie的用户名和密码
if (value != null) {

    String username = value.split("\\.")[0];
    String password = value.split("\\.")[1];

    UserDao userDao = new UserDao();
    User user = userDao.find(username, password);

    if (user != null) {
        request.getSession().setAttribute("user", user);
    }
}

chain.doFilter(request, response);

640?wx_fmt=gif


改良

我们直接把用户名和密码都放在了Cookie中,这是明文的。懂点编程的人就会知道你的账号了。

于是乎,我们要对密码进行加密!

Cookie cookie = new Cookie("autoLogin", user.getUsername() + "." + md5.md5(user.getPassword()));"autoLogin", user.getUsername() + "." + md5.md5(user.getPassword()));
public User find(String username) {    List<User> userList = UserDB.getUsers();    //遍历List集合,看看有没有对应的username和password    for (User user : userList) {        if (user.getUsername().equals(username)) {            return user;        }    }    return null;}
    List<User> userList = UserDB.getUsers();

    //遍历List集合,看看有没有对应的username和password
    for (User user : userList) {
        if (user.getUsername().equals(username)) {
            return user;
        }
    }

    return null;
}
//得到Cookie的用户名和密码if (value != null) {    String username = value.split("\\.")[0];    String password = value.split("\\.")[1];    //在Cookie拿到的密码是md5加密过的,不能直接与数据库中的密码比较    UserDao userDao = new UserDao();    User user = userDao.find(username);    //通过用户名获得用户信息,得到用户的密码,用户的密码也md5一把    String dbPassword = md5.md5(user.getPassword());    //如果两个密码匹配了,就是正确的密码了    if (password.equals(dbPassword)) {        request.getSession().setAttribute("user", user);    }}
if (value != null) {

    String username = value.split("\\.")[0];
    String password = value.split("\\.")[1];

    //在Cookie拿到的密码是md5加密过的,不能直接与数据库中的密码比较
    UserDao userDao = new UserDao();
    User user = userDao.find(username);

    //通过用户名获得用户信息,得到用户的密码,用户的密码也md5一把

    String dbPassword = md5.md5(user.getPassword());
    //如果两个密码匹配了,就是正确的密码了
    if (password.equals(dbPassword)) {
        request.getSession().setAttribute("user", user);
    }

}


最后

乐于输出干货的Java技术公众号:Java3y。公众号内有200多篇原创技术文章、海量视频资源、精美脑图,不妨来关注一下!

640?wx_fmt=jpeg

有帮助?好看!转发!640


STM32F407 UART4串口DMA收发实战:告别频繁中断,用空闲中断+DMA搞定不定长数据 本文详细介绍了STM32F407 UART4串口结合DMA和空闲中断实现高效不定长数据收发的实战方案。通过DMA硬件级数据搬运和空闲中断智能帧检测,显著降低CPU占用率,提升通信效率,适用于工业传感器数据采集和智能设备通信场景。 阅读详情

相关推荐

基于cat12和SPM12进行VBM&SBM数据分析笔记1——数据预处理

基于cat12数据分析基础教程笔记 今年是小编步入研究生生活的第一年,研究方向待定,但主要以磁共振成像为主,以后会不断地总结这方面的知识,涉及MRI扫描,数据分析基础方法理论,软件操作教程,文献阅读笔记总结等等,用来记录我的研究生三年学习过程。编写尽量简洁明了,通俗易懂,本就是小白,也能体会小白的痛。不过这也要谢谢一个人手动@小白(网名),是他教我要把自己所学的写下来,讲出来才能真正的做到输入和输出,查漏补缺。而cat12软件操作是我面临的第一个数据分析的训练,写的可能也不会非常到位,还望各位专业人士指出改

Sophia2023的博客 4万+

过滤器第一篇【介绍、入门、简单应用】

什么是过滤器 过滤器是Servlet的高级特性之一,也别把它想得那么高深,只不过是实现Filter接口的Java类罢了! 首先,我们来看看过滤器究竟Web容器的哪处: 从上面的图我们可以发现,当浏览器发送请求给服务器的时候,先执行过滤器,然后才访问Web的资源。服务器响应Response,从Web资源抵达浏览器之前,也会途径过滤器。 我们很容易发现,过滤器可以比喻成一张滤网。我们想想...

3y 713

代码审计工具学习之Seay(安装以及初步认识)

目录 1.1名词解释 1.2代码审计的重要性 1.3代码审计的步骤 1.4代码审计的内容 1.5常见的代码审计工具 2 Seay 2.1什么是Seay 2.2Seay的安装过程 3典型漏洞分析 3.1什么是命令注入漏洞 3.2 如何理解命令注入漏洞 3.3 如何防御命令注入漏洞 4 利用工具对命令注入漏洞进行分析 4.1DVWA靶场命令注入漏洞分析 4.2 Pikachu靶场命令注入漏洞分析 1.1名词解释 软件代码审计是对编程项目中源代码的全面...

weixin_52515588的博客 2万+

Java过滤器Filter

上述过滤器中已经包含了一些常用的方法,如果我们要读取请求体中的内容,需要构建读取的类,因为请求体中的内容需要使用流进行读取,而且只能调用一次,如果在过滤器中进行调用,则接口会接收不到数据,出现异常情况,所以使用辅助类将请求体中的内容复制一份,继续传递下去。

m0_68292446的博客 282

SP贴图高效导入Maya:从材质设置到渲染优化的完整流程

本文详细解析了将Substance Painter(SP)贴图高效导入Maya并配合Arnold渲染器的完整工作流。针对SP贴图在Maya中常见的色彩、法线等问题,核心在于对齐两者的PBR“语言”,重点讲解了SP中正确的贴图导出设置(包括色彩空间)以及在Maya中连接aiStandardSurface材质、处理法线贴图、优化渲染的标准化流程,确保材质效果准确无误。

weixin_29201933的博客 554

基于STM32的Modbus TCP多主站数据监测

Modbus TCP通信协议在STM32上实现,STM32作为服务器采集内部传感器数据,并通过ADC进行转换,存入寄存器。两个PC机作为客户端访问服务器,服务器通过Socket通信实现监听连接,将数据发送给客户端。

hyp12347的博客 4294

java写一个过滤器

在 Java 中,您可以使用过滤器来拦截请求并执行相应的处理。过滤器可以在请求到达目标资源之前或之后执行。 要创建过滤器,您需要实现 javax.servlet.Filter 接口并实现以下三个方法: public void init(FilterConfig config) throws ServletException public void doFilter(ServletRequest r...

weixin_42593701的博客 235

Unity零基础到进阶 | Unity中的内存泄漏全解析,原因、排查及避免

Unity 内存泄漏并非传统C++语境中的野指针或未释放堆内存,而是基于其「托管内存(C#)+ 原生内存(引擎/非托管)」双架构的特殊问题——即已废弃、不再被业务逻辑使用的内存块,无法被引擎或系统自动回收,持续占用内存空间,最终引发内存暴涨、GC卡顿、OOM(内存溢出)崩溃,其中移动端、主机端受影响最显著。 Unity 内存主要分为三类,其中泄漏仅发生在前两类,栈内存因系统自动分配/释放,无泄漏风险:

努力前行,总会成为自己心中的那道光 1万+

过滤器配置多个url-pattern

最近做项目遇到一个Filter需要配置多个url-pattern,上网查了下资料,经测试,现总结下 一、完全错误的方式 [html] view plaincopy filter>      filter-name>authorityfilter-name>      filter-class>com.util.AuthorityFilterfilter-class> 

haylee的专栏 4960

pytorch实现基本的logistic和softmax回归实验(手动+torch)

前提:不是前馈神经网络,没有隐藏层。 一:Logistic回归实验–人工构造数据集,手动构造模型 要求: 动手从0实现logistic回归,实现二分类,人工构造数据集,并分析loss、训练集、测试集的准确率。(要求从零实现二元交叉熵) 实验过程: 1.1人工构造数据集 1. # #自定义数据---训练集 2. num_inputs = 2 3. n_data = torch.ones(1500, num_inputs) # 数据的基本形态 4. x1 = torch.normal(2 * n_d

qq_37534947的博客 1万+

EMC原理-传导(共模、差模)与辐射(近场、远场)详解

本文深入介绍了电磁兼容(EMC)的基本概念,包括EMI和EMS,以及如何处理传导干扰(共模、差模)和辐射干扰(近场、远场)。详细讨论了近场感应、远场辐射的原理,滤波器和屏蔽技术在抑制噪声信号中的作用。此外,探讨了差模和共模干扰的来源、影响及滤除方法,如使用差模电感、电容和共模线圈。最后,提到了穿心电容在滤除高频噪声中的应用。

让你爱上电路设计 3551

springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现

springboot学习四:Spring Boot2.x 过滤器基础入门&实战项目场景实现

冯安晨 712

uniapp - 最新微信小程序手机号一键登录功能效果,uniapp小程序实现手机号码一键登录,uniapp微信小程序端通过手机号授权完成立即登录操作(详细示例源码,新手小白一键复制开箱即用)

uniapp,微信小程序,uniapp小程序平台,uniApp手机号一键登录,uniapp小程序端手机号一键登录功能,实现微信小程序手机号一键登录,在uniapp中实现获取手机一键登录功能,uniapp手机号快捷登录,uniapp微信小程序授权登录并获取手机号,微信小程序手机号快速验证组件调用方式,uniapp小程序怎么用手机号一键登录,uniapp一键登录流程及代码,如何获取手机号一键登录到小程序,微信小程序获取本机手机号一键登录功能,新手详细教程,详细手机一键登录完整示例代码,uni-app微信unia

✅ 精选推荐文章 1万+

url过滤怎么解除_过滤器入门看这一篇就够了(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y什么是过滤器过滤器是Servlet的高级特性之一,也别把它想得那么高深,只不过是实现Filter接口的Java类罢了!首先,我们来看看过滤器究竟Web容器的哪处:从上面的图我们可以发现,当浏览器发送请求给服务器的时候,先执行过滤器,然后才访问Web...

weixin_39870664的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

javaweb过滤器_过滤器监听器面试题都在这里(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y以下我是归纳的过滤器监听器知识点图:(原图可以在公众号下回复 “脑图” 获取)图上的知识点都可以在我其他的文章内找到相应内容。监听器常见面试题监听器有哪些作用和用法?监听器有哪些作用和用法?Java Web开发中的监听器(listener)就是ap...

weixin_39711721的博客 128

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

过滤器应用【编码、敏感词、压缩、转义过滤器】(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y在上篇博文中,我们已经讲解了...

3y 372

过滤器监听器面试题都在这里(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y以下我是归纳的过滤器监听器知...

3y 517

filter过滤后重新添加_过滤器监听器面试题都在这里(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y以下我是归纳的过滤器监听器知识点图:(原图可以在公众号下回复 “脑图” 获取)图上的知识点都可以在我其他的文章内找到相应内容。监听器常见面试题监听器有哪些作用和用法?监听器有哪些作用和用法?Java Web开发中的监听器(listener)就是ap...

weixin_33483080的博客 106

拜托,面试官别问我「布隆」了(补充修订版)

前言 在之前的 拜托,面试官别问我「布隆」了 一文中,很多小伙伴留言说并不能看出布隆过滤器有比位图更方便,今天的文章就补充更详细一点。 题目描述 一个网站有 100 亿 url 存在一个黑名单中,每条 url 平均 64 字节。这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中? 题目解析 这是一道经常在面试中出现的算法题。凭借着题目极其容易描述,电面的时...

weixin_34326558的博客 1140

ERTEC 系列 PROFINET 芯片级硬件过滤器分析

实时控制系统对确定性要求极高,接入公网时,广播风暴、SYN泛洪等网络异常极易导致系统失效。面对不可控的外部环境,关键在于“本地化防御”:在数据进入协议栈前,利用硬件能力过滤异常流量。 西门子PROFINET的高稳定性正源于此。本文以PROFINET IO运行时软件(EDDP)为例,深入剖析其芯片级硬件过滤规则配置系统。我们将揭示该系统如何在网卡硬件层面实现数据包的极速分类与拦截,确保设备在遭受大规模网络冲击时,依然能维持严苛的实时性能,为工业联网提供坚实的底层保障。

wsg1100 287

得物二面:什么是缓存击穿、缓存穿透、缓存雪崩?(修订版)

布隆过滤器判断 "存在" 时有一定误判率(可能实际不存在),但判断 "不存在" 时是 100% 准确的。:穿透是 "查的东西根本不存在",击穿是 "一个热点 Key 过期了",雪崩是 "一堆 Key 同时过期或 Redis 挂了"。:面试官不仅仅是想知道这三个概念的定义,更是想知道你是否能清晰区分它们的触发场景("查不到" vs "过期了" vs "集体过期"),以及各自对应的解决方案。:击穿是 "一个热点 Key 过期",雪崩是 "大量 Key 集体过期",范围更广,危害更大。这是最简单也最有效的手段。

犬小哈 1507

侧边栏_第四课 侧边栏和过滤器

注意:发送 “lesson4” 可以获取英文版 Email嗨,今天我们介绍的是 sidebar (侧边栏)和 Filter (过滤器)。sidebar 是个独立于主内容区的面板,可单独开启和关闭。侧边栏通过页面右上方的...菜单打开sidebar。它的主要目的是为了方便你在主内容区进行写作时,并排打开其他笔记进行查看或参考。你可以任意在主内容区或侧边栏进行编辑(怎么方便就怎么来)。你甚...

weixin_39838798的博客 547

javaweb管理系统_【JavaWeb基础】权限管理系统(修订版)

前言只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y前面我们做的小项目都是一个表的,业务代码也相对简单。现在我们来做一个权限管理系统,体验一下多表的业务逻辑,顺便巩固一下过滤器的知识。!该项目的GitHub地址:https://github.com/ZhongFuCheng3y/Privilege目...

weixin_35480435的博客 354

Python中的过滤器

寄语:新的有一天,开始了,让我们把内心的一些想法都放一放,努力去学习吧。   《Python基础教程(第2版,修订版))》 Assignment 赋值 Variable   变量 Nan是一种特殊的简写 not a number(非数值) Floor向对的是ceil(将给定的数值转化为大于或等于他的最小值的整数 变表达式就是某件事情,而语句就是做某件事情 获取用户的输入信息使用in

luolang_103的博客 3733
上一篇: 过滤器应用【编码、敏感词、压缩、转义过滤器】(修订版)
下一篇: 程序员「在知乎装逼被怼」,决定用『面试』证明自己
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值