Java网络开发(Filter过滤器)—— tomcat的过滤器 编码控制 + 网页权限控制

news2025/3/15 0:51:28

目录

  • 引出
  • 1.过滤器简介
  • 2.用过滤器实现全局编码控制
    • (1)导包import javax.servlet.*;
    • (2)如果是tomcat8.5,要把3个方法都实现
    • (3)代码如下,要点:放行,chain.doFilter(request, response)
    • 【bug】过滤器的相关bug
    • (4)过滤器代码升级,配置文件解耦
  • 3.用过滤器进行权限控制
    • (1)权限控制流程
    • (2)LoginAuthorServlet.java代码
  • 总结

引出

1.过滤器是啥,能干啥;
2.如果定义一个过滤器;


1.过滤器简介

在这里插入图片描述

过滤器可以做下面的事情:

1.拦截浏览器的请求,让请求不能进入服务器;

2.经过过滤器的doFilter后放行;

2.用过滤器实现全局编码控制

之前每个servlet中都需要设置编码,请求和响应的编码需要设置成UTF-8,即以下代码

        // 编码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

用过滤器就可以实现全局的编码控制

(1)导包import javax.servlet.*;

在这里插入图片描述

(2)如果是tomcat8.5,要把3个方法都实现

在这里插入图片描述

(3)代码如下,要点:放行,chain.doFilter(request, response)

package com.tianju.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 * 解决编码问题的过滤器
 */
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 编码问题
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
        // 一定要记得放行
        chain.doFilter(request, response);

    }

    @Override
    public void destroy() {

    }
}

【bug】过滤器的相关bug

报错信息:写成了@WebServlet @WebFilter(“/*”)

Servlet[com.tianju.filter.CharacterEncodingFilter]当前不可用

在这里插入图片描述

如果忘记放行,项目可以启动,但所有资源都不可访问

在这里插入图片描述

(4)过滤器代码升级,配置文件解耦

上面的代码可以解决编码的问题,但是无法更改编码,通过web.xml的配置,可以实现解耦

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-name>characterEncodingFilter</filter-name>
        <filter-class>com.tianju.filter.CharacterEncodingFilter</filter-class>
<!--        带上变量-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>htmlShow</param-name>
            <param-value>text/html;charset=utf-8</param-value>
        </init-param>

    </filter>

    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

此时过滤器CharacterEncodingFilter.java的代码如下,

package com.tianju.filter;

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

/**
 * 解决字符编码的问题
 */

public class CharacterEncodingFilter implements Filter {
    // 获取web.xml文件中的配置utf-8
    private String encoding;
    private String htmlShow;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 从web.xml的过滤器的init-param中,对应的值,在赋值给全局变量
        encoding = filterConfig.getInitParameter("encoding");
        htmlShow =filterConfig.getInitParameter("htmlShow");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 设置编码;
        servletRequest.setCharacterEncoding(encoding);
        servletResponse.setCharacterEncoding(encoding);
        servletResponse.setContentType(htmlShow);
        // 放行
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

3.用过滤器进行权限控制

(1)权限控制流程

任何一个系统,都会有登陆权限的问题:

系统中所有请求的资源,servlet、静态资源等,或者登陆后才能访问;或者不登录也可以访问

以一个图书管理系统为例,不登录就可以访问的如下:

在这里插入图片描述

		|| requestURI.contains("/js/")
        || requestURI.contains("/bootstrap/")
        || requestURI.contains("/css/")
        || requestURI.contains("/img/"

其他资源必须登陆后才能访问:

(1)如果没有登陆,就去登陆页面;

(2)如果登陆了,就放行;

(2)LoginAuthorServlet.java代码

控制 Jsp静态资源 + Servlet的访问权限

package com.tianju.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 登陆权限的确认;
 * 注意要实现3个方法,如果不加会报错
 */
@WebFilter("/*")
public class LoginAuthorServlet implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("DemoFilter init");
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        String requestURI = req.getRequestURI();

        // 1.不登录也可以访问的连接,就放行
        // TODO:如果把contains换成equals
        if (requestURI.contains("/user/login")
        || requestURI.contains("/user/register.jsp")
        || requestURI.contains("/user/register")
        || requestURI.contains("/user/register.jsp")
        || requestURI.contains("/image/get")
//                需要放行这些静态文件
        || requestURI.contains("/js/")
        || requestURI.contains("/bootstrap/")
        || requestURI.contains("/css/")
        || requestURI.contains("/img/")
//        || requestURI.contains("/index.jsp")
        ){
            // 对于登陆,注册,验证码请求的连接,就放行
            filterChain.doFilter(servletRequest, servletResponse);
        }else{
            // 2.其他连接必须登陆才能访问
            HttpSession session = req.getSession();
            Object user = session.getAttribute("user");
            // 如果没有登陆,就去登陆页面
            if (user==null){
                resp.sendRedirect(req.getContextPath()+"/user/login.jsp");
            }else {
                //登陆了,就放行
                filterChain.doFilter(servletRequest, servletResponse);
            }
        }
    }

    @Override
    public void destroy() {
        System.out.println("DemoFilter destroy");
    }
}


总结

1.过滤器可以拦截浏览器的请求,让请求不能进入服务器,或者经过过滤器的doFilter后放行;
2.过滤器实现全局编码控制,记得放行;
3.过滤器进行权限控制,(1)不登录就可以访问的资源直接放行;(2)登陆后才能访问:如果没登录,去登陆页面;如果登陆了,就放行;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Bug小能手系列(python)_7: BertTokenizer报错 Connection reset by peer

ConnectionResetError: [Errno 104] Connection reset by peer 0. 错误介绍1. 解决思路1.1 添加代码 force_downloadTrue1.2 删除缓存1.3 科学上网1.4 线下下载 2. 解决方法2.1 清除缓存2.2 线下下载模型&#xff08;强烈建议&#xff09; 3. 总结 0. 错误介绍 当使用transfor…

4.将图神经网络应用于大规模图数据(Cluster-GCN)

到目前为止&#xff0c;我们已经为节点分类任务单独以全批方式训练了图神经网络。特别是&#xff0c;这意味着每个节点的隐藏表示都是并行计算的&#xff0c;并且可以在下一层中重复使用。 然而&#xff0c;一旦我们想在更大的图上操作&#xff0c;由于内存消耗爆炸&#xff0c…

【Python 生成器与迭代器】零基础也能轻松掌握的学习路线与参考资料

一、Python生成器与迭代器概述 Python是一种高级编程语言&#xff0c;其中非常重要的概念就是生成器和迭代器。Python生成器和迭代器联合使用&#xff0c;能够实现高效的迭代操作&#xff0c;避免增加额外的内存消耗&#xff0c;同时提高代码的可读性。Python中常见的生成器和…

单机多节点 elasticsearch 集群安全认证

es 版本&#xff1a;7.6.2 部署环境&#xff1a;CentOS Linux release 7.6.1810 (Core) 一&#xff1a;生成 ca 证书 cd 到 es 的安装目录&#xff0c;并执行下面的命令来生成 ca 证书&#xff1a; ./bin/elasticsearch-certutil ca Elasticsearch碰到第一个直接回车&#xf…

面试专题:Mysql

1.说说自己对于 MySQL 常见的两种存储引擎&#xff1a;MyISAM与InnoDB的理解 关于二者的对比与总结: 1.count运算上的区别&#xff1a;因为MyISAM缓存有表meta-data&#xff08;行数等&#xff09;&#xff0c;因此在做COUNT(*)时对于一个结构很好的查询是不需要消耗多少资源的…

[CKA]考试之K8s 版本升级

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 现有的Kubernetes 集群正在运行版本1.22.0。仅将master节点上的所有 Kuberne…

【Python】集合 set ② ( 集合常用操作 | 集合中添加元素 | 集合中移除元素 | 集合中随机取出元素 )

文章目录 一、集合中添加元素二、集合中移除元素三、集合中随机取出元素 在 Python 中 , 集合 set 是无序的 , 因此 集合 数据容器 不支持 使用 下标索引 访问 集合元素 ; 一、集合中添加元素 调用 集合#add(新元素) 函数 , 可以将新元素添加到 集合 数据容器中 ; 集合添加元素…

Vue- ref属性

ref属性 被用来给元素或者子组件注册引用信息&#xff08;id的替代者&#xff09; 通过案例来演示_ref属性 1 编写案例 如图&#xff1a;有一个按钮&#xff0c;点击按钮可以输出dom元素 备注&#xff1a;虽然vue不用我们亲自操作dom&#xff0c;但是有的特殊的情况下就要…

【2023华中杯】B题 小学教学应用题 相似性度量及难度评估 29页论文及MATLAB代码

1 题目 B 题 小学数学应用题相似性度量及难度评估 某 MOOC 在线教育平台希望能够进行个性化教学&#xff0c;实现用户自主学习。在用户学习时&#xff0c;系统从题库中随机抽取若干道与例题同步的随堂测试题&#xff0c;记录、分析学生的学习和答题信息&#xff0c;并且课后会自…

【Pytest实战】解决ModuleNotFoundError: No module named ‘pytest’问题

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。&#x1f60a; 座右铭&#xff1a;不想…

JAVA程序的性能优化实践总结

1、 衡量程序性能的指标 可以从常用的性能评估指标入手&#xff1a; 并发&#xff1a;同一时间有多少请求访问TPS&#xff1a;transaction per second(每秒的事物数)QPS&#xff1a;query per second(每秒请求数)耗时&#xff1a;端到端耗时&#xff0c;服务端耗时&#xff…

并行计算——MPI编程

目录 基础知识 进程与线程&#xff0c;并行与并发 奇偶排序 MPI实现 odd-even sort 思路 环境部署 编程实现&#xff08;C&#xff09; “若干”的问题 参考链接 一个偶然的机会&#xff0c;我接触到了国立清华大学的MPI编程作业&#xff0c;也就接触到了并行计算。这…

基于Python3接口自动化测试初探

自动化测试是什么&#xff1f; 自动化测试简单来说就是借助工具的方式来辅助手动测试的行为就可以看做是自动化测试。 自动化测试工具有哪些&#xff1f; 现在常用的自动化测试工具包括&#xff1a; QTP&#xff1a;主要用于回归测试和测试同一软件的新版本 Robot Framewor…

大数据ETL工具Kettle

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言最近公司在搞大数据数字化&#xff0c;有MES,CIM,WorkFlow等等N多的系统&#xff0c;不同的数据源DB&#xff0c;需要将这些不同的数据源DB里的数据进行整治统一…

【算法】模拟,高精度

高精度加法 P1601 AB Problem&#xff08;高精&#xff09; - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路就是模拟&#xff0c;值得注意的就是要用字符串类型输入。存进自己的int数组时要倒着存&#xff0c;因为如果是正着存的话&#xff0c;进位会有点trouble。 时间…

Spread.NET v16.0.20222.0 ASP.NET cRACK

关于 Spread.NET 提供类似 Excel 的电子表格体验。 Spread.NET 可帮助您创建电子表格、网格、仪表板和表单。它包括一个强大的计算引擎&#xff0c;具有450 函数以及导入和导出Excel电子表格的能力。利用广泛的 .NET 电子表格 API 和强大的计算引擎来创建分析、预算、仪表板、…

【C++ 基础篇:24】:【重要模板】C++ 输入输出运算符重载【以 Date 日期类为例】

系列文章说明 本系列 C 相关文章 仅为笔者学习笔记记录&#xff0c;用自己的理解记录学习&#xff01;C 学习系列将分为三个阶段&#xff1a;基础篇、STL 篇、高阶数据结构与算法篇&#xff0c;相关重点内容如下&#xff1a; 基础篇&#xff1a;类与对象&#xff08;涉及C的三大…

Mysql Access denied for user ‘root‘@ ‘*.*.*.*‘ (using password: YES)异常处理

目录 一、异常错误二、原因三、解决方法 一、异常错误 PS C:\Users\10568> mysql -u root -p Enter password: **** ERROR 1045 (28000): Access denied for user rootlocalhost (using password: YES)Access denied表示拒绝访问&#xff0c;using password&#xff1a;NO/…

计算机视觉 | 语义分割与Segmentation

前 言 「MMSegmentation」 是一个基于 PyTorch 的语义分割开源工具箱。它是 OpenMMLab 项目的一部分。 MMSegmentation v1.x 在 0.x 版本的基础上有了显著的提升&#xff0c;提供了更加灵活和功能丰富的体验。 主要特性 统一的基准平台 我们将各种各样的语义分割算法集成到了…

Linux权限维持

SSH后门&VIM后门 ssh后门&#xff1a; 创建一个软链接&#xff1a; ln -sf /usr/sbin/sshd /tmp/su 拓展&#xff1a;软链接相当于一个快捷键&#xff0c;硬链接相当于一个指针指向文件地址&#xff0c;也类似于复制 开启后门&#xff1a; /tmp/su -oport12345 开启后…