Filter过滤器
每一个Servlet都需要解决自己业务的问题,但是它们都需要判断用户是否已经登陆,
如果登陆了,才可以执行后续操作,如果没有则需要登录
这部分我们可以使用Filter过滤器来将这部分从Servlet中抽离,达到复用效果
我们可以把Servlet程序看作是需要执行的目标,我们可以使用过滤器Filter来添加过滤代码
Filter可以添加到Servlet执行之前也可以是执行之后
过滤器也是根据请求路径来执行的
Servlet对象默认情况下,服务器启动,不会创建对象
Filter对象默认在服务器启动创建对象
chain.doFilter()
这行代码用来放行,执行下一个过滤器,如果没有过滤器,执行最终的servlet
注意Filter的优先级比Servlet高
XML配置和注解配置都会让tomcat服务器创建对象,因为这个是伪单例模式
会有两个同名的对象存在,一起执行方法
在web.xml配置时,filter-mapping配置越靠上,优先级越高
过滤器优先顺序遵循的栈数据结构
Filter过滤器
每一个Servlet都需要解决自己业务的问题,但是它们都需要判断用户是否已经登陆,
如果登陆了,才可以执行后续操作,如果没有则需要登录
这部分我们可以使用Filter过滤器来将这部分从Servlet中抽离,达到复用效果
我们可以把Servlet程序看作是需要执行的目标,我们可以使用过滤器Filter来添加过滤代码
Filter可以添加到Servlet执行之前也可以是执行之后
过滤器也是根据请求路径来执行的
Servlet对象默认情况下,服务器启动,不会创建对象
Filter对象默认在服务器启动创建对象
chain.doFilter()
这行代码用来放行,执行下一个过滤器,如果没有过滤器,执行最终的servlet
注意Filter的优先级比Servlet高
XML配置和注解配置都会让tomcat服务器创建对象,因为这个是伪单例模式
会有两个同名的对象存在,一起执行方法
在web.xml配置时,filter-mapping配置越靠上,优先级越高
过滤器优先顺序遵循的栈数据结构
<?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">
<session-config>
<!-- 代表session的超时时间是30分钟,如果30分钟到,session对象就会被销毁-->
<session-timeout>30</session-timeout>
</session-config>
<!-- 使用欢迎页机制跳转到cookie登录-->
<welcome-file-list>
<welcome-file>Welcome</welcome-file>
</welcome-file-list>
<!-- XML的写法-->
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.bjpowernode.oa.web.Servlet.Filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>filter1</filter-name>
<!-- <url-pattern>/Test/A</url-pattern>-->
<!-- <url-pattern>/Test/B</url-pattern>-->
<url-pattern>/Test/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>filter2</filter-name>
<filter-class>com.bjpowernode.oa.web.Servlet.Filter2</filter-class>
</filter>
<filter-mapping>
<filter-name>filter2</filter-name>
<!-- <url-pattern>/Test/A</url-pattern>-->
<!-- <url-pattern>/Test/B</url-pattern>-->
<url-pattern>/Test/*</url-pattern>
</filter-mapping>
</web-app>
<?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">
<session-config>
<!-- 代表session的超时时间是30分钟,如果30分钟到,session对象就会被销毁-->
<session-timeout>30</session-timeout>
</session-config>
<!-- 使用欢迎页机制跳转到cookie登录-->
<welcome-file-list>
<welcome-file>Welcome</welcome-file>
</welcome-file-list>
<!-- XML的写法-->
<filter>
<filter-name>filter1</filter-name>
<filter-class>com.bjpowernode.oa.web.Servlet.Filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>filter1</filter-name>
<!-- <url-pattern>/Test/A</url-pattern>-->
<!-- <url-pattern>/Test/B</url-pattern>-->
<url-pattern>/Test/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>filter2</filter-name>
<filter-class>com.bjpowernode.oa.web.Servlet.Filter2</filter-class>
</filter>
<filter-mapping>
<filter-name>filter2</filter-name>
<!-- <url-pattern>/Test/A</url-pattern>-->
<!-- <url-pattern>/Test/B</url-pattern>-->
<url-pattern>/Test/*</url-pattern>
</filter-mapping>
</web-app>
package com.bjpowernode.oa.web.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Test/A")
public class AServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
System.out.println("AServlet执行了");
}
}
package com.bjpowernode.oa.web.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Test/A")
public class AServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
System.out.println("AServlet执行了");
}
}
package com.bjpowernode.oa.web.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Test/B")
public class BServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
System.out.println("BServlet执行了");
}
}
package com.bjpowernode.oa.web.Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/Test/B")
public class BServlet extends HttpServlet
{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
System.out.println("BServlet执行了");
}
}
package com.bjpowernode.oa.web.Servlet;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;
//"*.do"这个路径属于模糊匹配的拓展匹配,以*开始,注意这种路径不要以/开始
//还有一种写法/*匹配所有的路径,/dept/*匹配这个下所有的
//@WebFilter("/Test/*")
public class Filter1 implements Filter
{
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
//请求发送的时候添加过滤规则
System.out.println("doFilter方法执行");
//往下走,下一个是过滤器,就继续过滤,不是就走Servlet
//放行,但是该过滤器方法执行未结束,servlet结束才结束
chain.doFilter(request,response);
//响应的时候添加过滤规则
System.out.println("doFilter方法结束");
}
@Override
public void destroy()
{
}
}
package com.bjpowernode.oa.web.Servlet;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import java.io.IOException;
//"*.do"这个路径属于模糊匹配的拓展匹配,以*开始,注意这种路径不要以/开始
//还有一种写法/*匹配所有的路径,/dept/*匹配这个下所有的
//@WebFilter("/Test/*")
public class Filter1 implements Filter
{
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
//请求发送的时候添加过滤规则
System.out.println("doFilter方法执行");
//往下走,下一个是过滤器,就继续过滤,不是就走Servlet
//放行,但是该过滤器方法执行未结束,servlet结束才结束
chain.doFilter(request,response);
//响应的时候添加过滤规则
System.out.println("doFilter方法结束");
}
@Override
public void destroy()
{
}
}
package com.bjpowernode.oa.web.Servlet;
import jakarta.servlet.*;
import java.io.IOException;
public class Filter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("filter2开始");
chain.doFilter(request,response);
System.out.println("filter2结束");
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
package com.bjpowernode.oa.web.Servlet;
import jakarta.servlet.*;
import java.io.IOException;
public class Filter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("filter2开始");
chain.doFilter(request,response);
System.out.println("filter2结束");
}
@Override
public void destroy() {
Filter.super.destroy();
}
}