Java过滤器doFilter里chain.doFilter()函数的理解
作者:deep_blank 发布时间:2023-11-11 14:45:50
对过滤器doFilter里chain.doFilter()函数的理解
关于chain.doFilter()函数在最近的使用中不是很理解,但是考虑到他是过滤器。过滤器顾名思义就是在执行某件事情的时候开始之前。
开始进行处理的叫做过滤处理。一个方法,一个类就是充当过滤器的角色。它是在一个容器(类似于Tomcat)启动之后,打开一网站,他就会根据配置就行过滤处理。
doFilter()方法就是过滤器的主要方法,init()方法就是在容器启动的时候执行的。doFilter()方法中的chain.doFilter(request,response)方法刚开始还有些不怎么理解。现在有一点明白了。
doFilter(request,response)的方法就是在你打开一个页面当满足过滤器的条件的时候,他就会继续执行你打开页面时候的操作。同时如果你使用了httpservletrequest和httpservletResponse的话,获取servletPath的值就是你要打开的文件的地址。
例子如下:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse resp=(HttpServletResponse)response;
String servletPath= req.getServletPath();
HttpSession session=req.getSession();
String flag=(String)session.getAttribute("flag");
if(servletPath!=null&&(servletPath.equals("/03/index.jsp")||servletPath.equals("/03/login.jsp")||servletPath.equals("/loginServlet17"))){
chain.doFilter(request, response);
}else{
if(flag!=null&&flag.equals("login_success")){
chain.doFilter(request, response);
}else if(flag!=null&&flag.equals("login_error")){
req.setAttribute("msg", "登录失败,请重新登录");
req.setAttribute("return_uri", servletPath);
RequestDispatcher rd=req.getRequestDispatcher("/03/login.jsp");
rd.forward(req, resp);
}else{
req.setAttribute("msg","你尚未登录");
req.setAttribute("return_uri", servletPath);
RequestDispatcher rd=request.getRequestDispatcher("/03/login.jsp");
rd.forward(req, resp);
}
}
System.out.println(servletPath);
}
过滤器Filter&&chain.doFilter()
容器在加载的时候,会读取web.xml中的<filter></filter>,根据指定的类路径来实例化过滤器。
那么过滤器究竟是用来做什么的呢?
顾名思义,过滤器肯定是过滤我们不想要的东西。所以说执行肯定是在我们访问某个页面之前。所以发散开来,它也可以执行一些我们在访问某个页面,或者某些页面之前想要的操作。
那么:
a.什么是过滤器?过滤器和普通类有什么区别?
b.过滤器中的chain.doFilter()起什么作用?
所以说chain.doFilter(request,response)是过滤器的必要操作,目的是如果有多个过滤器需要处理同一个url时把请求传给下一个过滤器。
c.过滤器的处理的先后顺序?
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/foo*</url-pattern>
</servlet-mapping>
<filter-mapping>
<filter-name>servletFilter</filter-name>
<url-pattern>myServlet</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/foo*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>anotherFilter</filter-name>
<url-pattern>/foo/bar</url-pattern>
</filter-mapping>
如果一个普通的请求访问的URL是/foo/bar,那么它将匹配所有这3个过滤器。过滤器链将由3个过滤器组成,依次为myFilter、anotherFilter,然后是servletFilter。myFilter将在anotherFilter之前执行,因为这是它们出现在部署描述符中的顺序。它们都将在servletFilter之前执行,因为URL映射总是在Servlet名称映射之前执行。
来源:https://blog.csdn.net/wo532544220/article/details/49511283


猜你喜欢
- 1.监听(Listener)<!-- 配置监听 --><listener><listener-class>
- ArrayList底层维护的是一个动态数组,每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列
- **正所谓,一入商城深似海~ 商城类的App,确实是有许多东西值得学习,但是只要略微斟酌一下,你又会发现,它们之间存在着许多不谋而合的相似,
- springboot集成开发实现商场秒杀加入主要依赖<dependency> <groupId>org.spring
- 1、通过注解ModelAttribute直接映射表单中的参数到POJO。在from中的action写提交的路径,在input的name写参数
- CircleImageView实现圆形头像代码分享,供大家参考,具体内容如下一、创建属性文件(attrs.xml)具体操作:1、在项目的va
- 安装完,或者绿色版解压完,先别打开Android Stduio。要先配置下Android Studio 的缓存路径。这个缓存文件主要是存放一
- springboot多模块项目添加一新模块选择Maven Module,填写模块名若空白,catalog目录可选择internal更改包名完
- Java虚拟机栈概述Java虚拟机栈(Java Virtual Machine Stacks)是线程私有的,它的生命周期与线程相同。虚拟机栈
- 发生服务器 500 异常,如果默认方式处理,则是将异常捕获之后跳到 Tomcat 缺省的异常页面,如下图所示。不论哪个网站都是一样的,所以为
- 1、System.Threading.Timer 线程计时器1、最底层、轻量级的计时器。基于线程池实现的,工作在辅助线程。2、它并不是内在线
- 本文实例为大家分享了Android Studio实现智能聊天的具体代码,供大家参考,具体内容如下1、布局activit_main.xml&l
- 本文实例讲述了C#交错数组用法。分享给大家供大家参考。具体分析如下:交错数组是数组的数组,交错数组的元素可以是不同的尺寸和大小。交错数组有时
- 前言之前采取项目中嵌套html页面,实现基本的登录校验、权限校验、登出操作、记住我等功能试下。但是,现在的开发基本都是前后分离样式,后端并不
- Java核心代码:public String getSmsInPhone() { final String SMS_URI_ALL = &q
- 本文实例汇总了C#中@的用法,对C#程序设计来说有不错的借鉴价值。具体如下:一 字符串中的用法1.学过C#的人都知道C# 中字符串常量可以以
- Android实现读取NFC卡卡号示例,具体如下:1.权限 <uses-permission android:name=&
- 制作透明窗体办法有好几种,各有优缺点. 我们先来看看C#本身提供的办法 1:通过设置窗体的 TransparencyKey实现 例:窗体中
- 一、关于idea中Maven的位置idea自带一个maven,其路径大致如下C:/java/IntelliJ IDEA 2020.1/plu
- 权限上篇文章 Android 获取IP和UA中提及了获取WIFI的IP地址,本篇文章介绍下如何扫描WIFI。官方文档根据官方文档描述,扫描W