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>


相关文章
|
10天前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
|
12天前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
37 4
|
12天前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
30 0
WK
|
18天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
25 0
|
1月前
|
前端开发 Java API
JAVA Web 服务及底层框架原理
【10月更文挑战第1天】Java Web 服务是基于 Java 编程语言用于开发分布式网络应用程序的一种技术。它通常运行在 Web 服务器上,并通过 HTTP 协议与客户端进行通信。
23 1
|
Java 缓存 应用服务中间件
Java EE 之 过滤器入门学习与总结(2)
今天就对使用Filter技术能做什么来个小小的归纳。也为了方便今后的复习。 控制浏览器不进行对jsp页面的缓存 //在doFilter方法中添加这样的代码 HttpServletRequest request = (HttpServletRequest )req; Ht...
1022 0
|
9天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
19天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
6天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
25 9
|
9天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####