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;那么苹果删除的短信能恢复吗?怎么恢复呢?下面就来详细介绍一下。苹果删除的短信怎么…

pythonrequests证书_python requests证书问题解决

用requests包请求https的网站时&#xff0c;我们偶尔会遇到证书问题。也就是常见的SSLerror&#xff0c;遇到这种问题莫慌莫慌。这里没有找到合适的网站去报SSL证书的错误&#xff0c;所以就假装请求了一个https的网站&#xff0c;然后给报了SSLerror了&#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 中排名第六&…

mysql表还原初始状态_workbench 怎么恢复初始设置

答&#xff1a;同学你好&#xff0c;在ANSYS workbench的材料建模当中如果不小心把原来的布局给弄乱了&#xff0c;可以通过设置view菜单里面的reset window layout来恢复&#xff0c;具体的操作如图所示(另外在workbench的模型前处理中如果弄乱了也可以通过这个方法来实现)&am…

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

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

java二期_JAVA基础之多线程二期

一、主线程public class MainThread {/*** 主线程&#xff1a;指执行main()方法的线程&#xff0c;且该线程是单线程&#xff0c;从上到下执行* JVM执行main()方法时&#xff0c;JVM会将main()方法放入到栈内存中执行&#xff0c;* 同时CPU会为main()方法开辟一条执行路径&…

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做自己不要复制像杰西卡兰格或安德里亚汤普森这样…

python的语句_Python的语句

python中的两种语句&#xff1a;1、if条件控制语句格式&#xff1a;if:a int(input("请输入第一个数&#xff1a;"))b int(input("请输入第二个数&#xff1a;"))if a < b:print("a比b小")if-else:a int(input("请输入第一个数&#…

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

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

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

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

java abs前缀变量_JAVA工具例大全--cn.hutool.setting.AbsSetting读取配置文件例子

用类cn.hutool.setting.AbsSetting的如下方法:getCharpublic Character getChar(String key,String group)获取char类型属性值Parameters:key - 属性名group - 分组名Returns:属性值引用hutool,在项目maven的pom.xml的dependencies中加入以下内容:cn.hutoolhutool-all5.4.3读取…

python语言的数据类型图解_Python基础——数据类型(图解+实例,非常详细!)

Python基础——数据类型(图解实例&#xff0c;非常详细&#xff01;)Python基础——数据类型(图解实例&#xff0c;非常详细&#xff01;)内容及版权声明&#xff1a;笔记是根据开课吧——Python语法爬虫分析课和自己的理解记录&#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;你的回答…

python怎么读取石墨表格_每2秒进行一次statsd xaxis石墨统计 - python

我已经安装了石墨&#xff0c;nodejs-statsd(用于接收数据)和python statsd客户端(用于发送数据)。下面是一个测试脚本&#xff0c;该脚本将数据发送到statsd进程的udp套接字。#!/usr/bin/env pythonimport timeimport randomimport statsdc statsd.StatsClient(localhost,812…

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

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

java webservice 身份验证_java-Http基本身份验证不适用于Spring WS和WebS...

我尝试使用Spring(-WS)将HTTP基本身份验证凭据添加到我的SOAP请求中.该请求本身有效,但是没有凭据提交. HTTP标头应如下所示&#xff1a;[...]Connection: Keep-AliveUser-Agent: Apache-HttpClient/4.1.1 (java 1.5)Authorization: Basic mybase64encodedtopsecretcredentials…

python ftp timeout_python - FTP文件传输期间Python数据通道超时 - 堆栈内存溢出

我正在尝试使用Python的ftplib传输文件。def ftps_put_file(host, user, password, ftp_file_path, processed_file):try:context ssl.create_default_context(ssl.Purpose.SERVER_AUTH, cafileC:\\PATH\\TO\\SECURE.crt)with FTP_TLS(host, useruser, passwdpassword, contex…