通过查看若依源码(ruoyi-framework)下的过滤器文件(src.main.java.com.ruoyi.framework.config.ShiroConfig)可以发现设置了过滤器。
过滤器(Filter)是Java Servlet技术中的一个重要部分,主要用于在 Servlet 处理请求之前或响应之后对数据进行某些处理。
可以这么理解。如果类比到生活的场景中:请求响应之前处理——我们日常饮用水会先用净水器处理;请求响应之后:工厂排出的污水,会先处理,再排放。
简单的理解,可以接口用户的响应判断用户是否在线;可以在登录验证前,验证验证码是否正确。
那么在Shiro中如何自定义过滤器呢?
前提条件
已新建SpringBoot项目
已完成路由配置,包含登录页面/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 框架中的一个抽象类,用于控制对资源的访问。它提供了两个主要方法:isAccessAllowed
和onAccessDenied
,允许你自定义访问控制逻辑。
主要方法 | 说明 | 参数 | 参数说明 |
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 }标签:12,请求,自定义,AccessControlFilter,servletResponse,过滤器,servletRequest,Shiro From: https://www.cnblogs.com/luyj00436/p/18496659