过滤器的应用

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就可以访问了   目录外的表示可以放行

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人开发的选择

喷涂机器人 码垛机器人 纸箱码垛机器人 焊接机器人 跳舞机器人 管道清理机器人 工地巡检机器人 点餐机器人 化工巡检机器人 装箱机器人 安防巡检机器人 迎宾机器人好像有点像软银那个 污水管道检测机器人 大酒店用扫地机器人 家用扫地机器人 工厂用&#xff08;…

<JavaEE> Thread线程类 和 Thread的常用方法

目录 一、Thread概述 二、构造方法 三、常用方法 1.1 getId()、getName()、getState()、getPririty() 1.2 start() 1.3 isDaemon()、setDaemon() 1.4 isAlive() 1.5 currentThread() 1.6 Interrupt()、interrupted()、isInterrupted() 1.6.1 方法一&#xff1a;添加共…

决策树(第四周)

一、决策树基本原理 如下图所示&#xff0c;是一个用来辨别是否是猫的二分类器。输入值有三个&#xff08;x1&#xff0c;x2&#xff0c;x3&#xff09;&#xff08;耳朵形状&#xff0c;脸形状&#xff0c;胡须&#xff09;&#xff0c;其中x1{尖的&#xff0c;圆的}&#xf…

SpringBoot 2 系列停止维护,Java8 党何去何从?

SpringBoot 2.x 版本正式停止更新维护&#xff0c;官方将不再提供对 JDK8 版本的支持 SpringBoot Logo 版本的新特性 3.2 版本正式发布&#xff0c;亮点包括&#xff1a; 支持 JDK17、JDK21 版本 对虚拟线程的完整支持 JVM Checkpoint Restore&#xff08;Project CRaC&…

.NET6 开发一个检查某些状态持续多长时间的类

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔 !序言 在代码的世界里,时常碰撞…

TPLink-Wr702N 通过OpenWrt系统打造打印服务器实现无线打印

最近淘到了一个TPLink-Wr702N路由器&#xff0c;而且里面已经刷机为OpenWrt系统了&#xff0c;刚好家里有一台老的USB打印机&#xff0c;就想这通过路由器将打印机改为无线打印机&#xff0c;一番折腾后&#xff0c;居然成功了&#xff0c;这里记录下实现过程&#xff0c;为后面…

typeof,instanceof

1.typeof typeof运算符返回的结果是以小写的字符串表示的变量的类型 2.instanceof instanceof运算符用于判断右边构造函数的原型对象是否在左边对象的原型链上 let arr[]let obj{}let datenew Dateconsole.log(arr instanceof Array)console.log(arr instanceof Object)conso…

人力资源管理后台 === 登陆+主页灵鉴权

目录 1. 分析登录流程 2. Vuex中用户模块的实现 3.Vue-cli代理解决跨域 4.axios封装 5.环境区分 6. 登录联调 7.主页权限验证-鉴权 1. 分析登录流程 传统思路都是登录校验通过之后&#xff0c;直接调用接口&#xff0c;获取token之后&#xff0c;跳转到主页。 vue-elemen…

SpringBoot——LiteFlow引擎框架

优质博文&#xff1a;IT-BLOG-CN 一、LiteFlow 简介 LiteFlow是一个轻量且强大的国产规则引擎框架&#xff0c;可用于复杂的组件化业务的编排领域。帮助系统变得更加丝滑且灵活。利用LiteFlow&#xff0c;你可以将瀑布流式的代码&#xff0c;转变成以组件为核心概念的代码结构…

从零开始搭建博客网站-----源代码试部署

拿到了该项目的源码&#xff0c;先尝试是否可以成功部署&#xff0c;详细的部署视频地址 后端项目部署 先把maven配置好&#xff0c;都改成自己下载的maven地址 文件编码改成utf-8&#xff0c;防止配置文件乱码 如果maven是刚下的&#xff0c;要改一下下载包的地址&#xff0…

使用Pytorch从零开始构建Normalizing Flow

归一化流 (Normalizing Flow) &#xff08;Rezende & Mohamed&#xff0c;2015&#xff09;学习可逆映射 f : X → Z f: X \rightarrow Z f:X→Z, 在这里X是我们的数据分布&#xff0c;Z是选定的潜在分布。 归一化流是生成模型家族的一部分&#xff0c;其中包括变分自动编…

叠加原理(superposition principle)

叠加原理&#xff08;superposition principle&#xff09;指对线性系统而言&#xff0c;两个或多个输入产生的输出&#xff0c;等于这几个输入单独引起的输出的和&#xff0c;即输入的叠加等于各输入单独引起的输出的叠加。 例如&#xff0c;如果输入产生的输出是&#xff0c;…