【Shiro】12.自定义过滤器

通过查看若依源码(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 }
 
posted @ 2024-10-24 08:48  陆陆无为而治者  阅读(1)  评论(0编辑  收藏  举报