Java学习路线-49:Servlet过滤器Filter(1)

简介: Java学习路线-49:Servlet过滤器Filter

课时1 过滤器的入门

JavaWeb三大组件

1、都需要在web.xml中进行配置

Servlet

Filter

Listener


2、过滤器

会在一组资源(jsp, servlet, css, html等等)的前面执行

可以让请求得到目标资源,也可以不让请求达到

过滤器有拦截请求的能力


3、编写过滤器

(1)实现Filter接口

(2)在web.xml中进行配置

(3)Filter是单例的


4、配置web.xml

<web-app>
    <filter>
        <filter-name>FilerName</filter-name>
        <filter-class>FilerClass</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>FilerName</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

继承示例

package com.pengshiyu.filtrer;
import javax.servlet.*;
import java.io.IOException;
public class Afilter implements Filter {
    /**
     * 创建之后马上执行,用来做初始化
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    /**
     * 每次过滤都会执行
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 
        FilterChain filterChain) throws IOException, ServletException {
        System.out.println("进入过滤器");
        // 调用后序方法
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("离开过滤器");
    }
    /**
     * 销毁之前的调用,用来释放资源
     */
    @Override
    public void destroy() {
    }
}

FilterConfig -> 与ServletConfig相似

获取初始化参数 getInitParameter()

获取过滤器名称 getFilterName()

获取application getServletContext()


FilterChain

放行,执行后序方法 doFilter()

课时2 多个过滤器的执行顺序

执行下一个过滤器或目标资源

FilterChain.doFilter()


Afilter进入过滤器

Bfilter进入过滤器

getAge

Bfilter离开过滤器

Afilter离开过滤器


课时3 四种拦截方式

请求 REQUEST 默认

转发 FORWARD

包含 INCLUDE

错误 ERROR

<filter-mapping>
    <filter-name>FilerName</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>

页面出错

<error-page>
    <error-code>500</error-code>
    <location>500.html</location>
</error-page>

课时4 使用filter-mapping控制多个Filter的执行顺序

filter-mapping的配置顺序决定过滤器执行顺序

课时5 Filter的应用场景、Filter的目标资源、小结

预处理:执行目标资源之前做预处理工作,例如设置编码

拦截:通过条件判断是否放行,例如用户登录校验

回程拦截:目标资源执行之后,做一些后序的特殊处理工作,例如目标资源输出的数据进行处理


直接指定servlet-name


<filter-mapping>
    <filter-name>FilerName</filter-name>
    <servlet-name>ServletName</servlet-name>
</filter-mapping>
 
         

小结

Filter3个方法

FilterChain类

4中拦截方式

课时6 案例1:分IP统计访问次数

数据结构:

image.png

统计工作在所有资源之前都执行,使用Filter

这个过滤器只做统计,不做拦截

数据Map<String, Integer>

Map保存到ServletContext中

从request中获取客户端ip

使用监听器创建 map

AListener.java

package com.pengshiyu.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.LinkedHashMap;
import java.util.Map;
public class AListener implements ServletContextListener {
    // 服务器启动时创建map
    public void contextInitialized(ServletContextEvent sce) {
        Map<String, Integer> map = new LinkedHashMap<String, Integer>();
        sce.getServletContext().setAttribute("map", map);
    }
    public void contextDestroyed(ServletContextEvent sce) {
    }
}

使用过滤器统计数据

AFilter.java

package com.pengshiyu.filter;
import javax.servlet.*;
import java.io.IOException;
import java.util.Map;
public class AFilter implements Filter {
    private FilterConfig config;
    /**
     * 创建之后马上执行,用来做初始化
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.config = filterConfig;
    }
    /**
     * 每次过滤都会执行
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
        FilterChain filterChain) throws IOException, ServletException {
        ServletContext app = this.config.getServletContext();
        Map<String, Integer> map = (Map<String, Integer>)app.getAttribute("map");
        String ip  =  request.getRemoteAddr();
        System.out.println("ip: " + ip);
        if(map.containsKey(ip)){
            Integer count = map.get(ip);
            map.put(ip, count+1);
        } else{
            map.put(ip, 1);
        }
        // 放行
        filterChain.doFilter(request, response);
    }
    /**
     * 销毁之前的调用,用来释放资源
     */
    @Override
    public void destroy() {
    }
}

显示数据

BServlet.java

package com.pengshiyu.servlet;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws IOException {
        ServletContext app = getServletContext();
        Map<String, Integer> map = (Map<String, Integer>) app.getAttribute("map");
        response.setContentType("text/html; charset=UTF-8");
        response.getWriter().println(map.toString());
    }
}

配置监听器和过滤器生效

web.xml

<?xml version="1.0" encoding="utf-8"?>
<web-app>
    <servlet>
        <servlet-name>BServlet</servlet-name>
        <servlet-class>com.pengshiyu.servlet.BServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>BServlet</servlet-name>
        <url-pattern>/b</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>AFilter</filter-name>
        <filter-class>com.pengshiyu.filter.AFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>AFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>com.pengshiyu.listener.AListener</listener-class>
    </listener>
</web-app>
相关文章
|
3月前
|
IDE Java 关系型数据库
Java 初学者学习路线(含代码示例)
本教程为Java初学者设计,涵盖基础语法、面向对象、集合、异常处理、文件操作、多线程、JDBC、Servlet及MyBatis等内容,每阶段配核心代码示例,强调动手实践,助你循序渐进掌握Java编程。
427 3
|
3月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
614 1
|
3月前
|
SQL 算法 Java
零基础到精通的史上最强 Java 学习路线图推荐
史上最全Java学习路线图,涵盖基础语法、面向对象、数据结构与算法、多线程、JVM、Spring框架、数据库及项目实战,助你从零基础到精通Java开发,附完整代码与工具推荐。
246 3
零基础到精通的史上最强 Java 学习路线图推荐
|
3月前
|
SQL 算法 Java
适合自学的史上最强 Java 学习路线图分享
本路线图系统讲解Java从入门到进阶的学习路径,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架如Spring、数据库操作及项目实战,助你全面掌握Java开发技能,适合零基础及进阶学习。
896 0
|
3月前
|
Java API 数据库
2025 年最新 Java 实操学习路线,从入门到高级应用详细指南
2025年Java最新实操学习路线,涵盖从环境搭建到微服务、容器化部署的全流程实战内容,助你掌握Java 21核心特性、Spring Boot 3.2开发、云原生与微服务架构,提升企业级项目开发能力,适合从入门到高级应用的学习需求。
641 0
|
3月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
301 1
|
3月前
|
缓存 Java API
2025 年小白也能轻松上手的 Java 最新学习路线与实操指南深度剖析
2025年Java最新学习路线与实操指南,涵盖基础语法、JVM调优、Spring Boot 3.x框架、微服务架构及容器化部署,结合实操案例,助你快速掌握企业级Java开发技能。
386 0
|
3月前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
519 3
|
3月前
|
监控 Java API
2025 年全新出炉的 Java 学习路线:从入门起步到实操精通的详细指南
2025年Java学习路线与实操指南,涵盖Java 21核心特性、虚拟线程、Spring Boot 3、微服务、Spring Security、容器化部署等前沿技术,助你从入门到企业级开发进阶。
715 0
|
4月前
|
NoSQL Java 关系型数据库
Java 从入门到进阶完整学习路线图规划与实战开发最佳实践指南
本文为Java开发者提供从入门到进阶的完整学习路线图,涵盖基础语法、面向对象、数据结构与算法、并发编程、JVM调优、主流框架(如Spring Boot)、数据库操作(MySQL、Redis)、微服务架构及云原生开发等内容,并结合实战案例与最佳实践,助力高效掌握Java核心技术。
400 0