Java Web之Filter过滤器原理简介与功能演示

简介: Filter被称作过滤器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet 进行响应处理前后实现一些特殊功能。

原理简介

什么是Filter

     Filter被称作过滤器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet 进行响应处理前后实现一些特殊功能。

      Filter在Web应用中的拦截过程如下图所示

2345_image_file_copy_323.jpg

      当浏览器访问服务器中的目标资源时,会被Filter拦截,在Filter中进行预处理操作,然后再将请求转发给目标资源。当服务器接收到这个请求后会对其进行响应,在服务器处理响应的过程中,也需要先将响应结果发送给过滤器,在过滤器中对响应结果进行处理后,才会发送给客户端。

Filter的方法

     Filter过滤器就是一个实现了javax.servlet.Filter接口的类,在javax.servlet.Filter接口中定义了3个方法。

2345_image_file_copy_324.jpg

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只关心请求的地址是否匹配,不关心请求的资源是否存在

功能演示

要求

1、登录后可通过url访问静态资源a1.jsp、a2.jsp、b1.html、b2.html。

2、未登录时无法访问,跳转到登陆页面。

思路

每次发送请求时,通过Filter过滤器进行拦截,然后检查是否已经登陆,如果登陆则放行,否则跳转到登陆页面。

准备

在webapp文件夹下创建static文件夹,将静态资源放在该文件夹下。

2345_image_file_copy_325.jpg

登陆页面login.jsp放在webapp下

2345_image_file_copy_326.jpg

2345_image_file_copy_327.jpg

处理登陆提交的servlet如下

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

2345_image_file_copy_328.jpg

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 {
    @Override
    protected 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正确,即可访问到对应的静态资源,如下

2345_image_file_copy_329.jpg

2345_image_file_copy_330.jpg

添加Filetr过滤器

继承Filetr接口,并重写Filter的方法。

2345_image_file_copy_331.jpg

通过判断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 {
    @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 {
        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);
        }
    }
    @Override
    public void destroy() {
        //Filter.super.destroy();
    }
}

在web.xml中配置好Filter过滤器

2345_image_file_copy_332.jpg

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

2345_image_file_copy_333.jpg

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

2345_image_file_copy_334.jpg

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

2345_image_file_copy_335.jpg

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

2345_image_file_copy_336.jpg

演示主要体现Filter过滤器的拦截功能,所有没有移除Session中内容的操作,可根据自己的需要添加相应的逻辑块。

相关文章
|
3天前
|
负载均衡 Java 程序员
实现Java Web应用的高性能负载均衡方案
实现Java Web应用的高性能负载均衡方案
|
4天前
|
搜索推荐 UED Python
动态多条件查询:理解`filter_by`与`filter`提升Web应用搜索功能
通过深入理解filter_by与filter的异同,并结合使用它们,我们可以构建一个既灵活又强大的动态多条件查询系统。这不仅提升了Web应用的搜索功能,也为用户提供了更加个性化的搜索体验。希望本文能够启发你在自己项目中实现类似的功能,以满足用户多变的搜索需求。
|
3天前
|
IDE Java 开发工具
如何在Java中实现RESTful Web服务
如何在Java中实现RESTful Web服务
|
4天前
|
SQL 监控 安全
Java Web应用的安全防护与攻防
Java Web应用的安全防护与攻防
|
19天前
|
安全 Java 数据库连接
Java Web应用
Java Web应用
16 0
|
2月前
|
前端开发 JavaScript Java
Java语言在Web前端开发中的技术应用
Java语言在Web前端开发中的技术应用
|
2月前
|
设计模式 存储 前端开发
Java的mvc设计模式在web开发中应用
Java的mvc设计模式在web开发中应用
|
2月前
|
前端开发 Java 数据库
Java Web开发全攻略:构建高性能Web应用
【4月更文挑战第2天】Java Web开发围绕Servlet和JSP展开,结合Spring/Spring Boot、Struts2、Hibernate等框架构建高性能应用。数据库选择和优化、前端技术如Angular/React/Vue.js以及CI/CD实践是关键。从电子商务到企业系统,Java Web技术为企业与用户互动提供强大平台。持续学习和适应新技术,以应对Web开发挑战。
Java Web开发全攻略:构建高性能Web应用
|
2月前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
2月前
|
Java Maven 开发者
深入剖析Spring Boot在Java Web开发中的优势与应用
深入剖析Spring Boot在Java Web开发中的优势与应用
112 3