java过滤器中Filter的ChainFilter过滤链
作者:IT_laobai 发布时间:2021-09-29 00:03:42
1、什么是过滤器?
在客户端到服务器的过程中,当发送请求时,如果有不符合的信息将会被filter进行拦截,如果符合则会进行放行,在服务器给客户端响应时也会进行判断 如果有不符合的信息将会被filter进行拦截,如果符合则会进行放行。
OOP:Java面向对象编程,抽象、封装、继承、多态。
AOP:面向切面编程,过滤器就是一个面向切面的编程思想。
AOP是sun公司srvlet2.3版本之后推出的新功能,在2.3之前的版本没有该功能,定义一个过滤器需要实现(implement)Filter接口,这里实现的是javax.servlet.Filter。
过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:
①以常规的方式调用资源(即,调用servlet或JSP页面)。
②利用修改过的请求信息调用资源。
③调用资源,但在发送响应到客户机前对其进行修改。
④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。
2、过滤器的生命周期:
在项目开始启动的时候,过滤器开始初始化,当有请求来的时候开始自动去执行doFilter方法,随着项目的关闭过滤器开始停止。
3、过滤器有什么用?
过滤器主要的作用是过滤请求,可以通过Filter技术,web服务器管理的所有web资源:例如:JSP、Servlet、静态图片文件、或静态HTML文件进行拦截,从而实现一些特殊功能,例如:实现URL级别的权限控制、过虑敏感词汇、压缩响应信息等一些高级功能。
4、该怎么用?
可以写多个,从用户访问——》第一个过滤器——》第二个过滤器——》Servlet
过滤器的生命周期:随着项目的启动而创建,当访问了地址后而调用doFilter方法,这个会多次执行,随着项目的关闭而销毁。
调用doFilter方法时有三个参数:
reqest(ServletRequest)——》HttpServletRequest(注意强转:在使用HttpServletRequest这个独有的方法时要强转)
response(ServletResponse)——》HttpServletResponse(注意强转:在使用HttpServletResponse这个独有的方法时要强转)
filterchain 链 可以指向下一个地址(如果有过滤器则指向下一个过滤器,没有指向资源Servlet) 过滤、拦截、放行
chain.doFilter(req,resp);//放行
ChainFilter链:
它可以指向下一个资源,如果还有过滤器,则继续进行下一次的过滤,如果没有过滤器,则会指向资源(servlet)。
filter应用场景:
(1).为所有的Servlet设置编码
(2).设置跨域问题
(3).解决所有的防盗链问题
使用过滤器的时候需要配置的文件:
(1)、固定地址
(2)、通配符
(3)、指定目录
过滤器代码奉上:
package servlet; import javax.servlet.*;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;/*** urlPattern={"/*"}获取所有的Servlet的映射路径,实现不同Servlet之间的交互*/@WebServlet(name = "DemoFilter",urlPatterns = {"/*"})public class DemoFilter implements Filter{/*** 过滤器的初始化方法* @param filterConfig 可以获取部署描述符文件(web.xml)中分配的过滤器初始化参数。* @throws ServletException*/@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("过滤器被创建了");}/**** @param servletRequest 请求* @param servletResponse 响应* @param filterChain 链条,对过滤器进行阻止和放行* @throws IOException* @throws ServletException*/@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("过滤器被执行了");servletResponse.setContentType("text/html,charset=utf-8");HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;response.addHeader("Access-Control-Allow-Origin","*");String referer = request.getHeader("referer");System.out.println(referer);filterChain.doFilter(servletRequest,servletResponse);//放行}@Overridepublic void destroy() {System.out.println("过滤器被销毁了");}}
来源:https://blog.51cto.com/13797478/2130772


猜你喜欢
- 这篇文章主要介绍了配置springboot项目使用外部tomcat过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作
- 有小伙伴表示微人事(https://github.com/lenve/vhr)的权限粒度不够细。不过松哥想说的是,技术都是相通的,明白了 v
- Maven搭建springboot项目本文是基于Windows 10系统环境,使用Maven搭建springboot项目Windows 10
- 在实际的应用中会经常需要将数据导出成excel,导出的方式除原样导出还有分页导出、分页分sheet导出和大数据量导出。对于excel2003
- 理解圆弧绘制GDI+中对于圆弧的绘制,是以给定的长方形(System.Drawing.Rectangle 结构)为边界绘制的椭圆的
- 一、异步模型的基本概述异步编程的核心是 Task 和 Task<T> 对象,这两个对象对异步操作建模。 它们受关键字 async
- 题目很简单, 就是IMessage对象怎么变成Byte[]答案1:msg.ToByteArray()这肯定不符合我们的要求答案2:using
- MD5的全称是Message-Digest Algorithm 5,Message-Digest泛指字节串(Message)的Hash变换,
- 一、单线程改造为多线程也是个技术活正如我们看到耗子叔叔博客里写的那样,原来是单线程的应用程序,”后来,我们的程序性能有问题,所以需要变成多线
- 简介机器学习在全球范围内越来越受欢迎和使用。 它已经彻底改变了某些应用程序的构建方式,并且可能会继续成为我们日常生活中一个巨大的(并且正在增
- 一、概要1.Java虚拟机(Jvm)是什么?2.Java虚拟机是用来干什么的?3.Java虚拟机它的体系结构是什么样子的?4.Java虚拟机
- 1.引言合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务
- 代码:package com.lwj.test.proxy;import java.lang.reflect.InvocationHandl
- 简介基于springboot,mybatis plus集成了一套多数据源的解决方案,在使用时引入相应的插件dynamic-datasourc
- 在讲使用path绘制多边形时,讲下Canvas的translate(),rotate()方法的使用,本博客中会使用这方面的知识,先单独讲下,
- Spring的最基本的能力就是DI,即依赖注入,或控制反转,它可以为Bean注入其依赖的其他Bean。一个Bean依赖其他Bean一般是通过
- 一、项目简述本系统功能包括: 系统管理,招生计划,学生管理,录取结果,自动分配,调剂管理等等。二、项目运行环境配置:Jdk1.8 + Tom
- 前言Kotlin一个强大之处就在于它的扩展函数,巧妙的运用这些扩展函数可以让你写出的代码更加优雅,阅读起来更加流畅,下面总结了在开发中经常用
- 目录1.堆空间的基本结构:2.空间分配担保机制3.如何判断一个对象已经无效4 不可达的对象并非“非死不可”5 如何判断一个常量是废弃常量?6
- 前言Java中共有八种基本数据类型:byte,int,short,long,float,double,char,boolean。计算机中的基