Java Web之Filter过滤器原理简介与功能演示
Java Web之Filter过滤器原理简介与功能演示
- 原理简介
- 什么是Filter
- Filter的方法
- Filter的拦截路径
- Filter过滤器的编写步骤
- 功能演示
- 要求
- 思路
- 准备
- 未加Filter过滤器演示
- 添加Filetr过滤器
原理简介
什么是Filter
Filter被称作过滤器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet 进行响应处理前后实现一些特殊功能。
Filter在Web应用中的拦截过程如下图所示

当浏览器访问服务器中的目标资源时,会被Filter拦截,在Filter中进行预处理操作,然后再将请求转发给目标资源。当服务器接收到这个请求后会对其进行响应,在服务器处理响应的过程中,也需要先将响应结果发送给过滤器,在过滤器中对响应结果进行处理后,才会发送给客户端。
Filter的方法
Filter过滤器就是一个实现了javax.servlet.Filter接口的类,在javax.servlet.Filter接口中定义了3个方法。

init(FilterConfig filterConfig)方法
init()方法用来初始化过滤器,开发人员可以在init()方法中完成与构造方法类似的初始化功能。如果初始化代码中要使用到FilterConfig对象,那么,这些初始化代码就只能在Filter的init()方法中编写,而不能在构造方法中编写。
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)方法
doFilter()方法有多个参数,其中,参数request和response为Web服务器或Filter链中的上个Filter传递过来的请求和响应对象;参数chain代表当前Filter链的对象,在当前Filter对象中的doFilter()方法内部需要调用FilterChina对象的doFilter()方法,才能把请求交付给Filter链中的下一个Filter或者目标程序去处理。
destroy()方法
destory()方法在web服务器卸载Filter对象之前被调用,该方法用于释放被Filter对象打开的资源,例如关闭数据库IO流。
Filter的拦截路径
1、精确匹配
2、目录匹配
3、 后缀名匹配
Filter只关心请求的地址是否匹配,不关心请求的资源是否存在。
Filter过滤器的编写步骤
1、编写一个类去实现Filter接口。
2、实现过滤方法doFilter()。
3、到web.xml中去配置Filter的拦截路径。
功能演示
要求
1、登录后可通过url访问静态资源a1.jsp、a2.jsp、b1.html、b2.html。
2、未登录时无法访问,跳转到登陆页面。
思路
每次发送请求时,通过Filter过滤器进行拦截,然后检查是否已经登陆,如果登陆则放行,否则跳转到登陆页面。
准备
在webapp文件夹下创建static文件夹,将静态资源放在该文件夹下。

登陆页面login.jsp放在webapp下


处理登陆提交的servlet如下
作为演示,账号必须为admin,密码必须为123456,输入正确后将username存储在session中,否则跳转回登陆页面。

package com.xxx.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");if ("admin".equals(username)&&"123456".equals(password)){req.getSession().setAttribute("username",username);}else{req.getRequestDispatcher("/login.jsp").forward(req,resp);}}
}
未加Filter过滤器演示
无论登陆与否,只要输入的url正确,即可访问到对应的静态资源,如下


添加Filetr过滤器
继承Filetr接口,并重写Filter的方法。

通过判断Session中是否有登陆成功时的标记username,如果有则放行
否则原跳转回登陆页面
package com.xxx.filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {//Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpServletRequest=(HttpServletRequest)request;HttpSession session = httpServletRequest.getSession();Object username = session.getAttribute("username");if (username==null){//未登录request.getRequestDispatcher("/login.jsp").forward(request,response);}else{chain.doFilter(request,response);}}@Overridepublic void destroy() {//Filter.super.destroy();}
}
在web.xml中配置好Filter过滤器

在没登陆的情况下访问a1.jsp则直接跳转到登陆页面

输入正确的账号密码后,点击提交

可以看到账号密码已经提交给后台

再次访问a1.jsp,既可以成功

演示主要体现Filter过滤器的拦截功能,所有没有移除Session中内容的操作,可根据自己的需要添加相应的逻辑块。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!





