首页 > 其他分享 >Filter过滤器

Filter过滤器

时间:2023-11-10 19:14:46浏览次数:24  
标签:servlet Filter 过滤器 import servletRequest javax

什么是Filater过滤器

Filter过滤器的基本使用介绍

  • 以权限检查来演示


    但是,只有jsp文件中可以访问session域,那其他的资源,如:html文件,图片该怎样阻止访问呢?

  • Filter过滤器原理

    **注意导入的是javax.servlet包下面的Filter接口

  • 过滤器:AdminFilter

package com.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.http.HttpRequest;

public class AdminFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    //doFilter 方法,专门用于拦截请求。可以做权限检查
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;

        HttpSession session = httpServletRequest.getSession();
        if(session.getAttribute("user")==null){
            /*请求转发到Login.jsp页面进行登录*/
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
            return;

    }else {
          filterChain.doFilter(servletRequest,servletResponse);
        }

    }

    @Override
    public void destroy() {

    }
}

  • Filter配置信息
 <filter>
        <!--给filter起一个别名-->
        <filter-name>AdminFilter</filter-name>
        <!--配置filter的全类名-->
        <filter-class>com.filter.AdminFilter</filter-class>
    </filter>
    <!--filter-mapping 配置 Filter 过滤器的拦截路径-->
    <filter-mapping>
        <!--filter-name 表示当前的拦截路径给哪个 filter 使用-->
        <filter-name>AdminFilter</filter-name>
        <!--url-pattern 配置拦截路径
        / 表示请求地址为:http://ip:port/工程路径/ 映射到 IDEA 的 web 目录
/admin/* 表示请求地址为:http://ip:port/工程路径/admin/*
表示admin目录下面所有文件都进行拦截
        -->
        <url-pattern>/admin/*</url-pattern>
    </filter-mapping>

在有些情况下我们的过滤图片可能会失效,这是因为浏览器缓存优化的问题(在前面也遇到过)。即并没有访问服务器而是直接访问了缓存
解决方案

  • 1.清理浏览器的缓存
  • 2.在请求图片资源的时候加上一些没有一样的参数,让浏览器的缓存优化失效
    这实际上让所有指定的资源都可以进行判断session中有没有user以此达到了拦截的效果

完整用户登录和权限检查

在前面的代码中我们只是测试当用户没有登录时,Filter是怎样拦截请求的,而没有测试当用户成功登录时,Filter是怎样放行的。下面将这种情况补充完整

  • login.jsp页面
  • 处理登录的LoginServlet程序
package com.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        final String username = req.getParameter("username");
        final String password = req.getParameter("password");
        //检查用户名和密码是否正确
        if("admin".equals(username)&&"123456".equals(password)){
            //登录成功
            resp.getWriter().write("登录成功");
            req.getSession().setAttribute("user",username);//将用户保持到session中
        }else{
            //登录失败
            //请求转发回到登录页面
           req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }
        }
    }


  • 过滤器程序(没有改变)
package com.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.http.HttpRequest;

public class AdminFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    //doFilter 方法,专门用于拦截请求。可以做权限检查
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;

        HttpSession session = httpServletRequest.getSession();
        if(session.getAttribute("user")==null){
            /*请求转发到Login.jsp页面进行登录*/
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
            return;

    }else {
            //让程序继续往下走访问用户目标资源(没有这行代码即使登录成功也不会继续访问目标资源)
          filterChain.doFilter(servletRequest,servletResponse);
        }

    }

    @Override
    public void destroy() {

    }
}

这将会达到一个效果,如果直接访问admin目录下面的资源,将会被拦截跳转进入longin.jsp页面。当我们登录成功后(验证登录成功的servlet程序不在拦截范围内),再次访问将将会被放行继续访问目标资源

Filter的生命周期

1.当我们项目启动时将会自动执行构造器和初始化方法,创建出构造器
2.当访问被限制的资源将会执行过滤方法
3.当项目关闭将会执行销毁方法

  • 总结

FilterConfig类的介绍


  • 程序代码
  • 执行结果

FiilterChin多个过滤器执行的细节

FilterChain 过滤器链

  • 过滤器链执行的原理
  • Filter的配置
  • 访问的资源文件
<%--
  Created by IntelliJ IDEA.
  User: SWT
  Date: 2023/11/10
  Time: 12:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--导入System--%>

<html>
<head>
    <title>资源文件</title>
</head>
<body>
<%
System.out.println("这是resource.jsp文件");
%>
这是资源文件resource.jsp文件
</body>
</html>



我们仅仅是研究过滤器链的执行顺序,所有我们在前置代码(拦截请求)中都对他们进行了放行

验证1:所有过滤器和目标文件都是在同一个线程中





2.多个Filter执行时他们使用的是同一个Request对象(即属于同一个请求)

  • 同一个请求即可以都可以获取到请求参数
  • 同一个请求即可以访问相同的requet域(注意:往request域中存储数据和获取数据的代码需要考虑到过滤器链的执行顺序)

Filter拦截路径的三种匹配方式

标签:servlet,Filter,过滤器,import,servletRequest,javax
From: https://www.cnblogs.com/swtaa/p/17818276.html

相关文章

  • Netfilter和iptables的实现机制(Linux)
    一:NetfilterNetfilter是是集成到Linux内核协议栈中的一套防火墙系统。它有4种类型,包括filter、nat、mangle、raw,具体是哪一种表,取决于数据包的处理方式。4种类型如下表所示:表类型说明包含的链接filter显示所有区域及其配置信息的列表INPUT、FORWARD、OUTPUTnat显示默认区域PREROTIN......
  • CSS:backdrop-filter实现磨砂玻璃(毛玻璃)的效果
    一、什么是backdrop-filterbackdrop-filterCSS属性可以让你为一个元素后面区域添加图形效果(如模糊或颜色偏移)。因为它适用于元素背后的所有元素,为了看到效果,必须使元素或其背景至少部分透明。backdrop-filter与filter非常类似,可以取的值都是一样的,但是一个是作用于整个元素,一......
  • c# webapi 在swagger里添加全局过滤器
    Swagger原理Swagger就是利用反射技术遍历所有Api接口,并且从xml文件中读取注释,在利用Swagger内置的模板组合html显示至客户端实现接口可视化,并且可调用。在WEBApi中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理。引入了这一机制可以更......
  • Asp.Net Core webapi+net6 使用资源筛选器(过滤器) 做缓存
    写一个特性类,用来做标记[AttributeUsage(AttributeTargets.Method)]//只对方法有效publicclassResourceFilterAttribute:Attribute{}我这里使用了MemoryCache来做缓存,也可以使用字典来做,但一定要加上static,否则字典每一次请求都会new一个实例,缓存的东西就丢了private......
  • AutoRec Autoencoders Meet Collaborative Filtering 论文阅读笔记
    这个是第一篇将自编码器应用到推荐系统中的论文,也是将深度学习应用到推荐系统中的论文。比较老,主要学习它的思想,对输入的编码与重建。这篇文章提出了基于AutoEncoder的协同过滤方法来解决评分预测问题我们的目标就是设计一个基于项目或者用户的自动编码器,它可以将每个部分观察到......
  • 前端javasript——forEach、map、filter和reduce的使用场景
    (文章目录)⭐前言大家好,我是yma16,不止前端,本文分享关于前端javasript——forEach、map、filter、reduce区别与使用。自我介绍前端->全栈开发,csdn内容合伙人,2023csdn新星计划Node赛道Top1,csdn2023新星计划vue3+ts赛道导师,阿里云社区专家博主,华为云享专家,前端技术栈:vue2v......
  • Asp.Net Core webapi+net6 使用资源筛选器(过滤器) 做缓存
    写一个特性类,用来做标记[AttributeUsage(AttributeTargets.Method)]//只对方法有效publicclassResourceFilterAttribute:Attribute{}我这里使用了MemoryCache来做缓存,也可以使用字典来做,但一定要加上static,否则字典每一次请求都会new一个实例,缓存的东西就丢了private......
  • .Net Core Aop之IActionFilter
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理) 二、IActionFilter(同步)1、定义Fi......
  • .Net Core Aop之IResourceFilter
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理)二、IResourceFilter(同步资源缓存)1......
  • .Net Core AOP之IResultFilter
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理)二、IResultFilter(同步)1、定义Filt......