java filter url匹配规则_java过滤器filter使用

一:filter:过滤器,拦截servlet的请求和响应。

1、

1 package jd.com.filter;2

3 import javax.servlet.*;4 import java.io.IOException;5

6 public classMyFilter implements Filter {7 @Override8 public voiddestroy() {9

10 }11

12 @Override13 public voidinit(FilterConfig filterConfig) {14

15 }16

17 @Override18 public voiddoFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {19

20 try{21 System.out.println("请求到拦截器。");22 //放行请求和响应。

23 filterChain.doFilter(servletRequest,servletResponse);24 System.out.println("响应到拦截器。");25 }catch(Exception ex){26 ex.printStackTrace();27 throw new RuntimeException(ex+"run ereror");28 }29

30 }31 }

需要继承抽象类Filter,需要重写init和destory方法以及doFilter()方法。如果想放行请求和响应需要调用类FilterChain的方法doFilter(servletRequest,serletRespone)。

servlet:

1 package jd.com.filter;2

3 import javax.servlet.ServletException;4 import javax.servlet.annotation.WebServlet;5 import javax.servlet.http.HttpServlet;6 import javax.servlet.http.HttpServletRequest;7 import javax.servlet.http.HttpServletResponse;8 import java.io.IOException;9

10 @WebServlet(name = "ServletFilter")11 public classServletFilter extends HttpServlet {12 protected voiddoPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {13

14 }15

16 protected voiddoGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {17 System.out.println("请求到servlet。");18 }19 }

2、注册serlet和Filter。

1 <?xml version="1.0" encoding="UTF-8"?>

2

3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

5 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

6 version="2.5">

7

8 ServletFilter

9 jd.com.filter.ServletFilter

10

11

12 ServletFilter

13 /test/

14

15

16 MyFilter

17 jd.com.filter.MyFilter

18

19

20 MyFilter

21 /test/

22

23

24

想flter过滤那个url需要在url-pattern里写那个url!

a595d70d32830eb065ebe8150afd5d11.png

图示:

2b1a2e282a6ab2b17cfbd9106e8b74ff.png

2、FilterChain 过滤链

当我们的jsp或者servlet被多个过滤器使用的时候,整个请求和响应形成的链叫做过滤链。

通过过滤链FilterChain的doFilter方法,将一个请求从一个过滤器放行到下一个过滤器,直到最后一个过滤器被调用放行的时候,才到达最后的servlet或者jsp。

doFilter()放行方法。区别于咱们重写抽象方法Filter的doFiltter()方法,一个是服务器调用一个是FilterChain调用。

3、多个过滤器作用一个url的执行顺序(filter-mapping在web.xml的顺序决定):

url匹配规则:

1)完全匹配 : 必须以"/"开头  例如:"/a"

2)目录匹配:  必须以"/"开头,以"*"结束,例如:"/a/*"

3)后缀名匹配: 以“*”开头,以"jsp、do、action"结束的。例如:“”*.jsp  *.do *.action“”

匹配规则:

以精确匹配>最长路径匹配>后缀名匹配>默认匹配

例1:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,不会去管servletB。

例2:比如servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。

例3: 比如servletA的url-pattern:*.action ,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test.action,这个时候容器就会优先进行路径匹配,而不是去匹配扩展名,这样就去调用servletB。

filter匹配规则:

例子:Afilter urlpattern:/*

Bfilter urlpattern::/a/c

servlet的url为:/a/c的时候,如上filter都会被使用,那Afilterr和Bfilter执行顺序是什么呢?

web.xml注册顺序:

FilterA

jd.com.mapFilter.FilterA

FilterA

/*

FilterB

jd.com.mapFilter.FilterB

FilterB

/a/c

实际输出结果:

7f77894aedbed7dd13824ee5659b6ed3.png(响应回来的时候先经过B在经过A)

也就是说,执行filter的顺序是按照,在web.xml中的filter-mapping的顺序来决定,我们的这个2个顺序调换,看下输出:

1

2 FilterA

3 jd.com.mapFilter.FilterA

4

5

6 FilterB

7 /a/c

8

9

10 FilterA

11 /*12 13 14 FilterB15 jd.com.mapFilter.FilterB16

f44275483382ec914406c6454abd061b.png

4)filter在web.xml其他标签:

1、Servletdemo1位置 内表示匹配那个servlet。是servletname不是相对路径。

4b41b374c6968fb37f64c90a164d3676.png

注意:

如果一个filter-mapping其中已经存在url-pattern 不要在存在servlet-name,在不同的版本中会重复执行2次过滤器!!

2、 dispatch filter作用那种请求。

请求(3和4了解):1、REQUEST:从浏览器发送过来的请求,这个filter的默认作用请求。

2、FORWARD:转发过来的请求。

3、ERROR:因为服务器错误而发送过来的请求。

4、INCLUDE:包含过来的请求。

1)默认情况(request)

demo1:

1 package jd.com.otherTag;2

3 import javax.servlet.ServletException;4 import javax.servlet.annotation.WebServlet;5 import javax.servlet.http.HttpServlet;6 import javax.servlet.http.HttpServletRequest;7 import javax.servlet.http.HttpServletResponse;8 import java.io.IOException;9

10 @WebServlet(name = "Servletdemo1")11 public classServletdemo1 extends HttpServlet {12 protected voiddoPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {13

14 }15

16 protected voiddoGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {17 System.out.println("请求进入Servletdemo1");18 request.getRequestDispatcher("/a/b").forward(request,response);19 }20 }

demo2:

1 package jd.com.otherTag;2

3 import javax.servlet.ServletException;4 import javax.servlet.annotation.WebServlet;5 import javax.servlet.http.HttpServlet;6 import javax.servlet.http.HttpServletRequest;7 import javax.servlet.http.HttpServletResponse;8 import java.io.IOException;9

10 @WebServlet(name = "Servletdemo2")11 public classServletdemo2 extends HttpServlet {12 protected voiddoPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {13

14 }15

16 protected voiddoGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {17 System.out.println("进入Servletdemo2 请求");18 }19 }

web.xml

1

2 Servletdemo1

3 jd.com.otherTag.Servletdemo1

4

5

6 Servletdemo1

7 /a

8

9

10 demoFilter

11 jd.com.otherTag.demoFilter

12

13

14 demoFilter

15 /*16 17 18 Servletdemo219 jd.com.otherTag.Servletdemo220 21 22 Servletdemo223 /a/b24

d9942ee06838515babaef00cbe11a17d.png

注意:

因为filter的匹配url为/*所有 如果匹配的不是所有的话 需要注意的是filter的url和其他2个demo的url是包含关系。

1

2 Servletdemo1

3 jd.com.otherTag.Servletdemo1

4

5

6 Servletdemo1

7 /a/c

8

9

10 demoFilter

11 jd.com.otherTag.demoFilter

12

13

14 demoFilter

15 /a/*16 17 18 Servletdemo219 jd.com.otherTag.Servletdemo220 21 22 Servletdemo223 /a/b24

结果:

3825ff2167106b5a1c4cbaec1ca7d634.png

在转发的时候,没有经过demofilter,直接转发到servletdemo2.

解决方法:

默认情况下走的是请求是REQUEST,所以需要添加FORWARD的请求。注意需要写REQUEST请求,因为如果写其他请求默认请求不会生效。

1

2 demoFilter

3 jd.com.otherTag.demoFilter

4

5

6 demoFilter

7 /a/*8 REQUEST9 FORWARD10

结果:

3d1702cd0fd926d07b5dc24ea5f3764f.png

2)设置错误页。

1

2 ServletError

3 jd.com.coding.ServletError

4

5

6 ServletError

7 /c

8

9

10 404

11 /c

12

1 package jd.com.coding;2

3 import javax.servlet.ServletException;4 import javax.servlet.annotation.WebServlet;5 import javax.servlet.http.HttpServlet;6 import javax.servlet.http.HttpServletRequest;7 import javax.servlet.http.HttpServletResponse;8 import java.io.IOException;9

10 @WebServlet(name = "ServletError")11 public classServletError extends HttpServlet {12 protected voiddoPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {13

14 }15

16 protected voiddoGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {17 response.setContentType("text/html;charset=UTF-8");18 response.getWriter().print("亲访问的资源不存在!");19 }20 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么对document.write写出来的内容调整对齐方式_干不过写PPT的?麦肯锡老阿姨教你4招...

PPT是我真正花过10,000小时以上的技能&#xff0c;毕竟在麦肯锡呆了7年。麦肯锡PPT重视内容与逻辑&#xff0c;我改行做营销后又开始注意视觉效果。怎么干过我们这些画PPT的&#xff1f;&#xff1a;)从内容到形式&#xff0c;我来讲讲4步流程&#xff0c;有助于提高效率。/ 01…

iphone查看删除的短信_苹果删除的短信

苹果删除的短信怎么恢复?大家在使用手机的时候&#xff0c;有些没用的短信就习惯清除了&#xff0c;但是有时候比较重要的短信很可能也会误删&#xff0c;后期想要找确又找不到&#xff0c;那么苹果删除的短信能恢复吗?怎么恢复呢?下面就来详细介绍一下。苹果删除的短信怎么…

vscode代码运行时间工具_代码编辑器横评:为什么 VS Code 能拔得头筹

2015 年 4 月 29 日的 Build 大会上&#xff0c;微软发布了 Visual Studio Code 第一个预览版本。短短四年时间里&#xff0c;VS Code 高速成长。根据 2019 年 2 月的 PYPL Top IDE index 的排名&#xff0c;VS Code 的涨势迅猛&#xff0c;在所有编辑器与 IDE 中排名第六&…

ie浏览器网页版进入_Win10系统中IE和edge浏览器无法打开网页如何解决

Win10系统中IE和edge浏览器无法打开网页如何解决最近有Win10系统用户们反馈最新Win10系统中的IE和edge浏览器都无法上网&#xff0c;打不开网页&#xff0c;而第三方浏览器却可以&#xff0c;遇到这样的情况该如何解决呢?引起IE和edge浏览器无法打开网页的可能原因&#xff0c…

cad插件_CAD素材与插件合集

CAD素材与插件合集CAD字体包下载链接&#xff1a;https://pan.baidu.com/s/16Wq4boqm254qJNJG5fD5EA提取码&#xff1a;h28nCAD经典模式下载链接&#xff1a;https://pan.baidu.com/s/18U6vSetQxg6bCNJDElZtFA提取码&#xff1a;wlje电气符号下载链接&#xff1a;https://pan.b…

一个form 如何做两次提交_如何做一个自信魅力的女人

有一种常见的说法是外观完全决定了吸引力&#xff0c;错&#xff0c;如果你希望人们被你吸引&#xff0c;如果你想做一个优秀的、成功的、万众瞩目的女性&#xff0c;那么你必须做很多努力&#xff0c;才能成为一个有魅力的人。1做自己不要复制像杰西卡兰格或安德里亚汤普森这样…

vbs代码炫酷效果_Python|实现黑客帝国代码雨效果

Python|实现黑客帝国代码雨效果估计大家都看过电影《黑客帝国》吧&#xff0c;片中的一段代码雨片段实在是炫酷&#xff0c;试想一下&#xff0c;片中的代码雨效果在自己电脑屏幕上实现了会是一种什么样的感觉&#xff0c;会不会有种身临黑客之境呢&#xff1f;本着满足好奇心和…

电脑手写输入法_百度输入法“手写输入”为什么不是老年人的专利?AI的进步...

智能手机的不断普及&#xff0c;也让人机交互取得了很快的发展&#xff0c;就从大家一下常用的设计输入法来看&#xff0c;效果也是越来越智能化了&#xff0c;一个输入法的自我修养选择gboard的原因有很多种&#xff0c;这也是作为一款我国国民输入法的第一要素&#xff0c;毕…

台式电脑如何设置开机密码_设置苹果Mac电脑的开机密码-macw资讯

有很多用户刚从windows系统转过来使用mac系统&#xff0c;可能有很多东西都不知道在哪里&#xff0c;不知道怎么去设置&#xff1f;下面我们就来看下mac是怎样设置开机密码的。非常简单&#xff0c;来跟小编一起来学习然后设置苹果Mac电脑的开机密码吧&#xff01;1、首先&…

java重写面试题_Java面试题:重写了equals方法,为什么还要重写hashCode方法?

核心问题&#xff1a;重写了equals方法&#xff0c;为什么还要重写hashCode方法&#xff1f;这不仅仅是一道面试题&#xff0c;而且是关系到我们的代码是否健壮和正确的问题。在前面两篇文章涉及到了equals方法的底层讲解&#xff1a;《说说和equals的区别&#xff1f;你的回答…

电脑显示器闪屏_Win7系统电脑显示器屏幕闪屏的解决办法

Win7系统电脑闪屏怎么办&#xff1f;近日一个用户反馈&#xff0c;在使用Win7系统电脑的时候&#xff0c;会出现闪屏的问题&#xff0c;该如何解决呢&#xff1f;请看下文具体解决办法。解决办法&#xff1a;1、首先右击桌面空白处&#xff0c;并在右键菜单中&#xff0c;直接选…

win10更新不动_win10沙盒功能和其他同类程序的区别

刚刚在使用WIN10自带的沙盒功能&#xff0c;发现吃瘪了。具体吃瘪过程如下&#xff1a;WIN10沙盒https://www.zhihu.com/video/1145279384016584704明白人看懂了是啥意思&#xff0c;后面的废话可以跳过。总结一句话&#xff0c;WIN10沙盒在我文章发布日期前&#xff0c;软件环…

查看grafana版本_使用 Prometheus 与 Grafana 为 Kubernetes 集群建立监控与警报机制

作者 | Gregoire DAYET 策划 | 田晓旭 IT 团队已经明确意识到对基础设施进行监控的必要性。目前市面上存在着大量适用于传统基础设施且历史悠久的解决方案&#xff1a;Nagios、Zabbix 等工具都是其中的代表。但这些工具并不足以解决 Kubernetes 生态系统在多层级抽象与故障排查…

java的注解_java-注解相关

注解概念&#xff1a;说明程序的&#xff0c;给计算机看注释&#xff1a;用文字描述程序先了解一些怎么正常javadoc文档1&#xff1a;给类或者方法添加doc注释2&#xff1a;通过命令javadoc 执行 类.java文件新建的类&#xff1a;/*** 注解doc演示*authorquan*sincejdk 1.7*ver…

linux删除文件_Linux删除文件夹用什么命令

请关注本头条号&#xff0c;每天坚持更新原创干货技术文章。如需学习视频&#xff0c;请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言本文主要讲解Linux删除文件夹或目录的命令rmdir和rm的使用方法。Windows上的文件夹与Linux系统里的目录是同一概念。默认情况下&…

shrio 登陆后 还是失效_在 iPhone 上取消订阅后,应用或内容会立即失效吗?

在 iPhone 中&#xff0c;一些应用和服务需要进行订阅&#xff0c;即您需要支付相应的费用以获得应用或服务中内容的访问权限。如果您想要取消订阅某个项目&#xff0c;可以按以下步骤操作&#xff1a;前往 iPhone “设置”-“Apple ID”-“iTunes Store 与 App Store”&#x…

wifi 信道_WiFi网速太慢,四招就可以让无线网络变得顺畅

和WIFI网速相关联的因素主要有四个&#xff0c;对应解决方法也就有四个。频段冲突是WIFI网速变慢很常见的问题。现实中常用的WIFI频段有2.4GHZ和5GHZ两个大频段&#xff0c;也好比两条高速公路。中国2.4GHZ频段里有11个信道&#xff0c;5GHZ有15个信道。多少个信道就好比有多少…

判读一个对象不为空_“人不为己,天诛地灭”的真实含义

“人不为己&#xff0c;天诛地灭”出自《佛说十善业道经》&#xff0c;其意思不是“一个人如果不为自己谋利益&#xff0c;就会遭到天地诛灭”&#xff0c;而是“一个人如果不修行自己的德行&#xff0c;那么就会为天地所不容”。“为”是修习、修炼、修行的意思&#xff0c;修…

c++opencv显示中文_OpenCV如何入门秘籍

OpenCV简介谈起入门&#xff0c;我们首先要搞明白OpenCV是什么&#xff1f;OpenCV的全称是Open Source Computer Vision Library&#xff0c;是一种计算机视觉库&#xff0c;主要用于处理摄像头采集的图像。既然说到了是一种库&#xff0c;就要聊聊这个库使用什么语言编写的。O…

安卓开发文档_鸿蒙2.0,HarmonyOS开发体验!

“没有人能够熄灭漫天星光”。在9月10日的华为2020开发者大会上&#xff0c;余承东掷地有声地说道。从去年开放的鸿蒙1.0&#xff0c;到今年的2.0。仅仅一年时间&#xff0c;华为就把基础设施全部搭建好。从之前的感知不强&#xff0c;到现在的触手可得&#xff0c;让果核这个半…