过滤器的应用

javaWeb三剑客:


1. Servlet:接收请求,处理请求(单例,也就是说,多个用户请求的的servlet是同一个对象)

2. Filter:拦截请求(单例->也就是说,多个用户请求的的filter是同一个对象)
3. Listem: 监听用户/服务器行为,javaWeb三剑客:

 过滤器的实现

1.编写一个类实现Filter接口

  init dofilter destory ->过滤器的生命周期方法

2.在web.xml文件中进行配置(也可以使用注解的方式替换xml配置)

过滤器

init destory生命周期方法只会执行一次

dofilter方法

filter包下:AFilter类->生命周期方法,请求被该过滤器拦截,执行该方法(请求多次,执行多次这个方法)

public class AFilter implements Filter{

    public void init(){

        sout("AFliter创建了");

    }

    public void filter(){

        sout("AFilter拦截了");

    }

    public void destory(){

        sout("AFilter销毁了");

    }

}

web.xml配置Filter

<filter>

    <filter-name>AFilter</filter-name>

    <filter-class>com.huse.filter.AFilter</filter-class>

</filter>

<filter-mapping>

    <filter-name>AFilter</filter-name>

    <url-pattern>/*</url-pattern>//拦截所有请求

</filter-mapping>

webapp目录下

index.jsp

<%page%>

<h1>首页界面</h1>

<img src="/image/demo.jpg" />

访问失败

filter生命周期

tomcat服务器启动的时候就创建了,调用了init()方法 并且该请求是被该Filter拦截,执行doFilter()方法,在服务器关闭之前销毁Fillter对象,销毁Filter对象之前调用destory()方法

怎么实现放行请求呢

对于过滤器链,只要有一个不放行你就访问不到目标资源 由多个过滤器组成的链条

这个方法,调用FilterChain的doFilter(),表示该过滤器放行 我这部分让你过了,后面还有!!你过不过还待定

public class AFilter implements Filter{

    public void init(){

        sout("AFliter创建了");

    }

    public void filter(ServletRequest request,ServletResponse response,){

        sout("AFilter拦截了");

       filterChain.doFiter(ServletRequest,ServletResponse);

    }

    public void destory(){

        sout("AFilter销毁了");

    }

}

成功

过滤器的执行顺序

由Filter的<filter-mapping>在web.xml配置顺序决定 谁在前谁先执行

注解方式

使用WebFilter替换之前的xml配置

使用注解方式

讲xml里面的配置全部注释

@WebFilter("/*")

public class AFilter implements Filter{

    public void init(){

        sout("AFliter创建了");

    }

    public void filter(ServletRequest request,ServletResponse response,){

        sout("AFilter拦截了");

       filterChain.doFiter(ServletRequest,ServletResponse);

    }

    public void destory(){

        sout("AFilter销毁了");

    }

}

@WebFilter("/*)

public class BFilter implements Filter{

    public void init(){

        sout("BFliter创建了");

    }

    public void filter(ServletRequest request,ServletResponse response,){

        sout("BFilter拦截了");

       filterChain.doFiter(ServletRequest,ServletResponse);

    }

    public void destory(){

        sout("BFilter销毁了");

    }

}

使用注解改变过滤器执行顺序?;此时才会先执行AOFilter过滤器

推荐过滤器配置,基于xml配置

拦截方式(了解)

针对与访问资源方式,

  • 重定向方式:直接访问方式:重定向,地址栏输入地址,超链接,
  • 转发方式:请求转发
  • error访问
  • include包含
  • DispatcherType拦截方式:
    REQUEST:直接访问目标资源时执行过滤器。包括:在地址栏中直接访问、表单提交、超链接、重定向,只要在地址栏中可以看到目标资源的路径,就是REQUEST;默认值FORWARD:转发访问执行过滤器。包括RequestDispatcher#forward()方法、
  • jsp:forward标签都是转发访问;INCLUDE:包含访问执行过滤器。包括RequestDispatcher#include()方法、
  • jsp:include标签都是包含访问;ERROR:当目标资源在web.xml中配置为<error-page>中时,并且真的出现了异常,转发到目标资源时,会执行过滤器。

实现访问资源不存在时展示error自定义界面?

web.xml

<web-app>

<error-page>

        <error-code>404</error-code>

        <location>/error.jsp</location>

<error-page>

</web-app>

使用过滤器实现编码处理优化,使得不用每个处理请求的servlet都要重复去处理编码问题!!!

1.全局编码处理

把请求编码,响应编码统一到过滤器处理

浏览器缓存:需要需要你手动清除缓存 ctrl F5

request.setCharacterEncoding("UTF-8");

response.setContentType("text/html;charset=utf-8");移入到过滤器当中

使用过滤器实现编码处理优化

create EncodingFilter.java in com.huse.filter

全局编码处理器  拦截/*

WebFilter(filterName = "EncodingFilter",value="/*)

public class EncodingFilter implements Filter {

    init(){

    }

    doFilter(){

        HttpServeltRequest request = (HttpServeltRequest)req;

        HttpServeltResponse response = (HttpServeltResponse)resp;

        if(request.getMethod().equals("POST")){

            request.setCharacterEncoding("UTF-8");//post请求编码处理

        }

        response.setContentType("text/html;charset=utf-8");

//所有的静态和非静态资源都会被拦截执行这一行code

        chain.doFilter(req,resp);

    }


 

    destory(){

    }

}

使用注解改变过滤器执行顺序?;  

使用过滤器实现编码处理优化

create EncodingFilter.java in com.huse.filter

全局编码处理器  拦截/*

WebFilter(filterName = "EncodingFilter",value="/*)

public class EncodingFilter implements Filter {

    init(){

    }

    doFilter(){

        HttpServeltRequest request = (HttpServeltRequest)req;

        HttpServeltResponse response = (HttpServeltResponse)resp;

        if(request.getMethod().equals("POST")){

            request.setCharacterEncoding("UTF-8");//post请求编码处理

        }

        response.setContentType("text/html;charset=utf-8");

        chain.doFilter(req,resp);

    }


 

    destory(){

    }

}


 

WebFilter(filterName = "EncodingFilter",value="/*)

public class EncodingFilter implements Filter {

    init(){

    }

    doFilter(){

        HttpServeltRequest request = (HttpServeltRequest)req;

        HttpServeltResponse response = (HttpServeltResponse)resp;

        if(request.getMethod().equals("POST")){

            request.setCharacterEncoding("UTF-8");//post请求编码处理

        }

        //图压,css.js 不应该设置text/html;charset=utf-8,动态资源text/html ; charset=utf-8 只针对Servlet设置

        response.setContentType("text/html;charset=utf-8");

        chain.doFilter(req,resp);

    }


 

    destory(){

    }

}

//图片,css.js 不应该设置text/html;charset=utf-8,动态资源text/html ; charset=utf-8 只针对Servlet设置

//根据后缀名经行静态资源与servlet的区分


 

WebFilter(filterName = "EncodingFilter",value="/*)

public class EncodingFilter implements Filter {

    init(){

    }

    doFilter(){

        HttpServeltRequest request = (HttpServeltRequest)req;

        HttpServeltResponse response = (HttpServeltResponse)resp;

        String requestURI = request.getRequestURI();

        if(!requestURI.contains(".")){

            response.setContentType("text/html;charset=utf-8");

        }

       

        chain.doFilter(req,resp);

    }


 

    destory(){

    }

}

请你把所有的servlet当中编码处理可以删除了

之前的下边的这段code也可以删除了

还有过滤器:重新重定向登录 放到过滤器当中

if(request.getSession().getAttribute("login") == null){

        response.sendRedirect("/login.jsp");

        return;

    }

新建一个LoginFilter过滤器 拦截所有

静态资源不拦截只拦截过滤器 需要进行判断处理

写法一

doFilter(){

    HttpServeltRequest request = (HttpServeltRequest)req;

    HttpServeltResponse response = (HttpServeltResponse)resp;

    String uri = request.getRequestURI();

    if(uri.equals("login.jsp")){

        chain.doFilter(req,resp);

        return;

    }

    if(request.getSession().getAttribute("login") == null){

        response.sendRedirect("/login.jsp");

        return;

    }  

    chain.doFilter(req,resp);

}

新建一个拦截页面 pages目录  里面是需要拦截  list.jsp update.jsp放到这个目录里面

doFilter(){

    HttpServeltRequest request = (HttpServeltRequest)req;

    HttpServeltResponse response = (HttpServeltResponse)resp;

    String uri = request.getRequestURI();

    if(uri.contains("pages") || uri.equals("/LoginServlet")){

        chain.doFilter(req,resp);

        return;

    }

    if(request.getSession().getAttribute("login") == null){

        response.sendRedirect("/login.jsp");

        return;

    }  

    chain.doFilter(req,resp);

}

现在访问localhost:8080/login.jsp就可以访问了   目录外的表示可以放行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/189708.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Arrays.asList() 与 Collections.singletonList()的恩怨情仇

1. 概述 列表是我们使用 Java 时常用的集合类型。 众所周知&#xff0c;我们可以轻松地用一行初始化一个List。例如&#xff0c;当我们想要初始化一个只有一个元素的List时&#xff0c;我们可以使用Arrays.asList()方法或Collections.singletonList()方法。 在本文中&#x…

HCIP-十、BGP基础

十、BGP基础 实验拓扑实验需求及解法1.R1 属于 AS100&#xff0c;R2/3/4 属于 AS200&#xff0c;R5 属于 AS3002.AS200 内运行 OSPF3.建立 IBGP 邻居4.建立 EBGP 邻居5.BGP 发布路由6.路由黑洞 实验拓扑 实验需求及解法 本实验模拟 ISP 网络拓扑&#xff0c;运行 BGP。如图所示…

【DevOps】基于 KubeSphere 的 Kubernetes 生产实践之旅(万字长文)

基于 KubeSphere 的 Kubernetes 生产实践 1.KubeSphere 简介1.1 全栈的 Kubernetes 容器云 PaaS 解决方案1.2 选型理由&#xff08;从运维的角度考虑&#xff09; 2.部署架构图3.节点规划3.1 软件版本3.2 规划说明3.2.1 K8s 集群规划3.2.2 存储集群3.2.3 中间件集群3.2.4 网络规…

kafka,RabbitMQ,RocketMQ,他们之间的区别,架构,如何保证消息的不丢失,保证不重复消费,保证消息的有序性

文章目录 Kafka、RabbitMQ、RocketMQ 之间的区别是什么&#xff1f;性能数据可靠性服务可用性功能 RabbitMQ如何保证消息不丢失&#xff1f;Kafka 的架构说一下&#xff1f;Kafka 怎么保证消息是有序的&#xff1f;Kafka 怎么解决重复消费&#xff1f;Kafka 怎么保证消息不丢失…

TCP/IP协议、三次握手、四次挥手

TCP/IP TCP/IP协议分层TCP头部三次握手TCP四次挥手常见问题1、什么是TCP网络分层2、TCP为什么是三次握手&#xff0c;不是两次或者四次&#xff1f;3、TCP为什么是四次挥手&#xff0c;为什么不能是三次挥手将第二次挥手和第三次挥手合并&#xff1f;4、四次挥手时为什么TIME_W…

spring boot整合Jasypt实现配置加密

文章目录 目录 文章目录 前言 一、Jasypt是什么&#xff1f; 二、使用步骤 1.引入 2.测试使用 3.结果 总结 前言 一、Jasypt是什么&#xff1f; Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个Java库&#xff0c;提供了一种简单的加密解密方式&#xff0c…

web:[ZJCTF 2019]NiZhuanSiWei1

题目 点进题目&#xff0c;网页显示如下&#xff0c;需要代码审计 $_GET["text"]和$_GET["file"]来获取传入的两个参数text和file。使用isset()函数来检查$text变量是否已设置并且不为null。如果设置了并且不为null&#xff0c;则执行下面的逻辑。在下面的…

Qt4用子类化ProxyModel和子类化MainWindow实现全表筛选,中文排序和复制粘贴

目录 1 需求 2 子类化ProxyModel实现全表筛选 3 字符串列表实现中文排序 3.1 Qt5中文排序 3.2 Qt4排序 4 表格的复制粘贴 5 应用 1 需求 模型视图编程是Qt开发的基本功&#xff0c;其中有几个关键问题需要解决&#xff1a; 全表筛选&#xff0c;或者说多列搜索中文排序…

100元预算,轻松涨粉1000!腾讯运营面试秘籍大揭秘!

大家好啊&#xff01;小米在这里&#xff5e; 很高兴又有机会和大家见面啦&#xff01;最近小米参加了一场腾讯的运营面试&#xff0c;遇到了一个超有趣的问题&#xff1a;如果让你运营一个公众号&#xff0c;近期需要增加1000个关注&#xff0c;预算100元&#xff0c;怎么完成…

RocketMq 主题(TOPIC)生产级应用

RocketMq是阿里出品&#xff08;基于MetaQ&#xff09;的开源中间件&#xff0c;已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现&#xff0c;十万级数据吞吐量&#xff0c;ms级处理速度&#xff0c;分布式架构&#xff0c;功能强大&#xff0c;扩展性强。 官方…

【C++初阶】STL详解(八)List的模拟实现

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…

2018年2月16日 Go生态洞察:Go 1.10版本发布分析

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Autosar MCAL-RH850P1HC-MCAL配置环境搭建

文章目录 前言下载安装包软件安装安装SIP包安装MCAL文件配置工程配置生成代码测试静态代码路径总结前言 对于RH850P1HC,官网有免费的MCAL,但官网的MCAL没有CAN模块(原厂反馈为Bosch IP,CAN Driver他们没有),也没有FEE模块。如果需要,可以找第三方软件公司,如ETAS.虽然M…

1.3 取反器和8位取反器

取反器真值表: 取反开关输入输出011000110101 取反器相当于一个异或门 8位取反器

bit_set位图|布隆过滤器

位图 对于海量整形数据的处理&#xff0c;通常是上百个G的代码。 通常有如下的应用&#xff1a; 1. 快速查找某个数据是否在一个集合中 2. 排序 去重 3. 求两个集合的交集、并集等 4. 操作系统中磁盘块标记 如果将数据加载到内存中&#xff0c;运用基本数据结构处理&…

【Python】用三种方法创建tkinter桌面窗口

Python的tkinter是Python的标准GUI库之一&#xff0c;它是一个开源的、跨平台的GUI工具包&#xff0c;可以用于创建桌面应用程序。 tkinter提供了许多常见的GUI组件&#xff0c;例如按钮、文本框、标签、列表框等等&#xff0c;可以轻松地创建各种类型的桌面应用程序。它还支持…

计算机组成原理-Cache的基本概念和原理

文章目录 存储系统存在的问题Cache的工作原理局部性原理性能分析例题界定何为局部部分问题总结 存储系统存在的问题 增加Cache层来缓和CPU和主存的工作速度矛盾 Cache的工作原理 启动某个程序后&#xff0c;将程序的代码从辅存中取出放入内存中&#xff0c;再从内存中将代码…

ArcGIS中基于人口数据计算人口密度的方法

文章目录 一、密度分析原理二、点密度分析三、线密度分析四、核密度分析一、密度分析原理 密度分析是指根据输入的要素数据集计算整个区域的数据聚集状况,从而产生一个联系的密度表面。通过密度计算,将每个采样点的值散步到整个研究区域,并获得输出栅格中每个像元的密度值。…

电子学会C/C++编程等级考试2023年03月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字字符求和 请编写一个程序实现以下功能:从一个字符串中,提取出所有的数字字符即0-9,并作为数求和。 时间限制:1000 内存限制:65536输入 一行字符串,长度不超过100,字符串中不含空格。输出 字符串中所有数字字符作为数…

Java核心知识点整理大全14-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…