`

关于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  
多谢!!!!!

相关推荐

    基于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服务器集群管理...

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

    分布式nginx多tomcat shiro共享session

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

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

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

    shiro项目所需的全部架包以及基本的运行架包都在里面,解压后会有一个文件夹,是在用框架的时候整合shiro使用的,在外面的架包是基本实现shiro项目所需的架包。

    shiro整合ssmDemo可直接运行

    shiro整合ssm,sql都有,改好数据库配置可直接运行,让你更容易理解shiro的机制和实现

    跟我学Shiro

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

    ssm集成redis和shiro

    ssm集成redis和shiro,先搭建ssm项目,然后开始集成redis和shiro。

    shiro权限管理实例

    shiro权限管理实例,内含sql脚本,运行sql 导入maven项目即可启动

    spring+spring mvc+mybatis开发java医院HR人事管理系统(加强版本+ shiro)

    系统应该也是一个初学者写的,没有权限管理,没有认证,漏洞也很多,所以我加了shiro权限和认证管理, 完成后应该可以使用基本功能了。后面我想再把菜单动态生成这块改改,再加上防注入攻击等,呵呵,要改的地方 真...

    SpringMVC-Mybatis-Shiro-redis-master 权限集成缓存中实例

    主要解决是之前说的问题:Shiro 教程,关于最近反应的相关异常问题,解决方法合集。 项目在本页面的附件中提取。 一、Cache配置修改。 配置文件(spring-cache.xml )中已经修改为如下配置: &lt;!-- redis ...

    Shiro入门教程

    Shiro入门实例 Shiro入门教程 ...Shiro可以在任何环境下运行,小到最简单的命令行应用,大到大型的企业应用以及集群应用。但是我们准备在快速指南中使用最最简单的main方法的方式,让你对Shiro的API有个感官的认识。

    shiro最简单整合版本

    shiro最简单整合版本shiro最简单整合版本shiro最简单整合版本shiro最简单整合版本shiro最简单整合版本

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

    shiro项目在Websphere下项目变得很慢很卡,替换的jar包。was下使用shiro,系统卡慢。

    struts2和shiro完美整合解决方案

    struts2和shiro整合的解决方案很少,别的资源你别下载了,我试过了都是不好用的,这个是绝对好用的。带登陆和退出,还有角色的配置和使用。

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

    shiro-redisson 是一个 Apache Shiro 的扩展组件,提供了基于 redis 实现的缓存和会话,以支持分布式环境下的应用。底层使用了 redisson 作为 redis 客户端。

    基于spring redis的shiro session共享

    shiro 框架没有用tomcat的session,而是重新实现了一套。所以系统一旦引入shiro后,采用传统的tomcat session共享机制是无效的,必须采用面向shiro 的session共享。 网上针对“shiro session共享”的文章比较多,...

    单点登录sso-shiro-cas-maven

    其中QueryDatabaseAuthenticationHandler这个类是自定义构建的,在cas/WEB-INF/lib/cas-jdbc-1.0.0.jar里面,有兴趣的同学可以发编译看下,关于几个属性的说明 1. dataSource: 数据源,配置MySQL的连接信息 2. ...

    shiro-core-1.7.1 jar

    shiro shiro-core-1.7.1 jar shiro漏洞

    Shiro和cas部分整合

    关于shiro + CAS + Spring中怎么把CAS.xml和shiro.xml连接起来

Global site tag (gtag.js) - Google Analytics