Day21_学点儿JavaEE__过滤器Filter(登录验证、编码处理)

1 为什么要使用过滤器

昨天已经总结过

当然,这仅仅是完成了一个简单的登录过程,即完成判断输入信息是否和数据库信息相匹配的操作,但是仍然可以通过直接输入地址的方式,在不登录的情况下访问相应的页面。而我们实际生活中的没登录的情况下,很多页面是无法访问的,要实现这样的效果,我们可以在每个页面都增加一个判断Session中的用户名密码是否和数据库匹配的操作,但是未免也太麻烦了点。通过过滤器Filter,可以很简单地实现这个效果

项目开发中,经常会用到重复代码的实现。

  1. 请求每个servlet都要设置编码
  2. 判断用户是否登录,只有登录了才有操作权限。
    在这里插入图片描述

2 过滤器相关API

interface Filter 过滤器核心接口

  1. init(FilterConfig filterConfig)
    初始化方法,在服务器启动的时候就执行
  2. doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    过滤器拦截的业务逻辑处理
  3. destroy()
    销毁过滤器实例的时候调用

interface FilterChain 过滤链

    doFilter(ServletRequest request, ServletResponse response)
    执行下一个过滤器或放行(访问servlet)

3 案例一:用过滤器完成登录

// /*  拦截所有的请求
@WebFilter(filterName = "login", urlPatterns = "/*")
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
        System.out.println("LoginFilter.init");
    }

    // ServletRequest servletRequest = new HttpServletRequest()
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("LoginFilter.doFilter");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        String servletPath = request.getServletPath();
        System.out.println("servletPath:" + servletPath);
        String method = request.getParameter("method");
        //这是请求是要去完成登录的,不需要执行后面验证是否登录的流程
        if (servletPath.endsWith(".jpg")
                || servletPath.endsWith(".png")
                || servletPath.endsWith(".js")
                || servletPath.endsWith(".css")
                || servletPath.equals("/login.jsp")
                || servletPath.equals("/user") && "login".equals(method)) {
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }

        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("user");
        if (user == null) {
            response.sendRedirect("/login.jsp");
            return;
        }

        //加了这句话代表方行,继续往后执行,
        //如果还有filter就访问后面filter,没有filter,就可以访问后台资源
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
        System.out.println("LoginFilter.destroy");
    }
}

4 案例二:用过滤器处理POST请求乱码问题

由于在案例一中的登录过滤器中调用了request.getParameter("method")方法,这会导致之前在其他Servlet中设置的request.setCharacterEncoding("UTF-8");处理乱码失效(因为Filter会先执行),所以我们可以再单独设置一个处理乱码的Filter。

@WebFilter(filterName = "encoding", urlPatterns = "/*")
public class EncodingFilter 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("EncodingFilter.doFilter");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        // 这个method是get还是post
        String method = request.getMethod();
        // 解决post请求乱码问题
        if ("post".equalsIgnoreCase(method)) {
            request.setCharacterEncoding("UTF-8");
        }

        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

5 web.xml配置servlet和过滤器(多个Filter优先级)

servlet和filter除了用注解方式配置,还可以使用xml的方式配置
WEB-INF/web.xml是Web项目的核心配置文件

<?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">



    <!--
        @WebServlet("/student")
        public class StudentServlet extends HttpServlet { }
    -->              
    <servlet>
        <servlet-name>studentServlet</servlet-name>
        <servlet-class>com.situ.web.controller.StudentServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>studentServlet</servlet-name>
        <url-pattern>/student</url-pattern>
    </servlet-mapping>
    



    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>com.situ.web.filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>login</filter-name>
        <filter-class>com.situ.web.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>login</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

先设置的Filter优先级高于后设置下的Filter优先级。在web.xml配置servlet和Filter的话,要把@@WebServlet("/student")@WebFilter(filterName = "login", urlPatterns = "/*")注解形式的语句注释掉,不然会有冲突。

代码

Day20_复制粘贴快速开发(课程表)、CookieDemo、Filter登录过滤及放行、教师薪资显示0.0
Day21_过滤器处理POST乱码,JS DOM、点击事件,JQuery

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

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

相关文章

ASUS华硕ROG幻16Air笔记本电脑GU605M原装出厂Win11系统工厂包下载,带有ASUSRecovery一键重置还原

适用型号&#xff1a;GU605MI、GU605MY、GU605MZ、GU605MV、GU605MU 链接&#xff1a;https://pan.baidu.com/s/1YBmZZbTKpIu883jYCS9KfA?pwd9jd4 提取码&#xff1a;9jd4 华硕原厂Windows11系统带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主题壁纸、系统属性联机支持…

谷歌查问题

1&#xff0c;打开 it工具箱-里面啥都有 2&#xff0c;找到谷歌 3&#xff0c;访问gpt

跟TED演讲学英文:The next grand challenge for AI by Jim Fan

The next grand challenge for AI Link: https://www.ted.com/talks/jim_fan_the_next_grand_challenge_for_ai? Speaker: Jim Fan Date: October 2023 文章目录 The next grand challenge for AIIntroductionVocabularyTranscriptSummary后记 Introduction Researcher Jim…

深入理解MD5算法:原理、应用与安全

title: 深入理解MD5算法&#xff1a;原理、应用与安全 date: 2024/4/11 20:55:57 updated: 2024/4/11 20:55:57 tags: MD5算法数据安全哈希函数摘要算法安全漏洞SHA算法密码学 第一章&#xff1a;引言 导言 在当今数字化时代&#xff0c;数据安全和完整性变得至关重要。消息…

PHP婚恋小程序开发源码支持微信+公众号+APP

随着社会的发展和人们生活节奏的加快&#xff0c;传统的相亲方式已经不能满足现代人的需求。在此背景下&#xff0c;有人想到通过线上小程序的方式来满足更多的人进行相亲&#xff0c;所以在此情况下&#xff0c;婚恋相亲小程序由此出现。婚恋相亲小程序的功能有会员功能&#…

Postman接口测试工具

Postman接口测试工具 目录 Postman接口测试工具安装页面概述保存任务发送请求 安装 PostMan官方下载网址&#xff1a;https://www.getpostman.com/downloads/ 页面概述 保存任务 新建请求集合 命名为test 将刚刚的任务保存 选择新建的test集合 发送请求 新建窗口 request请…

解决源 “MySQL 8.0 Community Server“ 的 GPG 密钥已安装,但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。

源 “MySQL 8.0 Community Server” 的 GPG 密钥已安装&#xff0c;但是不适用于此软件包。请检查源的公钥 URL 是否配置正确。 失败的软件包是&#xff1a;mysql-community-server-8.0.31-1.el7.x86_64 GPG 密钥配置为&#xff1a;file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql…

vue源码解析——v-if和v-for哪个优先级高,如何避免两者同时使用

首先&#xff0c;官方不推荐v-if和v-for在同一个元素上使用。其次&#xff0c;如果两者同时使用&#xff0c;v-if和v-for的优先级怎么确定&#xff1f;在vue2和vue3中这两者的优先级顺序不一样。vue2是v-for优先&#xff0c;条件不存在时也会渲染多个注释节点。在vue3中进行了改…

JVM 垃圾收集器

JVM 垃圾收集器 垃圾收集器 垃圾收集器 Serial (串行)&#xff1a;单线程垃圾回收器&#xff1b;采用复制算法 Serial Old&#xff1a;Serial 收集器的老年代版本&#xff0c;采用标记-整理算法。 ParNew&#xff1a;多线程的垃圾回收器&#xff08;Serial 的多线程版本&#x…

推荐一个大学生可以参加的榜单赛事|人工智能赛道

【榜单赛事】第十四届全国大学生计算机应用能力与数字素养大赛 - 人工智能产业应用赛道人工智能编程赛项 正在火热报名中 本赛道定位于人工智能产业应用和实践&#xff0c;把人工智能产业真实的技能要求、能力要求体现在竞赛内容设计当中&#xff0c;并在竞赛环节融入实战项目…

SQLite Android 绑定(十八)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite 在Android安装与定制方案&#xff08;十七&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ 应用程序编程 加载共享库 在使用任何与 SQLite 相关的方法或对象之前&#xff0c;本机 SQLite 必…

H5:canvas刮刮乐

今日无事&#xff0c;写一个刮刮乐用于收割亲弟弟零花钱 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>Title</title><style>body {height: 100vh;background-color: #fff;}.textDiv {…

数学之光照亮AI之路:探究数学背景在人工智能学习中的优势

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已成为引领未来发展的重要力量。然而&#xff0c;对于许多初涉此领域的学习者来说&#xff0c;AI的复杂性和深度常常让他们望而却步。有趣的是&#xff0c;那些数学基础扎实的人在学习AI时&#xff0c;往往…

2024 Android Studio安装及配置gradle快速省心搭建,不放C盘,前置搭建

题外话&#xff1a;要做安卓项目然后安装过Android Studio的朋友都知道&#xff0c;下载安装完成之后并不能直接开始你的第一个安卓项目的“ Hello World”&#xff0c;其中有要配置好gradle&#xff0c;在你测试好环境之前你会遇到很多问题&#xff0c;同时默认下使用中所需依…

Redis从入门到精通(十二)Redis实战(九)GEO查询附近商户、BitMap用户签到和统计、HLL的UV统计

↑↑↑请在文章开头处下载测试项目源代码↑↑↑ 文章目录 前言4.10 附近商户4.10.1 GEO介绍4.10.2 附近商户需求分析4.10.3 实现新增商户功能4.10.4 实现查询附近商户功能 4.11 用户签到4.11.1 用户签到需求分析4.11.2 BitMap介绍4.11.3 实现用户签到4.11.4 实现用户签到统计4.…

备战蓝桥杯---数学刷题3

话不多说&#xff0c;直接看题&#xff1a; 1. 我们可以得到大致一个思路&#xff0c;就是先枚举1-1e6的质数&#xff0c;然后看看有几个即可。 我们怎么知道个数呢&#xff1f; 首先我们知道1---n中有n/p的下取整个为p的倍数。 因此&#xff0c;p的个数至少是n/p的下取整个…

损失函数-交叉熵 梯度下降

文章目录 1、交叉熵的简单例子1.2、Classification Error&#xff08;分类错误率&#xff09;1.3、Mean Squared Error (均方误差)1.4、交叉熵损失函数1.5、二分类 2、什么是梯度下降法&#xff1f;2.2、梯度下降法的运行过程2.3、二元函数的梯度下降 1、交叉熵的简单例子 参考…

多模态小记:CLIP、BLIP与BLIP2

CLIP 使用网络上爬取得到的大量图文对进行对比学习&#xff0c;图文匹配的是正样本&#xff0c;图文不匹配的是负样本&#xff0c;使匹配样本的embedding之间的距离尽可能小&#xff0c;不匹配样本间的距离尽可能大。 缺点&#xff1a;网上爬的数据质量差&#xff0c;不能进行…

SOCKS代理是如何提高网络性能和兼容性的?

SOCKS代理作为一种网络协议中间件&#xff0c;不仅在提升网络隐私和安全性方面发挥着重要作用&#xff0c;也在提高网络性能和兼容性方面有着不容忽视的影响&#x1f680;。本文将深入探讨SOCKS代理如何通过减少网络延迟&#x1f680;、优化数据传输&#x1f504;、提高跨平台兼…

十进制,二进制,八进制,十六进制之间转换

一. 十进制转二进制 二. 二进制转十进制 三. 十进制转八进制 四. 八进制转十进制 五. 十进制转十六进制