??wei_shuo的個人主頁
??wei_shuo的學(xué)習(xí)社區(qū)
??Hello World !
過濾器
概念
過濾器(Filter)是處于客戶端與服務(wù)器目標(biāo)資源之間的一道過濾技術(shù)
- 用戶的請求和響應(yīng)都需要經(jīng)過過濾器
過濾器作用
- 執(zhí)行地位在Servlet之前,客戶端發(fā)送請求是,會先經(jīng)過Filter,再到達(dá)目標(biāo)Servlet中;響應(yīng)時,會根據(jù)執(zhí)行流程再次反向執(zhí)行Filter
- 可以解決多個Servlet共性代碼的冗余問題
- 過濾器可以對請求前和請求后進(jìn)行邏輯處理
編寫過濾器
Servlet API中提供了一個Filter接口,開發(fā)人員編寫一個Java類實現(xiàn)了這個接口即可,這個Java類稱為
過濾器
實現(xiàn)過程
- 編寫Java類實現(xiàn)Filter接口
- 在doFilter方法中編寫攔截邏輯
- 設(shè)置攔截路徑
FilterChain 過濾鏈 作用:
它可以指向下一個資源,如果還有過濾器,則繼續(xù)進(jìn)行下一次的過濾,如果沒有過濾器,則會指向資源
- MyFilter類
package com.woniu.Filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(value = "/t") public class MyFilter implements Filter { //初始化方法 @Override public void init(FilterConfig filterConfig) throws ServletException { } //doFilter方法中編寫攔截邏輯 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("---MyFilter---"); //FilterChain過濾鏈,讓請求繼續(xù) filterChain.doFilter(servletRequest, servletResponse); System.out.println("---End---"); /* 輸出結(jié)果: ---MyFilter--- ---Target--- ---End--- */ } //銷毀方法 @Override public void destroy() { } }
- TargetServlet類
package com.woniu.Filter; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; //注解過濾器,指定過濾目標(biāo)資源 @WebServlet(name = "TargetServlet", value = "/t") public class TargetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("---Target---"); /* 輸出結(jié)果: ---MyFilter--- ---Target--- */ } }
過濾器配置
注解過濾器
在自定義的Filter類上使用注解
@WebServlet(value="/過濾目標(biāo)資源");
@WebServlet(name = "TargetServlet", value = "/t")
xml配置
<!--<!DOCTYPE web-app PUBLIC-->
<!-- "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"-->
<!-- "http://java.sun.com/dtd/web-app_2_3.dtd" >-->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="false">
<!--起始頁面-->
<!--<welcome-file-list>-->
<!--<welcome-file></welcome-file>-->
<!--</welcome-file-list>-->
<filter>
<filter-name>xml</filter-name>
<filter-class>com.woniu.Filter.XmlFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>xml</filter-name>
<url-pattern>/test</url-pattern>
</filter-mapping>
</web-app>
過濾器鏈 & 優(yōu)先級
過濾器鏈
- 概念:
客戶端對服務(wù)器請求之后,服務(wù)器調(diào)用Servlet之前會執(zhí)行一組過濾器(多個過濾器),那么這組過濾器就稱為一條過濾器鏈
- 流程:
每個過濾器實現(xiàn)某個特定的功能,當(dāng)?shù)谝粋€Filter的doFilter方法被調(diào)用時,Web服務(wù)器會創(chuàng)建一個代表Filter鏈的FilterChain對象傳遞給該方法,在doFilter方法中,開發(fā)人員如果調(diào)用了FilterChain對象的doFilter方法,則Web服務(wù)器會檢查FilterChain對象中是否還有Filter,如果有,則調(diào)用第二個Filter,如果沒有,則調(diào)用目標(biāo)資源
過濾器優(yōu)先級
一個Web應(yīng)用中,可以開發(fā)編寫多個Filter,這些Filter組合起來稱為一個Filter鏈
優(yōu)先級:
- 如果為注解的話,是按照類全名稱的字符串順序決定作用順序
- 如果web.xml,按照filter-mapping注冊順序,從上往下
- web.xml配置高于注解方式
- 如果注解和web.xml同時配置,會創(chuàng)建多個過濾器對象,造成過濾多次
過濾器攔截路徑
- 精確攔截匹配:/index.jsp
- 后綴攔截匹配:*.jsp
- 通配符攔截匹配:/* 表示攔截所有
過濾器解決編碼問題
- Login.html頁面
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <form action="/Servlet_Projects_war/login" method="post"> 用戶名:<input type="text" name="username"/><br> 密碼:<input type="password" name="password"/><br> <input type="submit" value="登錄"> </form> </body> </html>
- LoginServlet類
package com.woniu.Filter; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; @WebServlet(name = "LoginServlet", value = "/login") public class LoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //根據(jù)表單組件名稱獲取提交數(shù)據(jù) String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(username + "\t" + password); } }
- EncodingFilter過濾器類
package com.woniu.Filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter(value = "/login") public class EncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //統(tǒng)一處理請求和響應(yīng)的亂碼 servletRequest.setCharacterEncoding("UTF-8"); servletResponse.setContentType("text/html;charset=utf-8"); //FilterChain過濾鏈,讓請求繼續(xù) filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }
- 結(jié)果
張三 123456
?? 結(jié)語:創(chuàng)作不易,如果覺得博主的文章賞心悅目,還請——
點贊
??收藏
??評論
??文章來源:http://www.zghlxwxcb.cn/news/detail-416117.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-416117.html
到了這里,關(guān)于Javaweb | 過濾器、配置、過濾器鏈、優(yōu)先級的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!