Java Web——Servlet的过滤器接口(Filter)

简介: Java Web——Servlet的过滤器接口(Filter)

文章目录:


1.介绍

2.作用

3.Filter接口实现类开发步骤

4.过滤器接口的第一个例子

5.过滤器接口的第二个例子

6.过滤器拦截地址


1.介绍


Filter接口来自于Servlet规范。

Filter接口实现类由项目开发人员实现。

Filter接口可以在tomcat调用资源文件之前进行拦截 。


2.作用


拦截tomcat之后,帮助tomcat检测本次请求合法性。

拦截tomcat之后,对本次拦截的请求做增强服务。


3.Filter接口实现类开发步骤


创建Filter接口实现类。

重写doFilter方法。

在web.xml中注册过滤器接口实现类。


4.过滤器接口的第一个例子


拦截tomcat之后,帮助tomcat检测本次请求合法性。

package com.songzihao.filter;
import javax.servlet.*;
import java.io.IOException;
/**
 *
 */
public class OneFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //从拦截得到的请求对象中的请求头参数,得到用户年龄
        String age=servletRequest.getParameter("age");
        //根据用户年龄判断本次请求是否合法
        if (Integer.valueOf(age)<70) {
            filterChain.doFilter(servletRequest,servletResponse);
        }else {
            servletResponse.setContentType("text/html;charset=utf-8");
            servletResponse.getWriter().print("抱歉,您无法查看此图片!!!");
        }
    }
}

在web目录下任意添加一张图片


<?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">
    <!-- 声明一个变量存储过滤器接口实现类的全限定名称 -->
    <filter>
        <filter-name>oneFilter</filter-name>
        <filter-class>com.songzihao.filter.OneFilter</filter-class>
    </filter>
    <!-- 通知tomcat在调用何种文件之前需要由过滤器进行拦截 -->
    <filter-mapping>
        <filter-name>oneFilter</filter-name>
        <url-pattern>/美国队长.jpg</url-pattern>
    </filter-mapping>
</web-app>


通过在浏览器中输入参数 age 的值。


当小于70时,filterChain 这个过滤器链条对象,将会把拦截到的请求对象和响应对象,重新交还给tomcat,tomcat将相应的信息写入响应体中,推送给浏览器。


当大于等于70时,就没必要去找tomcat了,直接进行拦截,通过响应对象获取输出流,将对应的信息直接返回给浏览器。




5.过滤器接口的第二个例子


拦截tomcat之后,对本次拦截的请求做增强服务。


当请求对象中的信息到达tomcat之前,对请求体(浏览器以post方式发起请求,写入请求体)中的内容进行 utf-8 字符集解析。之后过滤器链条对象 filterChain 将拦截对象进行放行,此时到达tomcat之后,就是正确的 utf-8 字符集。


package com.songzihao.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class OneServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //得到请求对象之后,直接从请求体中读取参数信息
        String value=request.getParameter("userName");
        System.out.println("从请求体读取到的参数信息===" + value);
    }
}
package com.songzihao.filter;
import javax.servlet.*;
import java.io.IOException;
/**
 *
 */
public class OneFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //在请求对象到达目的地之前,对请求对象进行增强处理
        servletRequest.setCharacterEncoding("utf-8");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
<?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">
    <!-- 声明一个变量存储过滤器接口实现类的全限定名称 -->
    <filter>
        <filter-name>oneFilter</filter-name>
        <filter-class>com.songzihao.filter.OneFilter</filter-class>
    </filter>
    <!-- 通知tomcat在调用何种文件之前需要由过滤器进行拦截 -->
    <filter-mapping>
        <filter-name>oneFilter</filter-name>
        <url-pattern>/one</url-pattern>
    </filter-mapping>
    <servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>com.songzihao.controller.OneServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
</web-app>


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/myWeb/one" method="post">
        参数:<input type="text" name="userName" /><br/>
        <input type="submit" value="post方式访问OneServlet" />
    </form>
</body>
</html>


6.过滤器拦截地址


1)通知tomcat调用某个具体资源文件时需要调用当前过滤器

    <url-pattern>/文件名.后缀名</url-pattern>


2)通知tomcat调用某个文件夹下资源文件时需要调用当前过滤器

    <url-pattern>/文件夹名/*</url-pattern>


3) 通知tomcat调用某种类型文件时需要调用当前过滤器

    <url-pattern>*.jpg</url-pattern>


4) 通知tomcat在调用当前网站下任意资源文件时需要调用当前过滤器

    <url-pattern>/*</url-pattern>


相关文章
|
5月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
567 1
|
5月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
600 0
|
6月前
|
消息中间件 缓存 前端开发
从资损百万到零事故:Java 接口幂等设计的艺术与实践
在分布式系统中,重复请求常引发严重资损,如支付双扣、库存超卖等问题,其根源在于接口缺乏幂等性设计。本文通过真实案例揭示幂等性的重要性,并详解8种主流解决方案,涵盖唯一请求ID、乐观锁、悲观锁、状态机等,帮助开发者构建稳定系统,保障业务一致性。无论你是架构师还是开发工程师,都能从中获得实战指导,有效规避重复调用带来的风险。
561 2
|
6月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
4月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
5月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
193 11
|
4月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
262 1
|
6月前
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
440 23
|
6月前
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
365 12
|
6月前
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
472 1