Filter,什么是过滤器?
1.Filter过滤器是javaWeb的三大组件之一,
2.三大组件分别是:Servlet程序,Filter过滤器,Listener监听器。
3.Filter是接口。
4.Filter的作用是:拦截请求,过滤响应。
Filter的初体验
需求:在webContent目录下有一个admin目录。然后在这个目录下有html页面,jsp页面,jpg图片。
要求这个目录下所有的资源都必须登录之后才能访问。
我们可以在jsp页面中,通过判断,Session域中是否包含用户登录的信息。
如果Session有用户登录的信息,说明已经登录,允许访问。返回,则让页面跳转到登录页面。
<%
Object user = session.getAttribute("user");
// 用户没登录
if (user == null) {
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
%>
如何使用Filter来保持Admin下的资源,在登录之后才允许访问。
Filter的使用步骤:
1、编写一个类去实现Filter接口
2、实现doFilter拦截的方法。
3、到web.xml中去配置拦截的资源地址
AdminFilter的代码:
public class AdminFilter implements Filter {
/**
* doFilter方法在每次拦截到请求之后就会调用
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
//做拦截检查的工作
Object user = httpRequest.getSession().getAttribute("user");
// 用户没登录
if (user == null) {
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
} else {
// 已经登录
chain.doFilter(request, response);
}
}
}
web.xml中的配置:
<!-- Filter标签 配置Filter过滤器 -->
<filter>
<filter-name>AdminFilter</filter-name>
<filter-class>com.atguigu.filter.AdminFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AdminFilter</filter-name>
<!--
/admin/* 表示 http://ip:port/工程名/admin/* 全部资源
-->
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
login.jsp页面
<body>
<form action="${ pageContext.request.contextPath }/loginServlet" method="post">
用户名:<input type="text" name="username" /><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" />
</form>
</body>
LoginServlet程序
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("wzg168".equals(username) && "123456".equals(password)) {
request.getSession().setAttribute("user", username);
System.out.println("登录成功!");
} else {
System.out.println("登录失败!");
}
}
}
Filter的生命周期
1、Filter的构造器方法
2、执行init初始化操作
3、执行doFilter过滤方法 每次拦截都会执行
4、执行destroy销毁方法
FilterConfig 类
FilterConfig类封装了Filter过滤器的配置信息。
作用:
1、获取filter-name的值 过滤器的别名
2、获取init-param初始化参数
3、获取ServletContext对象
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
// System.out.println("2、init");
// 作用:
// 1、获取filter-name的值 过滤器的别名
System.out.println("Filter的名称:" + filterConfig.getFilterName());
// 2、获取init-param初始化参数
System.out.println("Filter的初始化参数url值是:"
+ filterConfig.getInitParameter("url"));
// 3、获取ServletContext对象
System.out.println( filterConfig.getServletContext() );
}
web.xml中的配置信息:
<filter>
<filter-name>AdminFilter</filter-name>
<filter-class>com.atguigu.filter.AdminFilter</filter-class>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AdminFilter</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
FilterChain 过滤器链
Filter 过滤器
Chain 链条
FilterChain 过滤器链
Filter1
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Filter1 前置代码");
System.out.println("Filter1中获取请求参数:" + request.getParameter("username"));
System.out.println("Filter1 当前线程 ==>> " + Thread.currentThread().getName() );
chain.doFilter(request, response);
System.out.println("Filter1 后置代码");
}
Filter2
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Filter2 前置代码");
System.out.println("Filter2中获取请求参数:" + request.getParameter("username"));
System.out.println("Filter2 当前线程 ==>> " + Thread.currentThread().getName() );
chain.doFilter(request, response);
System.out.println("Filter2 后置代码");
}
target.jsp页面
<body>
<%
System.out.println("target.jsp执行……");
System.out.println("target.jsp页面中获取请求参数:" + request.getParameter("username"));
System.out.println("target.jsp 当前线程 ==>> " + Thread.currentThread().getName() );
%>
</body>
Filter的拦截路径
--精确匹配
<url-pattern>/target.jsp</url-pattern>
以上的拦截地址,只有当用户请求地址为:http://ip:port/工程名/target.jsp的时候,Filter就会执行。
--目录匹配
<url-pattern>/admin/*</url-pattern>
以上的拦截地址,只有当用户请求地址为:http://ip:port/工程名/admin/下所有资源,的时候就会执行Filter
–后缀名匹配
<url-pattern>*.jsp</url-pattern>
以上的拦截地址。表示只要用户访问的地址是以.jsp结尾,就会拦截。
<url-pattern>*.html</url-pattern>
以上的拦截地址。表示只要用户访问的地址是以.html结尾,就会拦截。
<url-pattern>*.do</url-pattern>
以上的拦截地址。表示只要用户访问的地址是以.do结尾,就会拦截。
<url-pattern>*.action</url-pattern>
以上的拦截地址。表示只要用户访问的地址是以.action结尾,就会拦截。
对于Filter过滤器来说,只要请求的地址匹配上。就会执行Filter过滤器。
它不关心请求的资源是否存在!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?