shiro整合springmvc配置静态资源过滤方式

 更新时间:2026年03月14日 09:22:15   作者:快乐的小三菊  
文章介绍了在Spring Boot + Spring MVC + Shiro + JSP项目中,如何正确配置静态资源路径以避免在引入Shiro过滤器后资源加载失败的问题

一、背景

最近在看 shiro 的过滤器,是基于springboot + spring mvc + shiro + jsp 构建的一个小工程,我想在 jsp 的页面中加载 jscss 和一些图片资源,遇到的一些小的问题,在此记录一下。

二、标签

先看下 application.properties 里面的两个标签,下面的这个标签,只有静态资源的访问路径为为 /static/** 时,才会处理该请求。

比如:访问http://localhost:8080/static/css/index.css,处理的方式是根据模式匹配后的文件名查找本地文件。按照 spring.resources.static-locations 指定的位置查找本地文件。

spring.mvc.static-path-pattern=/static/**

再看下面这个标签,这个标签是自定义 springboot 前端静态资源的位置,如果不配置,则默认将从如下位置,按照优先级查找静态资源文件,从左向右是由高到低
spring.resources.static-locations = classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources

spring.resources.static-locations = classpath:/static,classpath:/public,classpath:/resources,classpath:/META-INF/resources

三、示例工程

我的 jsp 文件放在了 webapp 文件夹的 page 文件夹下,而我的 jsimage css 文件则放在了 resources static 文件夹下,如下所示:

我的初始化登录界面 login.jsp 的内容如下所示,如果此时不引入 shiro ,则下面的界面可以正常显示,即可以正常的显示和加载所有的资源。

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>一路发咨询网站</title>
</head>
<body>
<script type="text/javascript" src="/static/js/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="/static/js/login.js"></script>
<link rel="stylesheet" type="text/css" href="/static/css/login.css" rel="external nofollow" />
<h1>欢迎登录一路发咨询网站</h1>

<form action="/login" method="post">
	<div id="father" style="background-image: url('/static/image/index.png');">
		<div style="width:300px;height:100px;">
			<div style="width:150px;float:left">
				<span>用户名:<span></span>
			</div>
			<div style="width:150px;float:left;">
				<input  style="height:34px" type="text" name="userName"/>
			</div>
		</div>
		<div style="width:300px;height:100px;">
			<div style="width:150px;float:left;">
				<span>密码:<span></span>
			</div>
			<div style="width:150px;float:left;">
				<input  style="height:34px" type="password" name="password"/>
			</div>
		</div>
		<div style="width:300px;height:100px;">
			<div style="width:64px;float:left;margin-left:280px">
				<input style="height:34px;width:34px;" type="checkbox" name="rememberMe" />
			</div>
			 <div style="width:150px;float:left;margin-top:-4px">
					<span>记住我<span></span>
			</div>
		</div>
		 <div style="margin-left:190px">
				<input style="height:50px;width:90px;font-size:34px;font-weight:bold" type="submit" value="提交"/>
		</div>
	</div>
</form>
</body>
</html>

四、引入shiro

由于 shiro 拥有过滤器的功能,如果按照下面的这种方式配置,则上面的 login.jsp 里面所需要的 jscss和图片资源都无法正常加载。

@Bean
	public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
		ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
		// Shiro的核心安全接口,这个属性是必须的
		shiroFilter.setSecurityManager(securityManager);		
		//身份认证失败,则跳转到登录页面的配置 没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,
        //不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。
		shiroFilter.setLoginUrl("/page/login.jsp");
		//自定义过滤
		Map<String, String> map = new LinkedHashMap<>();
		// 不能对login方法进行拦截,若进行拦截的话,这辈子都登录不上去了,这个login是LoginController里面登录校验的方法
		map.put("/login", "anon");
		//对所有请求进行拦截
		map.put("/**", "authc");
		shiroFilter.setFilterChainDefinitionMap(map);
		return shiroFilter;
	}

五、解决方式

只需要在上面的这个方法中,加一个过滤条件即可,如下所示,千万记得map.put("/**", "authc")这个拦截条件要放在最后。

@Bean
	public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
		ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
		// Shiro的核心安全接口,这个属性是必须的
		shiroFilter.setSecurityManager(securityManager);		
		//身份认证失败,则跳转到登录页面的配置 没有登录的用户请求需要登录的页面时自动跳转到登录页面,不是必须的属性,
        //不输入地址的话会自动寻找项目web项目的根目录下的”/login.jsp”页面。
		shiroFilter.setLoginUrl("/page/login.jsp");
		//自定义过滤
		Map<String, String> map = new LinkedHashMap<>();
		// 不能对login方法进行拦截,若进行拦截的话,这辈子都登录不上去了,这个login是LoginController里面登录校验的方法
		map.put("/login", "anon");
		map.put("/static/**", "anon");
		//对所有请求进行拦截
		map.put("/**", "authc");
		shiroFilter.setFilterChainDefinitionMap(map);
		return shiroFilter;
	}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 6种SpringBoot中自定义starter的方式介绍

    6种SpringBoot中自定义starter的方式介绍

    在SpringBoot生态中,starter是一种特殊的依赖,它能够自动装配相关组件,简化项目配置,本文将详细介绍6种不同的自定义starter开发方法,有需要的可以了解下
    2025-04-04
  • Java布隆过滤器的原理和实现分析

    Java布隆过滤器的原理和实现分析

    数组、链表、树等数据结构会存储元素的内容,一旦数据量过大,消耗的内存也会呈现线性增长所以布隆过滤器是为了解决数据量大的一种数据结构。本文就来和大家详细说说布隆过滤器的原理和实现,感兴趣的可以了解一下
    2022-10-10
  • JPA默认值设置没有效果的解决

    JPA默认值设置没有效果的解决

    这篇文章主要介绍了JPA默认值设置没有效果的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 解决java.lang.IllegalStateException:Duplicate key异常问题

    解决java.lang.IllegalStateException:Duplicate key异常问题

    java.lang.IllegalStateException:Duplicatekey异常在将List转换为Map时出现,解决方法是使用toMap()的重载方法,如果已经存在则不再修改,直接使用上一个数据
    2025-03-03
  • Spring Boot Thymeleaf实现国际化的方法详解

    Spring Boot Thymeleaf实现国际化的方法详解

    这篇文章主要给大家介绍了关于Spring Boot Thymeleaf实现国际化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • JDK17中Sealed Classes的使用

    JDK17中Sealed Classes的使用

    Sealed类自JDK15起预览,JDK17正式纳入,通过sealed修饰限制继承,指定允许的子类,并用final或non-sealed控制继承层级,实现更精确的类继承管理,下面就来介绍一下具体使用
    2025-08-08
  • 如何基于ssm框架实现springmvc拦截器

    如何基于ssm框架实现springmvc拦截器

    这篇文章主要介绍了如何基于ssm框架实现springmvc拦截器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java实现异步延迟队列的方法详解

    Java实现异步延迟队列的方法详解

    目前系统中有很多需要用到延时处理的功能,本文就为大家介绍了Java实现异步延迟队列的方法,文中的示例代码讲解详细,需要的可以参考一下
    2023-03-03
  • Java8新特性Stream流详解

    Java8新特性Stream流详解

    Java8 Stream使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式的操作,本文就将带着你如何使用 Java 8 不同类型的 Stream 操作,同时还将了解流的处理顺序,以及不同顺序的流操作是如何影响运行时性能的
    2023-07-07
  • JAVA中通过Redis实现延时任务demo实例

    JAVA中通过Redis实现延时任务demo实例

    Redis在2.0版本时引入了发布订阅(pub/sub)功能,在发布订阅中有一个channel(频道),与消息队列中的topic(主题)类似,可以通过redis的发布订阅者模式实现延时任务功能,实例中会议室预约系统,用户预约管理员审核后生效,如未审批,需要自动变超期未处理,使用延时任务
    2024-08-08

最新评论