过滤器六:url-pattern设置过滤范围
目录
一:引入问题:
二:url-pattern设置过滤范围简介:
三:案例演示
0.准备内容:
1.情况一:web.xml中的url-pattern是/test.jsp时:
2.情况二:web.xml中的url-pattern是/servlet/*时:
四:着重说明:“三:案例演示”部分的补充说明:几个需要注意的点
1.第一个注意的点,Servlet的url设置成“/”,可以充当根路径,此时过滤器的url-pattern设置成“/”的时候,过滤器可以拦截这个Servlet
2.第二个需要注意的点:默认的首页index.jsp会让第一点中的东西失效
3.面对1、2两个注意点,一个不错的做法
4.复合url-pattern:同时过滤多种url
五:设置过滤范围:注解的写法
一:引入问题:
通常url-pattern设置成“/*”;即对所有请求进行过滤;但是当有特殊要求的时候,即改变过滤范围的时候如何做?
二:url-pattern设置过滤范围简介:
三:案例演示
0.准备内容:
案例:包括UrlPatternFilter过滤器类;SampleServlet1这个Servlet类;test.jsp;
test.jsp:访问的url为:localhost:8080/url-pattern/test.jsp
SampleServlet1这个Servlet:访问的url为:localhost:8080/url-pattern/servlet/sample1
package com.imooc.filter;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class SampleServlet1*/
@WebServlet("/servlet/sample1")
public class SampleServlet1 extends HttpServlet {private static final long serialVersionUID = 1L;/*** @see HttpServlet#HttpServlet()*/public SampleServlet1() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub// 仅为演示目的,这儿打印类名response.getWriter().println("This is"+this.getClass().getSimpleName());}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubdoGet(request, response);}}
过滤器类:UrlPatternFilter:本篇博客的主要目的是url-pattern,所以在这个过滤器的doFilter方法中,就打印请求的url:
package com.imooc.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class UrlPatternFilter implements Filter{@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest req = (HttpServletRequest)request;HttpServletResponse res = (HttpServletResponse)response;// 这儿打印拦截到的urlSystem.out.println("拦截到"+req.getRequestURL()); // getRequestURL选用的是返回值为StringBuffer的那一个chain.doFilter(request, response);}@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}
1.情况一:web.xml中的url-pattern是/test.jsp时:
当web.xml中的url-pattern是/test.jsp时:即此时是资源的精准匹配。
访问test.jsp时:
但是如果,访问SampleServlet1的时候:
2.情况二:web.xml中的url-pattern是/servlet/*时:
如果想让过滤器拦截到localhost:8080/url-pattern/servlet/sample1,url-pattern应该这样设置:
效果:发现,此时可以拦截到localhost:8080/url-pattern/servlet/sample1了;
注解:<url-pattern></url-pattern>标签中的url值,如只写/servlet/*就行了,而不用写成/url-pattern/servlet/*,即其省略了上下文路径!
四:着重说明:“三:案例演示”部分的补充说明:几个需要注意的点
/:映射的问题:需要说明的几个容易出错的问题!!!
1.第一个注意的点,Servlet的url设置成“/”,可以充当根路径,此时过滤器的url-pattern设置成“/”的时候,过滤器可以拦截这个Servlet
首先,创建SampleServlet2:这个Servlet的url为“/”,即代表,要把这个Servlet设置成项目的默认首页,即当直接访问localhost:8080/url-pattern/的时候,会访问这个Servlet,然后这个Servlet会转到特定的前端界面(html或jsp等啦);
同时,web.xml中的过滤器的url-pattern设置为:“/”,以期访问SampleServlet2的时候,过滤器能够拦截这个请求:
如果访问:localhost:8080/url-pattern/:后面不增加其他任何资源,其直接访问的是SampleServlet2(即此时,SampleServlet2看来就像是应用的“默认首页”(其实不能这么说啦));同时,过滤器也拦截了这个请求;
但是,需要注意,这个“/”映射web应用根路径的时候,只对Servlet起作用!而且:默认的首页index.jsp会让其失效!!!
……………………………………………………
2.第二个需要注意的点:默认的首页index.jsp会让第一点中的东西失效
如果此时在项目中,增加一个index.jsp:默认首页
那么此时,访问localhost:8080/url-pattern/的时候,SampleServlet2和index.jsp哪个生效嘞?
此时,再访问localhost:8080/url-pattern/:后面不增加其他任何资源的时候,访问的是默认首页index.jsp,而不是访问SampleServlet2了;同时在程序的控制台,也并没有被过滤器拦截的记录。
疑问:即也配置了SampleServlet2的url为“/”,即设置了根路径,,也在web.xml中配置了过滤器url-pattern为“/”;为什么访问localhost:8080/url-pattern/的时候,不仅没有访问SampleServlet2,而且过滤器也没有对localhost:8080/url-pattern/进行拦截呐???
原因:这里涉及到了Tomcat的一个底层机制,尽管在url中访问的是“/”(根路径,也就是localhost:8080/url-pattern/啦),但是因为web.xml配置了默认首页(就是index.html,index.jsp那些啦),实际上在访问localhost:8080/url-pattern/这个根路径的时候,隐式的跳转到了index.jsp; 同时过滤器并没有拦截index.jsp;
同时发现,默认首页的优先级是比Servlet(url设置成"/")要高的,一旦设置了默认首页(如有了index.jsp)后,会让上面的那个路径设置成“/”的SampleServlet2失效,也就是上面所说的“默认首页index.jsp会让“/”的作用失效”。
如果,已经有了index.jsp,还想让过滤器对index.jsp(默认首页)进行拦截的话,此时过滤器的url-pattern需要设置成:*.jsp,或者/index.jsp才行;
……………………………………………………
3.面对1、2两个注意点,一个不错的做法
为了避免上述问题,不错的做法是:在实际项目开发中,尽量不要设置index.jsp这样的默认首页;而是设置url为“/”的Servlet,通过这个映射到根路径的Servlet,来去跳转到指定的页面进行显示。这样做可以保证(url设置成“/”的)Servlet不会失效,又能手动的控制我们要显示的页面是哪个;!!!!!!!!!!
……………………………………………………
4.复合url-pattern:同时过滤多种url
对于过滤器来说,既想对默认根路径进行过滤,又想对所有jsp进行过滤,还想对所有Servlet前缀的url进行过滤,这种复合的应该怎么做?
结果:发现,此时访问默认首页index.jsp也被过滤器拦截了:很简单,因为,index.jsp是默认首页,当浏览器访问localhost:8080/url-pattern/的时候,自然会访问index.jsp;但是,又因为在过滤器中添加了*.jsp,所以自然也会对index.jsp进行拦截了。
五:设置过滤范围:注解的写法
过滤器六:url-pattern设置过滤范围相关推荐
- charles 过滤器-简单过滤和设置过滤
charles 过滤器-简单过滤和设置过滤 一.简单过滤 二.设置过滤 一.简单过滤 二.设置过滤 打开位置 点击add添加要抓取的域名信息 排除筛选(操作和选择筛选一样)被指定的域名会被排除掉不会抓 ...
- STM32 CAN模块问题:1、CAN收发器断电后重新上电,CAN模块死机(离线)现象;2、过滤器配置完之后没有过滤效果
做了一个项目,使用STM32F103VBT6来做GPS终端,在调试过程中发现两个问题,记录下来以便今后参考! 问题一: 给电路板上电,CAN模块正常收发,然后断电,此时因为有电池原因CPU不断电,正常 ...
- excel切片器显示错误_使用切片器在Excel中设置过滤条件
excel切片器显示错误 In most cases, it's best if you keep people away from your data in Excel. It's too easy ...
- FFplay文档解读-21-音频过滤器六
26.50 equalizer 应用双极峰值均衡(EQ)滤波器. 利用该滤波器,可以增加或减少所选频率处和附近的信号电平,同时(与带通和带阻滤波器不同)在所有其他频率处不变. 为了产生复杂的均衡曲线, ...
- 在URL上设置时间戳
//获取当前的毫秒数 var timestamp =new Date().getTime();function ntimestamp() {return 't=' + new Date().getTi ...
- php ci url,URL路由设置-CI(codeigniter)PHP框架再探
前面文章整体说了一下Codeigniter的访问,其中涉及到route,URL路由设置,下面对CI再说一下 在application/config/文件夹下有routes.php的设置. 1.首先说U ...
- 阿里企业邮箱设置过滤方法
阿里企业邮箱设置过滤方法如下: 1.单击邮箱页面顶部的"邮箱设置"链接,然后单击新页面上的"筛选器". 2.进入"过滤"编辑页面,点击&qu ...
- Springboot应用中过滤器chain.doFilter后设置header无效
Springboot应用中过滤器chain.doFilter后设置header无效 本文是在使用过滤器添加动态header过程中遇到设置header无效,经过研究源码而产生. 因为特殊需求,自定义的h ...
- Suspicious URL pattern: [/druid/**] ,进入不了druid的后台
Suspicious URL pattern: [/druid/**] in context [], see sections 12.1 and 12.2 of the Servlet specifi ...
最新文章
- c语言储存10的500,c语言程序基础练习题500道
- 【c语言】hello
- java 静态实例_Java实例和静态方法
- 九 Deepin配置ssh访问gitee
- python 中的转义序列
- 第二百二十三节,jQuery EasyUI,ComboBox(下拉列表框)组件
- 英媒:中国媒体警告将挤走苹果 苹果股价应声下跌
- ABAP的自学之路 ,初步认识ABAP 一
- 2018.12.17-dtoj-1170-最长公共子串
- nginx 访问控制之 document_uri
- bug篇——MySQL的时区问题
- 想要轻松制作GIF图片,来看篇超全面的分析!
- phpstudy 提示安装VC9 VC14等,MySQL启动失败红色小点点,解决办法。PHP VC版本下载集合
- Navicat Premium 历史版本地址
- Linux沙箱技术介绍
- 对于网络文学而言 计算机叙事,90年代文学的“增量”
- 扫呗扫码点餐,如何在扫呗后台给这个商户配一下支付授权地址
- 散列——再散列与双散列(C++)
- java毕业设计——基于JSP+mysql的BBS论坛系统设计与实现(毕业论文+程序源码)——论坛系统
- RISC-V架构生态及相关学习记录