`

关于Shiro在Jetty下运行正常,但Tomcat下报错的原因和解决办法

阅读更多
      文章开始之前先扯点闲的,相比Spring Security 的强大复杂,  Shiro是个简洁扩展性强易用的轻量级安全框架,源代码的思路也很清晰。如果你觉得安全框架都太过通用无法满足您的特殊需求,想构建公司内部的安全框架,那么参考shiro的实现也是个不错的思路。

      项目运行环境:mac os 10.x ,maven3.0, eclipse ,jetty7.5,
      相关框架:spring3.x,shiro2.1
     
      问题描述:由于eclipse下的jetty插件配合maven非常方便测试,所以编写代码都是用jetty做服务器跑的,但打包好war以后在tomcat下跑,总会报shiro的一个错误
引用

org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.
        at org.apache.shiro.SecurityUtils.getSecurityManager(SecurityUtils.java:123)
        at org.apache.shiro.subject.Subject$Builder.<init>(Subject.java:627)
        ...


   在网络上找到很多关于shiro报错的文章,大多情况都是spring中的shiro上下文配置错误,如果是这种错误那么在jetty下一样会报错。仔细查看错误代码会发现所有的shiro报错都跟jsp里的shiro tag标签有关,而且这些页面都是公用页面,如common.jsp,header.jsp等的。

尝试过很多办法,如拷贝jstl.jar到tomcat的lib包下,去除不兼容的servlet.jar包等等,问题依旧没有解决
最终在shiro的官方论坛中找到答案,传送门:
http://shiro-user.582556.n2.nabble.com/Do-you-have-to-SecurityUtils-setSecurityManager-in-a-web-app-to-use-shiro-tag-library-td7114798.html

      出错原因:
引用
Tomcat invokes the filter chain only on REQUEST dispatcher. It's a standard servlet thing, but I'm not sure if Jetty implements dispatchers at all or they just have a different default
(Tomcat调用filter过滤器是默认只拦截 REQUEST请求,这其实是符合servlet标准的,但jetty调用filter过滤器时会拦截所有请求)
例如我们的common.jsp被别的页面用<jsp:include>标签包含时,jetty下filter依然起作用,但tomcat可不理会,这样common.jsp里如果有shiro的jsp标签,这个标签会调用securityManager获取当前的用户对象,但由于shirofilter过滤器没起作用,会导致标签找不到上下文

   
     解决办法:
  
引用
<!-- Shiro Security filter-->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
    <param-name>targetFilterLifecycle</param-name>
     <param-value>true</param-value>
   </init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>

<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>

</filter-mapping>

   
    将蓝色的文字添加到现有shiroFilter 里面就可以了,大致意思是强制这个过滤器过滤所有相关的请求


     



     
分享到:
评论
2 楼 songzhe_5526778 2014-04-03  
谢谢,解决了我的问题,转载啦
1 楼 shirui_java 2013-08-28  
多谢!!!!!

相关推荐

    nginx+tomcat shiro实现多tomcat下session共享

    "nginx+tomcat shiro实现多tomcat下session共享"这一主题,就是探讨在这样的架构中,如何有效管理和共享session。 1. **Nginx的作用**: Nginx是一个高性能的HTTP和反向代理服务器,常用于负载均衡,可以将用户的...

    Shiro整合springboot报错代码

    在整合Apache Shiro框架与Spring Boot的过程中,可能会遇到各种错误,这些错误可能源自配置不当、依赖冲突或理解上的误区。本文将深入探讨Shiro与Spring Boot整合时可能出现的问题及其解决方案。 1. **Shiro的基本...

    基于ssm+shiro+redis+nginx tomcat服务器集群管理项目.zip

    基于ssm+shiro+redis+nginx tomcat服务器集群管理项目 基于ssm+shiro+redis+nginx tomcat服务器集群管理项目 基于ssm+shiro+redis+nginx tomcat服务器集群管理项目 基于ssm+shiro+redis+nginx tomcat服务器集群管理...

    Shiro反序列化漏洞,Shiro版本升级资源

    shiro使用的版本是1.2.4,存在反序列化漏洞,我们采取的办法是手动升级到了1.2.6版本,但苦于无法验证是否解决了问题,后来发现了一款测试工具,ShiroExploit。 测试工具下载地址 ... 反序列化漏洞是如何产生的?...

    shiro项目基本运行架包以及全部的架包shiro-all.jar

    Apache Shiro是一个强大的Java安全框架,它提供了身份验证、授权、加密和会话管理功能,为开发人员构建安全的应用程序提供了一种简单易用的方式。标题提到的"shiro项目基本运行架包以及全部的架包shiro-all.jar"正是...

    ssm集成redis和shiro

    5. **Shiro与Spring整合**: 使用Spring的DelegatingFilterProxy来代理Shiro的Filter,以便在Spring环境下运行。 6. **Shiro API使用**: 在业务代码或控制器中,可以调用Subject的登出、认证、授权等方法。 **SSM与...

    Apache shiro 1.13.0源码

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,简化了企业级应用的安全实现。Shiro 1.13.0 是其一个重要的版本,包含了多项更新和改进。在这个版本中,开发者可以深入理解其...

    shiro权限管理实例

    在这个"shiro权限管理实例"中,我们可以通过学习和实践来深入理解Shiro如何在实际项目中处理用户权限控制。 首先,让我们从身份验证(Authentication)开始。在Shiro中,身份验证是指验证用户提供的身份信息是否...

    shiro1.3.2相关jar(解决Websphere下项目变慢问题)

    在Websphere应用服务器环境下,有时项目运行时可能会出现性能下降或响应速度变慢的问题,这可能与Shiro的版本或者其与其他库的兼容性有关。针对“shiro1.3.2相关jar(解决Websphere下项目变慢问题)”的标题和描述,...

    struts2和shiro完美整合解决方案

    Struts2和Shiro是两个在Java Web开发中非常重要的框架。Struts2是一个MVC框架,用于构建可维护、可扩展的Web应用程序,而Apache Shiro则是一个强大的安全管理框架,处理认证、授权、会话管理和加密等安全相关任务。...

    shiro整合ssmDemo可直接运行

    SSM(Spring、SpringMVC、MyBatis)是Java Web开发中常用的三大框架组合,而Apache Shiro则是一个强大的安全管理框架,用于处理认证、授权、会话管理和安全控制。本文将详细介绍如何将Shiro与SSM框架整合,以便在...

    shiro文件 搭建攻防演练演示环境 解压后放入tomcat的webpass目录下即可

    Apache Shiro在其认证和授权流程中使用了序列化,这就是为什么它可能成为攻击目标的原因。 Shiro反序列化漏洞主要出现在其SessionManager和CacheManager组件中。攻击者可以通过构造恶意的序列化数据并将其发送到...

    shiro-redisson基于Redis的ShiroCache和Session实现

    总之,`shiro-redisson` 为 Shiro 带来了分布式环境下的高效缓存和会话管理,通过利用 Redis 的特性,解决了在大型分布式系统中的安全性和性能挑战。对于需要构建可扩展、高可用的 Java 应用来说,这是一个非常有...

    shiro-attack-4.7.0-SNAPSHOT-all.zip

    Shiro在某些场景下可能会涉及到对象的序列化和反序列化,因此确保其序列化过程的安全性至关重要。 在提供的文件列表中,"shiro_attack-4.7.0-SNAPSHOT-all.jar"可能是包含具体测试逻辑和实现的Java库,可以被开发者...

    一个简单的shiro例子

    10. **运行与部署**: 使用IDEA可以直接运行这个项目,通常通过内置的Tomcat或Jetty服务器启动。部署时,可能需要将项目打包成WAR文件,然后部署到外部服务器如Apache Tomcat上。 通过这个简单的Shiro例子,开发者...

    shiro1.7.1.zip

    在标签中提到了“shiro兼容包”,这通常指的是为了保证与旧版本系统兼容,或者解决特定环境下的问题,Shiro提供的额外支持包。在升级过程中,如果遇到兼容性问题,这些包可能非常有用。同时,提到了“权限绕过漏洞 ...

    springboot 集成shiro代码实例

    SpringBoot集成Shiro是Java开发中常见的权限管理实践,它结合了SpringBoot的便捷性和Apache Shiro的安全特性,为Web应用程序提供了用户认证和授权的解决方案。以下是对这一主题的详细阐述: 1. **SpringBoot简介**...

    跟我学Shiro第12章Demo(仅JAVA SE+Web+Shiro权限注解)

    1. 安装与配置:学习如何在本地环境中安装和配置Jetty服务器,以及如何导入和运行Maven项目。 2. 分析代码:研究项目中的Controller、Service、DAO层,了解Shiro注解如何在代码中被使用。 3. 测试权限:创建不同的...

    跟我学Shiro

    Apache Shiro 是 Java 的一个安全框架。目前,使用 Apache Shiro 的人越来越多,因为它相 当简单,对比 Spring Security,可能没有 Spring Security 做的功能强大,但是在实际工作时 可能并不需要那么复杂的东西,...

Global site tag (gtag.js) - Google Analytics