爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Shiro过滤器源码

      首页 知识中心 软件开发 文章详情页

      Shiro过滤器源码

      2023-06-28 09:11:13 阅读次数:433

      Shiro,拦截器,过滤

      过滤器

      Shiro还提供了过滤器,可以配置我们的过滤规则,过滤规则对顺序是有要求的,短路优先原则,也就是前面的适配成功之后,就不会再适配后面的规则了。

      Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能,直接查看DefaultFilter类。

      路径如下:org.apache.shiro.web.filter.mgt

      Shiro过滤器源码

      public enum DefaultFilter {
          anon(AnonymousFilter.class),
          authc(FormAuthenticationFilter.class),
          authcBasic(BasicHttpAuthenticationFilter.class),
          logout(LogoutFilter.class),
          noSessionCreation(NoSessionCreationFilter.class),
          perms(PermissionsAuthorizationFilter.class),
          port(PortFilter.class),
          rest(HttpMethodPermissionFilter.class),
          roles(RolesAuthorizationFilter.class),
          ssl(SslFilter.class),
          user(UserFilter.class);
      
          private final Class<? extends Filter> filterClass;
      
          private DefaultFilter(Class<? extends Filter> filterClass) {
              this.filterClass = filterClass;
          }
      
          public Filter newInstance() {
              return (Filter)ClassUtils.newInstance(this.filterClass);
          }
      
          public Class<? extends Filter> getFilterClass() {
              return this.filterClass;
          }
      
          public static Map<String, Filter> createInstanceMap(FilterConfig config) {
              Map<String, Filter> filters = new LinkedHashMap(values().length);
              DefaultFilter[] var2 = values();
              int var3 = var2.length;
      
              for(int var4 = 0; var4 < var3; ++var4) {
                  DefaultFilter defaultFilter = var2[var4];
                  Filter filter = defaultFilter.newInstance();
                  if (config != null) {
                      try {
                          filter.init(config);
                      } catch (ServletException var9) {
                          String msg = "Unable to correctly init default filter instance of type " + filter.getClass().getName();
                          throw new IllegalStateException(msg, var9);
                      }
                  }
      
                  filters.put(defaultFilter.name(), filter);
              }
      
              return filters;
          }
      }

      AnonymousFilter 匿名拦截器,即不需要登录即可访问;一般用于静态资源过滤;示例/static/**=anon

      Shiro过滤器源码

      不需要继承AccessControlFilter,只继承PathMatchingFilter即可

      @Override
      protected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) {
          // Always return true since we allow access to anyone
          return true;
      }
      
      

      AuthenticationFilter:其主要行为就是认证的过滤,是否通过判断(isAccessAllowed)中进行认证判断。

      Shiro过滤器源码

      // 执行登录的公共方法抽取到了这里
      protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
          // 创建Token时获取用户名密码的行为抽象化
          AuthenticationToken token = createToken(request, response);
          if (token == null) {
              String msg = "createToken method implementation returned null. A valid non-null AuthenticationToken " +
                      "must be created in order to execute a login attempt.";
              throw new IllegalStateException(msg);
          }
          try {
              Subject subject = getSubject(request, response);
              subject.login(token);
              // 登录成功后的行为
              return onLoginSuccess(token, subject, request, response);
          } catch (AuthenticationException e) {
              // 登录失败后的行为
              return onLoginFailure(token, e, request, response);
          }
      }
      
      protected abstract AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception;
      
      protected AuthenticationToken createToken(String username, String password,
                                                    ServletRequest request, ServletResponse response) {
          boolean rememberMe = isRememberMe(request);
          String host = getHost(request);
          return createToken(username, password, rememberMe, host);
      }
      
      protected AuthenticationToken createToken(String username, String password,
                                                boolean rememberMe, String host) {
          return new UsernamePasswordToken(username, password, rememberMe, host);
      }

      FormAuthenticationFilter:其主要行为就是通知拒绝后的处理、登录成功后的行为,登录失败后的行为。基于表单的拦截器;如/**=authc,如果没有登录会跳到相应的登录页面登录

      Shiro过滤器源码

      BasicHttpAuthenticationFilter:基于HTTP methods的身份认证拦截器,配置形如:authcBasic[POST,PUT,DELETE,GET],其他的方法名称配置的均不进行过滤形如authcBasic[hello],形如authcBasic[permissive]默认不进行过滤

      Shiro过滤器源码

      protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
          HttpServletRequest httpRequest = WebUtils.toHttp(request);
          String httpMethod = httpRequest.getMethod();
      
          Set<String> methods = httpMethodsFromOptions((String[])mappedValue);
          boolean authcRequired = methods.size() == 0;
          for (String m : methods) {
              if (httpMethod.toUpperCase(Locale.ENGLISH).equals(m)) { // list of methods is in upper case
                  authcRequired = true;
                  break;
              }
          }
          
          if (authcRequired) {
              return super.isAccessAllowed(request, response, mappedValue);
          }
          else {
              return true;
          }
      }
      
      private Set<String> httpMethodsFromOptions(String[] options) {
          Set<String> methods = new HashSet<String>();
      
          if (options != null) {
              for (String option : options) {
                  if (!option.equalsIgnoreCase(PERMISSIVE)) {
                      methods.add(option.toUpperCase(Locale.ENGLISH));
                  }
              }
          }
          return methods;
      }

      LogoutFilter 退出过滤器LogoutFilter自

      Shiro过滤器源码

      protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
      
          Subject subject = getSubject(request, response);
      
          // Check if POST only logout is enabled
          if (isPostOnlyLogout()) {
      
              // check if the current request's method is a POST, if not redirect
              if (!WebUtils.toHttp(request).getMethod().toUpperCase(Locale.ENGLISH).equals("POST")) {
                 return onLogoutRequestNotAPost(request, response);
              }
          }
      
          String redirectUrl = getRedirectUrl(request, response, subject);
          //try/catch added for SHIRO-298:
          try {
              subject.logout();
          } catch (SessionException ise) {
              log.debug("Encountered session exception during logout.  This can generally safely be ignored.", ise);
          }
          issueRedirect(request, response, redirectUrl);
          // 重定向后断开过滤链
          return false;
      }

      PermissionsAuthorizationFilter 其默认是获取pathConfig中字段并进行比对,一般来说我们需要自定义permissons集合。权限授权拦截器,验证用户是否拥有所有权限;属性和roles一样;示例/user/**=perms["user:create"]

      public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
      
          Subject subject = getSubject(request, response);
          // 该过滤器只有mappedValue不为空的时候才会生效,形如perms[file:edit,file:delete]
          String[] perms = (String[]) mappedValue;
      
          boolean isPermitted = true;
          if (perms != null && perms.length > 0) {
              if (perms.length == 1) {
                  if (!subject.isPermitted(perms[0])) {
                      isPermitted = false;
                  }
              } else {
                  if (!subject.isPermittedAll(perms)) {
                      isPermitted = false;
                  }
              }
          }
      
          return isPermitted;
      }

      PortFilter  端口拦截器,主要属性port(80):可以通过的端口;示例/test= port[80],如果用户访问该页面是非80,将自动将请求端口改为80并重定向到该80端口,其他路径/参数等都一样

      Shiro过滤器源码

      protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
          int requiredPort = toPort(mappedValue);
          int requestPort = request.getServerPort();
          return requiredPort == requestPort;
      }
      
      /** 
       * 默认过滤80端口的请求
       * /some/path/** = port 
       * 过滤8080端口的请求
       * /another/path/** = port[8080] 
       **/
      protected int toPort(Object mappedValue) {
          String[] ports = (String[]) mappedValue;
          if (ports == null || ports.length == 0) {
              return getPort();
          }
          if (ports.length > 1) {
              throw new ConfigurationException("PortFilter can only be configured with a single port.  You have " +
                      "configured " + ports.length + ": " + StringUtils.toString(ports));
          }
          return Integer.parseInt(ports[0]);
      }
      @Override
      protected boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {
      
          //just redirect to the specified port:
          int port = toPort(mappedValue);
      
          String scheme = getScheme(request.getScheme(), port);
      
          StringBuilder sb = new StringBuilder();
          sb.append(scheme).append("://");
          sb.append(request.getServerName());
          if (port != DEFAULT_HTTP_PORT && port != SslFilter.DEFAULT_HTTPS_PORT) {
              sb.append(":");
              sb.append(port);
          }
          if (request instanceof HttpServletRequest) {
              sb.append(WebUtils.toHttp(request).getRequestURI());
              String query = WebUtils.toHttp(request).getQueryString();
              if (query != null) {
                  sb.append("?").append(query);
              }
          }
      
          WebUtils.issueRedirect(request, response, sb.toString());
      
          return false;
      }
      
      protected String getScheme(String requestScheme, int port) {
          if (port == DEFAULT_HTTP_PORT) {
              return HTTP_SCHEME;
          // 443端口 : https    
          } else if (port == SslFilter.DEFAULT_HTTPS_PORT) {
              return SslFilter.HTTPS_SCHEME;
          } else {
              return requestScheme;
          }
      }
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/teayear/3188283,作者:跟张哥学编程,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:Java学习路线-48:Servlet学习

      下一篇:实用抽象类和接口的区别

      相关文章

      2025-05-19 09:04:30

      token以及axios响应拦截器请求拦截器

      token以及axios响应拦截器请求拦截器

      2025-05-19 09:04:30
      axios , token , 拦截器 , 登录 , 跳转
      2025-05-07 09:07:56

      SpringMVC 拦截器开发详解

      SpringMVC 拦截器开发详解

      2025-05-07 09:07:56
      处理器 , 执行 , 拦截器 , 方法 , 请求
      2025-04-23 08:18:38

      基础—SQL—DQL(数据查询语言)分组查询

      分组查询的关键字是:GROUP BY。

      2025-04-23 08:18:38
      WHERE , 分组 , 员工 , 查询 , 聚合 , 过滤
      2025-04-23 08:18:21

      【ETL工具】Kettle 解析HDFS文件进行字段拼接、字符的替换和IP校验

      字段的拼接使用 JS 脚本实现,JS脚本在 Kettle 中使用起来很是方便,目前我使用 JS 实现过 IP 校验、字段拼接、文件移动。

      2025-04-23 08:18:21
      IP , JS , 拼接 , 校验 , 过滤
      2025-04-18 07:09:19

      SpringMVC 执行流程详解

      SpringMVC 是 Java Web 开发中广泛应用的 MVC 框架,它以其高效、灵活的设计受到了开发者的青睐。

      2025-04-18 07:09:19
      SpringMVC , 处理器 , 执行 , 拦截器 , 方法 , 视图 , 请求
      2025-04-16 09:26:45

      Flask ORM 学习笔记Part11:数据查询(四)

      Flask ORM 学习笔记Part11:数据查询(四)

      2025-04-16 09:26:45
      filter , 使用 , 条件 , 查询 , 过滤 , 链式
      2025-03-28 07:41:43

      使用 Axios 拦截器优化 HTTP 请求与响应的实践

      使用 Axios 拦截器优化 HTTP 请求与响应的实践

      2025-03-28 07:41:43
      Axios , HTTP , 代码 , 响应 , 拦截器 , 请求
      2025-03-18 10:01:12

      PHP代码审计方法与套路

      PHP代码审计方法与套路

      2025-03-18 10:01:12
      php , 函数 , 功能 , 审计 , 文件 , 漏洞 , 过滤
      2025-03-06 09:41:26

      【SpringBoot】深度解析 Spring Boot 拦截器:实现统一功能处理的关键路径

      【SpringBoot】深度解析 Spring Boot 拦截器:实现统一功能处理的关键路径

      2025-03-06 09:41:26
      定义 , 拦截 , 拦截器 , 登录 , 请求
      2025-03-06 09:15:52

      Shiro会话管理和缓存管理

      Shiro会话管理和缓存管理

      2025-03-06 09:15:52
      shiro , Shiro , 会话 , 管理
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5256952

      查看更多

      最新文章

      SpringMVC 拦截器开发详解

      2025-05-07 09:07:56

      基础—SQL—DQL(数据查询语言)分组查询

      2025-04-23 08:18:38

      SpringMVC 执行流程详解

      2025-04-18 07:09:19

      PHP代码审计方法与套路

      2025-03-18 10:01:12

      【SpringBoot】深度解析 Spring Boot 拦截器:实现统一功能处理的关键路径

      2025-03-06 09:41:26

      【Python】使用numpy库实现顾客打分的菜品推荐系统

      2025-03-05 09:11:26

      查看更多

      热门文章

      Java(Spring拦截器、过滤器、AOP)

      2023-06-20 09:11:08

      Python数组列表过滤

      2023-04-17 09:39:09

      Spring Boot 使用拦截器

      2023-05-04 09:43:47

      SpringMVC-拦截器

      2023-06-08 06:21:32

      简单的谈一下SpringMVC的工作流程

      2023-06-20 09:11:08

      【SpringBoot技术专题】「权限校验专区」Shiro整合JWT授权和认证实现

      2023-07-04 07:09:30

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      SpringMVC-拦截器

      IntelliJ IDEA Ultimate 配置 PHP 拦截器

      Java(Spring拦截器、过滤器、AOP)

      手把手入门Springboot2之Web

      SpringMVC 执行流程详解

      在SpringBoot项目中整合拦截器

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号