javaWeb filter-filter-filter実行プロセス
filter-filter実行プロセス
- 学生がキャンパスに入るとき、彼は最初に警備員に会います、そして学生がキャンパスを離れる場合、彼はまた警備員に遭遇します
- フィルター実行プロセス
- Tomcatエンジンはhttpリクエストをリクエストオブジェクトに変換し、httpレスポンスをレスポンスオブジェクトに変換します
- アドレスが条件を満たしている場合、リクエストと応答はdoFilterメソッドに渡されます
- chain.doFilter(request、response)メソッドに渡します
- 次に、サーブレットが3つの処理を完了したら、doGetメソッドまたはdoPostメソッドに渡します。
- doFilterが残りのコードを実行した後、応答はブラウザーに戻ります
- エンコーディングのコード位置を設定する
- doFilterの前に要求エンコーディングを設定し、前に応答エンコーディングを設定します。
## filter-フィルターの実行順序
- リクエストをフィルタリングする2つのフィルターがある場合、実行の順序は何ですか?
最初にFilter1、次にFilter2、最後にサーブレット、その反対は応答が返される場合です
-
フィルターの実行順序を決定する設定は何ですか?
-
構成
解除複数のフィルターがある場合、フィルタークラスの最初の文字の順に実行されます。最初にAFilter、次にBFilter
-
複数のフィルターがweb.xmlに準拠している場合のweb.xml構成<filter-mapping></filter-mapping>
は、実行順に連続して配置されます。
##コードケース
AFilter:
package com.lbl.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/s2")
public class AFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("第1个过滤器收到请求");
chain.doFilter(req, resp);
System.out.println("第1个过滤器收到响应");
}
public void init(FilterConfig config) throws ServletException {
}
}
BFilter
package com.lbl.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/s2")
public class BFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("第2个过滤器收到请求");
chain.doFilter(req, resp);
System.out.println("第2个过滤器收到响应");
}
public void init(FilterConfig config) throws ServletException {
}
}
Demo02Servlet
package com.lbl.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/s2")
public class Demo02Servlet 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("servlet执行了");
}
}
実行結果:
コメント@ WebFilter、xml構成に変更
OneFilter
package com.lbl.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//@WebFilter("/s3")
public class OneFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("第one个过滤器收到请求");
chain.doFilter(req, resp);
System.out.println("第one个过滤器收到响应");
}
public void init(FilterConfig config) throws ServletException {
}
}
TwoFilter
package com.lbl.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
//@WebFilter("/s3")
public class TwoFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("第two个过滤器收到请求");
chain.doFilter(req, resp);
System.out.println("第two个过滤器收到响应");
}
public void init(FilterConfig config) throws ServletException {
}
}
Demo03Servlet
package com.lbl.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//@WebServlet("/s3")
public class Demo03Servlet 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("Demo03Servlet....servlet执行了");
}
}
Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>Demo3Servlet</servlet-name>
<servlet-class>com.lbl.servlet.Demo03Servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Demo3Servlet</servlet-name>
<url-pattern>/s3</url-pattern>
</servlet-mapping>
<filter>
<filter-name>TwoFilter</filter-name>
<filter-class>com.lbl.filter.TwoFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>TwoFilter</filter-name>
<url-pattern>/s3</url-pattern>
</filter-mapping>
<filter>
<filter-name>OneFilter</filter-name>
<filter-class>com.lbl.filter.OneFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OneFilter</filter-name>
<url-pattern>/s3</url-pattern>
</filter-mapping>
</web-app>
実行結果:
フィルターフィルターのライフサイクル(理解)
フィルターには3つの方法があります。
- initメソッド:サーバーの起動時にフィルターオブジェクトが作成されます
- doFilterメソッド:要求のパスがフィルターを満たす構成済みパスである場合は常に、フィルターのdoFilterメソッドが1回実行されます
- destroyメソッド:サーバーがシャットダウンするとフィルターが破棄されます