【Shiro】12.自定义过滤器
通过查看若依源码(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的。
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 }
有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。