2023-01-06 一、過濾器的匹配規則 主要研究的就是“filter-mapping”中“url-pattern”的值的編寫方式的個數。 (1)在創建的模塊中的src文件夾下的Servlet文件夾下創建“AServlet”、“BServlet”,去掉註解。之後設置訪問路徑。 <servlet-m ...
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>”標簽中間中如果是“尾碼匹配”,不需要加“/”。其他兩種匹配,一般請求下需要加“/”,如果忘加的話,伺服器會啟動不起來。
總結:如果過濾器只過濾一個請求,就是用精確匹配;如果過濾器過濾過個請求,就使用目錄匹配或者尾碼匹配。