学习笔记——过滤器的匹配规则
2023-01-06
一、过滤器的匹配规则
主要研究的就是“filter-mapping”中“url-pattern”的值的编写方式的个数。
(1)在创建的模块中的src文件夹下的Servlet文件夹下创建“AServlet”、“BServlet”,去掉注解。之后设置访问路径。
<servlet-mapping> <servlet-name>AServlet</servlet-name> <url-pattern>/a</url-pattern> </servlet-mapping>
<servlet-mapping>
<servlet-name>BServlet</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
(2)设置“AServlet”和“BServlet”中的函数
public class AServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("访问到了AServlet..."); }
public class BServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("访问到了BServlet"); } }
(3)在web文件夹下创建一个“index.html”页面,设置两个超链接
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <a href="a">点击访问AServlet</a> <a href="b">点击访问BServlet</a> </body> </html>
(4)在src文件夹下的com.hh.filter文件夹下创建“AFilter”、“BFilter”类,实现“Filter”(包是javax.servlet)。
(5)在web.xml中设置访问路径
<filter> <filter-name>AFilter</filter-name> <filter-class>com.hh.filter.AFilter</filter-class> </filter> <filter-mapping> <filter-name>AFilter</filter-name> <url-pattern>/a</url-pattern> </filter-mapping> <filter> <filter-name>BFilter</filter-name> <filter-class>com.hh.filter.BFilter</filter-class> </filter> <filter-mapping> <filter-name>BFilter</filter-name> <url-pattern>/b</url-pattern> </filter-mapping>
二、匹配类型
1、精确匹配
<url-pattern>/a</url-pattern> <url-pattern>/b</url-pattern>
作用:过滤项目下的a/b请求
2、目录匹配
<url-pattern>/user/*</url-pattern>
作用:过滤项目下user请求下的所有
这个使用时,可以将超链接中的href设置为:“user/a”、“user/b”,此时只使用一个过滤器就行。可将AServlet、BServlet的访问路径也改为“user/a”、“user/b”(在web.xml中)
如果此时只使用“BFilter”过滤器,那么在此类中的“doFilter”添加代码
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("访问到user/的过滤器"); //过滤器放行 filterChain.doFilter(servletRequest,servletResponse); System.out.println("过滤器放行后的代码"); }
运行结果:
3、后缀匹配
如:此时将AServlet、BServlet的访问路径(在web.xml中)设置为:
<servlet> <servlet-name>AServlet</servlet-name> <servlet-class>com.hh.Servlet.AServlet</servlet-class> </servlet> <servlet> <servlet-name>BServlet</servlet-name> <servlet-class>com.hh.Servlet.BServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AServlet</servlet-name> <url-pattern>/a.action</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>BServlet</servlet-name> <url-pattern>/b.action</url-pattern> </servlet-mapping>
之后将“index.html”中的“href”也改变:
<a href="a.action">点击访问AServlet</a> <a href="b.action">点击访问BServlet</a>
这样也可以访问到。
注意:“<url-pattern>”标签中间中如果是“后缀匹配”,不需要加“/”。其他两种匹配,一般请求下需要加“/”,如果忘加的话,服务器会启动不起来。
总结:如果过滤器只过滤一个请求,就是用精确匹配;如果过滤器过滤过个请求,就使用目录匹配或者后缀匹配。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南