【Shiro】12.自定义过滤器

news/2024/10/24 8:51:01

通过查看若依源码(ruoyi-framework)下的过滤器文件(src.main.java.com.ruoyi.framework.config.ShiroConfig)可以发现设置了过滤器。

过滤器(Filter)是Java Servlet技术中的一个重要部分,主要用于在 Servlet 处理请求之前或响应之后对数据进行某些处理。

可以这么理解。如果类比到生活的场景中:请求响应之前处理——我们日常饮用水会先用净水器处理;请求响应之后:工厂排出的污水,会先处理,再排放。

简单的理解,可以接口用户的响应判断用户是否在线;可以在登录验证前,验证验证码是否正确。

那么在Shiro中如何自定义过滤器呢?

前提条件

已新建SpringBoot项目

项目以成功集成shiro,并完成简单配置

已完成路由配置,包含登录页面/login和首页index

简单的过滤器

根据ruoyi源码,我们完成一个登录时的一个自定义过滤器。

1.拦截过滤器添过滤器。

 2. 自定义过滤方法,过滤方法中引用过滤器。

1 /**
2  * 自定义过滤方法
3  * @return
4  */
5 private Filter myFliter() {
6     MyFliter myFliter = new MyFliter();
7     return myFliter;
8 }

3. 自定义过滤器,实现结果Fliter

1 public class MyFliter implements Filter {
2     private static  int i = 0;
3     @Override
4     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
5         System.out.println("自定义过滤器使用" + i++);
6         filterChain.doFilter(servletRequest, servletResponse);      // 放行到下一个过滤器
7     }
8 }

此时,进入login页面前,会执行doFliter方法

 进入index页面,则不执行自定义过滤器的doFilter方法。

 实现fliter的方法,代码看起来阅读性相对没那么友好。  filterChain.doFilter(servletRequest, servletResponse); 代码前表示请求接口前操作,代码后表示调用接口后需要执行的代码。

 

继承AccessControlFilter

不过,继承AccessControlFilter。实现它的抽象方法。查看关系,可以知道AccessControlFilter的祖先,也是有Filter的。

 

AccessControlFilter是 Apache Shiro 框架中的一个抽象类,用于控制对资源的访问。它提供了两个主要方法:isAccessAllowedonAccessDenied,允许你自定义访问控制逻辑。
主要方法 说明 参数 参数说明
isAccessAllowed 访问资源之前确定是否允许访问。如果返回true,则允许访问,继续进行;如果放回false,则会调用onAccessDenied方法 servletRequest 传入的请求
servletResponse 响应对象
mappedValue 通常是与当前请求路径相关联的配置值,可以用于确定访问控制策略
onAccessDenied isAccessAllowed方法返回false时,此方法被调用。在这里可以实现访问被拒绝时的处理 servletRequest 传入的请求
servletResponse 响应对象
mappedValue 通常是与当前请求路径相关联的配置值,可以用于确定访问控制策略
过滤器例子
 1 public class MyFliter2 extends AccessControlFilter {
 2 
 3     @Override
 4     protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse response, Object mappedValue) throws Exception {
 5         HttpServletRequest request = (HttpServletRequest) servletRequest;
 6         // 假设检查请求头中是否存在特定的令牌来决定是否允许访问
 7         String token = request.getHeader("Authorization");
 8         return token!= null && token.startsWith("Bearer ");
 9     }
10 
11     @Override
12     protected boolean onAccessDenied(ServletRequest request, ServletResponse servletResponse) throws Exception {
13         HttpServletResponse response = (HttpServletResponse) servletResponse;
14         response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Access denied.");
15         return false;
16     }
17 }
 

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

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

相关文章

【深度解读】涉密网向非涉密网跨网传输数据,需要注意什么?

网间数据传输的背景 为什么会存在涉密网向非涉密网跨网传输数据呢?哪些行业会面临这样的传输场景呢? 首先,会存在这样的场景,是因为有核心机密数据需要保护,通常会在政府机构、金融机构、军工企业、科研单位和大型企业中会做这样的网络隔离。这种做法主要是为了保护敏感信…

【泛微E9】在查询列表中增加红色字体的提示

效果如下:实现方法:<link rel="stylesheet" href="/js/jquery-ui-1.13.2/jquery-ui.css"> <link rel="stylesheet" href="/js/jquery-ui-1.13.2/jquery-ui.min.css"> <script src="/js/jquery-ui-1.13.2/jquery…

无需等待Vue Release发布,就能在项目中体验最新版

两个月前尤大在Vue 仓库中引入了 pkg.pr.new,有了这个后Vue仓库中的每个commit或者PR都会自动触发一个新的发布,我们就可以在项目中体验最新版本的Vue啦。前言 两个月前尤大在Vue 仓库中引入了 pkg.pr.new,有了这个后Vue仓库中的每个commit或者PR都会自动触发一个新的发布,…

博客初始设置

声明 本文属于本人《从零开始美化博客》系列,系列详细信息请访问 我的博客。你可以在我的 github 仓库 中查看完整代码,或是在文末查看本文相关代码,相关代码遵循 MIT 协议,你可以在 github 仓库下的 LICENSE 文件 查看详细协议。你可以在 这里 预览最新进展中的博客页面。…

10月24日 交易计划

1. 苯乙烯8430附近的多单

Z-Library镜像网站入口,网页版正式回归了

Z-Library图书馆介绍 Z-Library图书馆是全球最大的在线图书馆之一,拥有超过1400万本书籍和8000万篇文章,涵盖了众多领域的学术文献和文学作品。该图书馆致力于为广大读者提供免费、便捷的电子资源服务,让读者能够轻松获取所需的图书和文献。其数字档案库资源丰富,更新及时,…

彻底搞懂ScheduledThreadPoolExecutor

前言 项目中经常会遇到一些非分布式的调度任务,需要在未来的某个时刻周期性执行。实现这样的功能,我们有多种方式可以选择:Timer类, jdk1.3引入,不推荐。它所有任务都是串行执行的,同一时间只能有一个任务在执行,而且前一个任务的延迟或异常都将会影响到之后的任务。可能…

如何查看织梦CMS网站源码中的数据库信息

1. 定位配置文件文件路径:织梦CMS V5.1:include/config_base.php 织梦CMS V5.3 及以上版本:data/common.inc.php2. 编辑配置文件使用文本编辑器打开 data/common.inc.php 文件,找到数据库连接配置部分。配置文件的内容通常如下所示:<?php // 数据库连接信息 $cfg_dbho…