您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
5_Filter_细节_执行流程&生命周期(filter创建模板与生命周期)
发布时间:2022-09-25 13:20:19编辑:雪饮阅读()
为了不影响研究,我们可以把上篇中所创建的filter标签与filter-mapping从WEB-INF中的web.xml中移除掉。
filter代码模板
但为了能了解下filter的代码模板,所以我们也再利用代码模板新建一个新的filter吧。
在File=>Settings…=>Editor=>File and Code Templates=>Web=>Java code templates=>Filter Annotated Class.java如:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebFilter(filterName = "${Entity_Name}")
public class ${Class_Name} implements javax.servlet.Filter {
public void destroy() {
}
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, java.io.IOException {
chain.doFilter(req, resp);
}
public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {
}
}
像是之前servlet代码模板一样,我们可以自己修改的,那么这里比如修改为:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
@javax.servlet.annotation.WebFilter("/*")
public class ${Class_Name} implements javax.servlet.Filter {
public void destroy() {
}
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, java.io.IOException {
chain.doFilter(req, resp);
}
public void init(javax.servlet.FilterConfig config) throws javax.servlet.ServletException {
}
}
生命周期doFilter
filter生命周期有destroy、doFilter和init。
这里先来了解下doFilter生命周期.
src/package3下建立Filter2.java如:
package package3;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class Filter2 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("doFilter放行请求前");
chain.doFilter(req, resp);
System.out.println("doFilter刚才放行的请求任务完成,该请求回来后(个人理解:类似与php大多数框架中经常看到的那种路由中间件里面next方法的调用)");
}
public void init(FilterConfig config) throws ServletException {
}
}
然后为了能看统一无差异的看到所放行的request做了任务。所以web下面的index.jsp也修改下:
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/9/23
Time: 21:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
$END$
<%
System.out.println("index.jsp被访问(个人理解:这里就是那个被放行的请求所做的任务)");
%>
</body>
</html>
重启tomcat服务器后会按我们理解的这个猜想进行执行。
但是奇怪的是在output控制台中可以看到多个上面设计的这些个流程会执行两遍。
哥这边怀疑是浏览器默认会访问那个icon的请求导致(chrome最常见,其它浏览器可能没有此问题)
这个doFilter放行后被放行请求回来后一般可常用于请求消息增强。
filter的全部生命周期
为了了解filter的全部周期的执行流程,统一输出打印格式并比较好区分各个阶段,则我们调整如:
src/Filter2.java:
package package3;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter("/*")
public class Filter2 implements Filter {
/*
* 在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次
* */
public void init(FilterConfig config) throws ServletException {
System.out.println("---init被访问");
}
/*
* 每一次请求被拦截资源时,会执行
* */
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("----------doFilter放行请求前");
chain.doFilter(req, resp);
System.out.println("-------------doFilter刚才放行的请求任务完成,该请求回来后(个人理解:类似与php大多数框架中经常看到的那种路由中间件里面next方法的调用)");
}
/*
* 在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法
* */
public void destroy() {
System.out.println("---destroy被访问");
}
}
web/index.jsp调整如:
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2022/9/23
Time: 21:41
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
$END$
<%
System.out.println("-----------doFilter index.jsp被访问(个人理解:这里就是那个被放行的请求所做的任务)");
%>
</body>
</html>
然后可以正常启动或停止tomcat服务器以及测试访问index.jsp可以看到在output控制台中是按我们所理解的意思执行的。
关键字词:Filter,细节,执行流程,生命周期,filter,创建模板