Javaweb学习笔记之过滤器(一):过滤器的基本概念_有几个过滤器服务器就会创造几个过滤器对象吗还是就创建一个_秋忆夏伤的博客-程序员宅基地

技术标签: javaweb学习笔记  

一、过滤器的执行流程:

HelloFilter.java:

package com.filter.demo;

import javax.servlet.*;
import java.io.IOException;

/**
 * Filter 也称之为 过滤器,他是 Servlet 技术中最激动人心的技术,web 开发人员通过 filter 技术,对 web 服务器管理的
 * 所有 web 资源,例如 jsp、servlet、静态图片文件、或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现
 * URL 级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
 *
 * Servlet API 中提供了一个 Filter 接口,开发 web 应用时,如果编写的 java 类实现了这个接口,则把这个 java 类称之为
 * 过滤器(Filter)。通过 filter 技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如下所示:
 * |————————|           |————————————|          |——————————|            |——————————|
 * |        |   ——————> |            |  ——————> |          |  ————————> | servlet  |
 * | 浏览器 |            | web服务器  |          |  过滤器  |            |  jsp     |
 * |        |   <—————— |            |  <—————— |          |  ————————> |  html    |
 * |————————|           |————————————|          |——————————|            |——————————|
 *
 * 过滤器执行流程:
 *  1、服务器启动的时候先创建 过滤器对象,然后初始化过滤器;(步骤 1、2)
 *  2、浏览器客户端访问服务器时,先进入过滤器,执行 doFilter 方法,处理过滤业务,过滤器执行完成后放行;(步骤 3)
 *  3、过滤器放行后进入 servlet,处理用户请求;(步骤 4)
 *  4、servlet 处理完成之后,又回到 过滤器;(步骤 5)
 *  5、服务器关闭的时候,销毁 过滤器对象;(步骤 6)
 */
public class HelloFilter implements Filter {
    // 构造方法
    public HelloFilter() {
        System.out.println("1、创建过滤器实例。");
    }

    // 初始化方法
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("2、执行过滤器初始化方法。");
    }

    // 过滤器业务处理方法,在请求到达 servlet 之前先进入此方法处理公用的业务逻辑操作
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        System.out.println("3、执行过滤器业务处理方法。");

        // 放行:进入目标资源。如果有下一个过滤器,则进入下一个过滤器。
        filterChain.doFilter(servletRequest, servletResponse);

        System.out.println("5、servlet 处理完成,又回到过滤器。");
    }

    @Override
    public void destroy() {
        System.out.println("6、销毁过滤器实例。");
    }
}

HelloServlet.java:

package com.filter.demo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "HelloServlet", value = "/helloServlet")
public class HelloServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("4、处理用户请求开始。");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
}

web.xml:

<?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 名称 -->
        <filter-name>filter</filter-name>
        <!-- 过滤器类的全名 -->
        <filter-class>com.filter.demo.HelloFilter</filter-class>
    </filter>
    <filter-mapping>
        <!-- filter 名称 -->
        <filter-name>filter</filter-name>
        <!-- 拦截所有资源 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

执行结果:

 

二、获取过滤器的初始化参数:

在 init 方法中通过 filterConfig 对象获取 初始化参数:

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("2、执行过滤器初始化方法。");

        // 获取初始化参数:根据指定的参数名获取参数值
        String encoding = filterConfig.getInitParameter("encoding");
        System.out.println("encoding: " + encoding);

        // 获取所有初始化参数
        Enumeration<String> enums = filterConfig.getInitParameterNames();
        while(enums.hasMoreElements()){
            String name = enums.nextElement(); // 获取初始化参数名
            String value = filterConfig.getInitParameter(name); // 根据参数名获取参数值
            System.out.println(name + "=" + value);
        }
    }

在 web.xml 中配置 初始化参数: 

<?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 名称 -->
        <filter-name>filter</filter-name>
        <!-- 过滤器类的全名 -->
        <filter-class>com.filter.demo.HelloFilter</filter-class>

        <!-- 配置初始化参数 -->
        <init-param>
            <param-name>encoding</param-name>   <!-- 参数名 -->
            <param-value>UTF-8</param-value>    <!-- 参数值 -->
        </init-param>
        <init-param>
            <param-name>username</param-name>
            <param-value>admin</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <!-- filter 名称 -->
        <filter-name>filter</filter-name>
        <!-- 拦截所有资源 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

执行结果:

三、拦截指定的请求: 

<?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 名称 -->
        <filter-name>filter</filter-name>
        <!-- 过滤器类的全名 -->
        <filter-class>com.filter.demo.HelloFilter</filter-class>
    </filter>
    <filter-mapping>
        <!-- filter 名称 -->
        <filter-name>filter</filter-name>

        <!-- 1、拦截所有资源:访问任何目标资源都会进入过滤器;
        <url-pattern>/*</url-pattern>-->

        <!-- 2、拦截指定 jsp:如果要拦截多个指定的 jsp,可以写多个 <url-pattern> 标记,如下所示;
            只有在地址栏输入:http://localhost:8080/06_Filter_war_exploded/index.jsp
            或者:http://localhost:8080/06_Filter_war_exploded/list.jsp 时才会进入 过滤器;
        <url-pattern>index.jsp</url-pattern>
        <url-pattern>list.jsp</url-pattern>  -->

        <!-- 3、拦截所有 jsp:访问任意 jsp 资源都会进入 过滤器;
        <url-pattern>*.jsp</url-pattern> -->

        <!-- 4、拦截指定的 servlet:
            只有在地址栏输入:http://localhost:8080/06_Filter_war_exploded/helloServlet 才会进入过滤器;
        <url-pattern>/helloServlet</url-pattern> -->

        <!-- 5、根据指定的 servlet 名称拦截:只有在访问 servlet 名称为 HelloServlet 的资源时才会进入 过滤器;
        <servlet-name>HelloServlet</servlet-name> -->

        <!-- 6、拦截指定的类型: -->
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>    <!-- 默认:拦截请求(直接访问或者重定向) -->
        <dispatcher>FORWARD</dispatcher>    <!-- 拦截转发 -->
        <dispatcher>INCLUDE</dispatcher>    <!-- 拦截包含的页面 -->
        <dispatcher>ERROR</dispatcher>      <!-- 拦截声明式异常页面 -->
    </filter-mapping>

</web-app>

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_29331365/article/details/99438458

智能推荐

华为社招面试题 java_华为java社招面试题目及全部流程详解_weixin_39949506的博客-程序员宅基地

华为的招聘流程一直非常复杂,本人最近参加了华为的社招,对全部流程有一个总体了解,包括流程,面试题目类型,分享给大家,希望大家能有所帮助。首先是华为hr审核简历,看一个简历和所需职位的匹配度,基本就是看毕业学校,看掌握技能是否与所需职位吻合,然后会有一个电话沟通,这里会问你工作经历,项目经验,然后再介绍下自己的职位,问你是否有意向投递,如果明确有意向就敲定技术面的面试时间,总之,这一关很easy。接...

那些你还不知道的小知识:Docker学习——环境准备安装centos7_Java小梁同学的博客-程序员宅基地

前言Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。本系列文章我们以linux作为我们的运行平台,首先先准备一台linux服务器,我们以centos7为例,不管是在windows ,mac 平台安装centos都很方便,网上可以找到很多资料,本文以mac安装为例,如何安装centos.Mac上的虚拟机软件有很多,可以自行选择,V

swoole消息推送_swoolle push 给全部人推送消息_道亦呀的博客-程序员宅基地

server.php$ws = new swoole_websocket_server("0.0.0.0", 9501);//监听WebSocket连接打开事件$ws->on('open', function ($server, $request) { echo "用户连接上来了".PHP_EOL; });//监听WebSocket消息事件$ws->on('message', function ($server, $frame) { $data = $frame-&_swoolle push 给全部人推送消息

多选框checkbox赋值和取值_通过设置checkbox的name属性多选取值_发明灯泡的的博客-程序员宅基地

本例子使用.net MVC使用ajax请求获取数据。$.ajax({ url: "/Warehouse/Shield/Checkbox", //后台controller路径。 type: "Get", success: function (data) { //后台获取json字符串 ..._通过设置checkbox的name属性多选取值

How to take RMAN Full DB backup using SYSBACKUP (Doc ID 2140670.1)_huoxiaojun2009的博客-程序员宅基地

In this Document Goal Solution References Applies to:Oracle Database Cloud Schema Service - Version N/A and laterOracle Database Exadata Express Cloud Service - Version N/A and laterOracle Database Exadata Cloud Machine - Version N

前端传入Long类型精度丢失解决办法(之一)_function方法接受long类型丢失精度_这不是那个谁吗的博客-程序员宅基地

前端传入Long类型精度丢失解决办法(之一)原因:解决办法:本质上也是将Long转为String类型,但是比网上的其他方法都要来的简单。_function方法接受long类型丢失精度

随便推点

springboot项目在idea中的热部署的几种方式_余生之君的博客-程序员宅基地

1. devtools依赖方式我们在使用idea运行springboot项目时想要实现热部署,首先需要添加依赖 &amp;amp;amp;amp;amp;amp;lt;dependency&amp;amp;amp;amp;amp;amp;gt; &amp;amp;amp;amp;amp;amp;lt;groupId&amp;amp;amp;amp;amp;amp;gt;org.springframework.boot&amp;amp;am

iOS 连接webservice(1)_ios连接远端数据库webservice_yesjava的博客-程序员宅基地

第一部分 连接webservice,获取天气预报主要用到的类NSMutableURLRequest、NSURLConnection、NSData等。主要代码如下: NSString *soapMsg=[NSStringstringWithFormat:@""_ios连接远端数据库webservice

那个信奉“人沉静时智慧升起”的思想者_NO_小贾的博客-程序员宅基地

那个信奉“人沉静时智慧升起”的思想者 给我思想带来的冲击,

VS2013 编译程序时提示 无法查找或打开 PDB 文件_模块已生成,不包含符号_叶英我是你大哥的博客-程序员宅基地

“Draw.exe”(Win32): 已加载“C:\Users\YC\Documents\Visual Studio 2013\Projects\Draw\Debug\Draw.exe”。已加载符号。“Draw.exe”(Win32): 已加载“C:\Windows\System32\ntdll.dll”。无法查找或打开 PDB 文件。“Draw.exe”(Win32): 已加载“C_模块已生成,不包含符号

如果你的世界只剩下代码......_xstardust的博客-程序员宅基地

简介:工程师的世界,不止代码,还应有对未来的洞察与从容。阿里首部技术经验精选集:《不止代码》,现已正式公开,可免费下载阅读。阿里多位 P9、P10 技术大牛现身说法,用十多年阅历和经验,陪你“打怪升级”。每天与代码打交道,你是否曾有这样的困惑与焦虑:程序员:“天天写业务代码还加班,如何才能成为技术大牛?”测试:“为什么每天都有执行不完的测试用例?”运维:“扛机器接网线敲shell命令...

windows环境下面的项目一键部署和自启动方案_windows nginx mysql jdk 套装_未兆的博客-程序员宅基地

windows下面一键部署脚本和自启动方案_windows nginx mysql jdk 套装

推荐文章

热门文章

相关标签