在使用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拦截和权限控制的基本步骤: 1. **配置Shiro**:在Spring或者其他的配置文件中,你需要声明并配置Shiro的相关过滤器,如`authc`(用于身份验证)、`perms`(基于权限的拦截)和`roles`(基于...
SSM+Shiro+Druid实现的企业资产后台管理系统代码分享 项目描述 随着企业的发展,很多中小企业的规模越来越大,需要管理资产也越来越多,比如显示器,主机,打印机,传真机,复印机,电话,装订机,空调,饮水机,...
Spirng Boot+Shiro+Druid+Mybatis Plus+Mysql搭建基础框架实现登录用户认证 可直接下载运行
4. **拦截器设置**: 使用Shiro的Filter链来拦截所有请求,进行权限检查。根据URI判断用户是否有访问权限。 5. **Vue前端交互**: Vue组件可以调用后端提供的API获取当前用户的角色和权限,然后动态渲染菜单或按钮。...
本demo为Spring boot整合shiro,以mybatis plus做dao层交互数据,实现了读取数据库用户数据实现用户登录,权限认证,读取数据库中用户对应的url请求,实现请求的过滤。自定义了relam和过滤器来实现这些功能
同时,设置Filter Chain,使Shiro能够拦截请求并执行权限校验。 2. **自定义指令**:在Vue项目中,创建一个自定义指令(例如:`v-has-permission`),该指令接收一个权限标识符作为参数,然后在Vue实例的生命周期...
例如,`shiro-filter.xml`配置文件中定义了哪些URL需要进行权限校验,以及相应的处理方式。 总结起来,这个"shiro权限案例demo"是一个全面展示如何使用Apache Shiro实现在Java应用程序中进行用户权限管理的实例。它...
Shiro的拦截器(如Filter)可以对特定的URL进行权限控制,只有经过授权的用户才能访问。同时,Shiro还能够处理异常情况,如登录失败,提供相应的反馈信息。 项目的URL "http://localhost:8080/wzx/user/login" 暗示...
本博客主要关注的是如何利用Shiro进行基于URL的权限管理,这对于构建一个用户友好且安全的Web系统至关重要。 **Shiro基础** 1. **身份验证(Authentication)**:这是确认用户身份的过程,通常涉及用户输入用户名...
- **Web.xml配置**:设置Shiro Filter链,指定哪些URL需要拦截和如何处理。 4. **登录验证流程**: - 用户提交登录请求,携带用户名和密码。 - Shiro的Filter拦截请求,通过`Subject.login()`方法进行身份验证。...
通过将Shiro的会话数据存储在Redis中,可以实现跨服务器的会话共享,解决了分布式环境下会话同步的问题。 在具体实现上,可能涉及到以下步骤: 1. 配置Shiro Realm,处理用户的认证和授权逻辑。 2. 实现SessionDAO...
4. **Spring MVC 集成**:在 Spring MVC 中,可以使用 Shiro 的 Filter 配置来控制 URL 访问权限。 在实际项目中,Shiro 和 Spring 结合的典型步骤包括: 1. **配置 Shiro**:创建 Realm 实现,连接到应用的数据源...
Shiro支持基于URL的权限拦截,这意味着可以为每个URL分配特定的访问权限,只有拥有相应权限的用户才能访问。这种方式提高了权限控制的粒度,使权限管理更为精细化。 JWT(JSON Web Token)是一种轻量级的身份验证...
Java SpringBoot + Mybatis + Druid + Shiro 是一个常见的企业级Web应用开发框架组合,用于构建高效、稳定且易于维护的系统。以下是对这个技术栈的详细解释: **SpringBoot** SpringBoot是Spring框架的一个扩展,它...
Apache Shiro是一个强大的Java安全框架,它提供了身份验证、授权、加密和会话管理功能,为开发人员构建安全的应用程序提供便利。在这个场景中,我们关注的是如何利用Shiro实现根据用户权限动态显示不同的菜单。 ...
4. **Shiro的权限控制**:掌握如何使用Shiro的注解进行权限判断,如@RequiresPermissions、@RequiresRoles等。 5. **MyBatis Plus的使用**:学习如何创建实体类、Mapper接口,以及如何编写Mapper XML文件来实现数据...
- **URL拦截**:利用Shiro内置的过滤器来拦截URL,实现权限控制。 - **方法注解**:通过在业务逻辑的方法上添加注解来控制权限。 - **页面标签**:提供了一组标签库,用于根据权限动态展示或隐藏页面元素。 ...
Apache Shiro 和 Google Guice 的整合是为了解决在Java应用程序中实现权限管理的问题。Shiro 是一个强大且易用的 Java 安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。而 ...