`

shiro配合druid使用下URL拦截权限设置为anno时遇到的问题

 
阅读更多

 

在使用shiro做权限控制的一个系统中,其中有一个页面需要配置为无需登录就能访问,配置方法如下

 

<bean name="shiroFilterChainDefinitions" class="java.lang.String">
        <constructor-arg>
            <value>
                /test = anon
            </value>
        </constructor-arg>
    </bean>

 这里配置的意思就是所有人都能直接访问 /test 这个路径,但是实际访问时,却报如下错误:

05-Nov-2020 16:36:58.845 SEVERE [http-apr-8080-exec-8] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [springServlet] in context with path [] threw exception [java.lang.IllegalStateException: java.lang.NullPointerException] with root cause
 java.lang.NullPointerException
	at org.apache.shiro.web.servlet.ShiroHttpSession.getCreationTime(ShiroHttpSession.java:90)
	at com.alibaba.druid.support.http.AbstractWebStatImpl.getSessionStat(AbstractWebStatImpl.java:106)
	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:144)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
	at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
	at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
	at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
	at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
	at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
	at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
	at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
	at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
	at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2508)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2497)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

 查看ShroHttpSession.getCreationTime方法,得知是因为druid会对session进行监控,而这里session的startTimestamp为空,因此报错

public long getCreationTime() {
        try {
            return this.getSession().getStartTimestamp().getTime();
        } catch (Exception var2) {
            throw new IllegalStateException(var2);
        }
    }

 

解决方法:让druid不对 /test 路径做session监控。配置方法,在web.xml中找到druid用于web-jdbc关联监控类WebStatFilter的配置,在exclusions的value中添加 /test 地址

<filter>
  	<filter-name>DruidWebStatFilter</filter-name>
  	<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
  	<init-param>
  		<param-name>exclusions</param-name>
  		<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,/test</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>DruidWebStatFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

 

 

分享到:
评论

相关推荐

    基于Shiro 拦截URL,实现权限控制

    以下是使用Shiro实现URL拦截和权限控制的基本步骤: 1. **配置Shiro**:在Spring或者其他的配置文件中,你需要声明并配置Shiro的相关过滤器,如`authc`(用于身份验证)、`perms`(基于权限的拦截)和`roles`(基于...

    基于java的SSM+Shiro+Druid实现的企业资产后台管理系统代码

    SSM+Shiro+Druid实现的企业资产后台管理系统代码分享 项目描述 随着企业的发展,很多中小企业的规模越来越大,需要管理资产也越来越多,比如显示器,主机,打印机,传真机,复印机,电话,装订机,空调,饮水机,...

    Spirng Boot+Shiro+Druid+Mybatis Plus+Mysql搭建基础框架实现登录用户认证

    Spirng Boot+Shiro+Druid+Mybatis Plus+Mysql搭建基础框架实现登录用户认证 可直接下载运行

    SpringBoot 集成 Shiro 实现动态uri权限

    4. **拦截器设置**: 使用Shiro的Filter链来拦截所有请求,进行权限检查。根据URI判断用户是否有访问权限。 5. **Vue前端交互**: Vue组件可以调用后端提供的API获取当前用户的角色和权限,然后动态渲染菜单或按钮。...

    spring boot整合shiro实现url请求过滤

    本demo为Spring boot整合shiro,以mybatis plus做dao层交互数据,实现了读取数据库用户数据实现用户登录,权限认证,读取数据库中用户对应的url请求,实现请求的过滤。自定义了relam和过滤器来实现这些功能

    vue与shiro结合实现权限按钮

    同时,设置Filter Chain,使Shiro能够拦截请求并执行权限校验。 2. **自定义指令**:在Vue项目中,创建一个自定义指令(例如:`v-has-permission`),该指令接收一个权限标识符作为参数,然后在Vue实例的生命周期...

    shiro权限案例demo

    例如,`shiro-filter.xml`配置文件中定义了哪些URL需要进行权限校验,以及相应的处理方式。 总结起来,这个"shiro权限案例demo"是一个全面展示如何使用Apache Shiro实现在Java应用程序中进行用户权限管理的实例。它...

    springmvc+spring+mybatis+druid+shiro 登陆实现

    Shiro的拦截器(如Filter)可以对特定的URL进行权限控制,只有经过授权的用户才能访问。同时,Shiro还能够处理异常情况,如登录失败,提供相应的反馈信息。 项目的URL "http://localhost:8080/wzx/user/login" 暗示...

    对应本博客:shiro、基于url权限管理章节的源代码

    本博客主要关注的是如何利用Shiro进行基于URL的权限管理,这对于构建一个用户友好且安全的Web系统至关重要。 **Shiro基础** 1. **身份验证(Authentication)**:这是确认用户身份的过程,通常涉及用户输入用户名...

    shiro登录拦截校验demo

    - **Web.xml配置**:设置Shiro Filter链,指定哪些URL需要拦截和如何处理。 4. **登录验证流程**: - 用户提交登录请求,携带用户名和密码。 - Shiro的Filter拦截请求,通过`Subject.login()`方法进行身份验证。...

    基于shiro前后端分离分布式权限管理(完整后端代码)

    通过将Shiro的会话数据存储在Redis中,可以实现跨服务器的会话共享,解决了分布式环境下会话同步的问题。 在具体实现上,可能涉及到以下步骤: 1. 配置Shiro Realm,处理用户的认证和授权逻辑。 2. 实现SessionDAO...

    shiro配合sping框架

    4. **Spring MVC 集成**:在 Spring MVC 中,可以使用 Shiro 的 Filter 配置来控制 URL 访问权限。 在实际项目中,Shiro 和 Spring 结合的典型步骤包括: 1. **配置 Shiro**:创建 Realm 实现,连接到应用的数据源...

    SpringBoot+Shiro+JWT+Jedis+MybatisPlus+前后端分离+基于url通用权限管理系统

    Shiro支持基于URL的权限拦截,这意味着可以为每个URL分配特定的访问权限,只有拥有相应权限的用户才能访问。这种方式提高了权限控制的粒度,使权限管理更为精细化。 JWT(JSON Web Token)是一种轻量级的身份验证...

    Java SpringBoot+Mybatis+Druid+Shiro

    Java SpringBoot + Mybatis + Druid + Shiro 是一个常见的企业级Web应用开发框架组合,用于构建高效、稳定且易于维护的系统。以下是对这个技术栈的详细解释: **SpringBoot** SpringBoot是Spring框架的一个扩展,它...

    SpringBoot 、Shiro、 自定义注解权限控制源码下载

    4. **Shiro的权限控制**:掌握如何使用Shiro的注解进行权限判断,如@RequiresPermissions、@RequiresRoles等。 5. **MyBatis Plus的使用**:学习如何创建实体类、Mapper接口,以及如何编写Mapper XML文件来实现数据...

    shiro权限框架

    - **URL拦截**:利用Shiro内置的过滤器来拦截URL,实现权限控制。 - **方法注解**:通过在业务逻辑的方法上添加注解来控制权限。 - **页面标签**:提供了一组标签库,用于根据权限动态展示或隐藏页面元素。 ...

    Shiro根据用户权限显示不同的菜单.Shiro根据权限显示指定菜单

    Apache Shiro是一个强大的Java安全框架,它提供了身份验证、授权、加密和会话管理功能,为开发人员构建安全的应用程序提供便利。在这个场景中,我们关注的是如何利用Shiro实现根据用户权限动态显示不同的菜单。 ...

    shiro和guice整合,使用权限注解

    Apache Shiro 和 Google Guice 的整合是为了解决在Java应用程序中实现权限管理的问题。Shiro 是一个强大且易用的 Java 安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。而 ...

Global site tag (gtag.js) - Google Analytics