shiro整合springmvc配置靜態(tài)資源過(guò)濾方式
一、背景
最近在看 shiro 的過(guò)濾器,是基于springboot + spring mvc + shiro + jsp 構(gòu)建的一個(gè)小工程,我想在 jsp 的頁(yè)面中加載 js 、css 和一些圖片資源,遇到的一些小的問(wèn)題,在此記錄一下。
二、標(biāo)簽
先看下 application.properties 里面的兩個(gè)標(biāo)簽,下面的這個(gè)標(biāo)簽,只有靜態(tài)資源的訪問(wèn)路徑為為 /static/** 時(shí),才會(huì)處理該請(qǐng)求。
比如:訪問(wèn)http://localhost:8080/static/css/index.css,處理的方式是根據(jù)模式匹配后的文件名查找本地文件。按照 spring.resources.static-locations 指定的位置查找本地文件。
spring.mvc.static-path-pattern=/static/**
再看下面這個(gè)標(biāo)簽,這個(gè)標(biāo)簽是自定義 springboot 前端靜態(tài)資源的位置,如果不配置,則默認(rèn)將從如下位置,按照優(yōu)先級(jí)查找靜態(tài)資源文件,從左向右是由高到低
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 文件夾下,而我的 js、image 和 css 文件則放在了 resources 的 static 文件夾下,如下所示:

我的初始化登錄界面 login.jsp 的內(nèi)容如下所示,如果此時(shí)不引入 shiro ,則下面的界面可以正常顯示,即可以正常的顯示和加載所有的資源。
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>一路發(fā)咨詢網(wǎng)站</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>歡迎登錄一路發(fā)咨詢網(wǎng)站</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 擁有過(guò)濾器的功能,如果按照下面的這種方式配置,則上面的 login.jsp 里面所需要的 js、css和圖片資源都無(wú)法正常加載。
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
// Shiro的核心安全接口,這個(gè)屬性是必須的
shiroFilter.setSecurityManager(securityManager);
//身份認(rèn)證失敗,則跳轉(zhuǎn)到登錄頁(yè)面的配置 沒(méi)有登錄的用戶請(qǐng)求需要登錄的頁(yè)面時(shí)自動(dòng)跳轉(zhuǎn)到登錄頁(yè)面,不是必須的屬性,
//不輸入地址的話會(huì)自動(dòng)尋找項(xiàng)目web項(xiàng)目的根目錄下的”/login.jsp”頁(yè)面。
shiroFilter.setLoginUrl("/page/login.jsp");
//自定義過(guò)濾
Map<String, String> map = new LinkedHashMap<>();
// 不能對(duì)login方法進(jìn)行攔截,若進(jìn)行攔截的話,這輩子都登錄不上去了,這個(gè)login是LoginController里面登錄校驗(yàn)的方法
map.put("/login", "anon");
//對(duì)所有請(qǐng)求進(jìn)行攔截
map.put("/**", "authc");
shiroFilter.setFilterChainDefinitionMap(map);
return shiroFilter;
}五、解決方式
只需要在上面的這個(gè)方法中,加一個(gè)過(guò)濾條件即可,如下所示,千萬(wàn)記得map.put("/**", "authc")這個(gè)攔截條件要放在最后。
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
// Shiro的核心安全接口,這個(gè)屬性是必須的
shiroFilter.setSecurityManager(securityManager);
//身份認(rèn)證失敗,則跳轉(zhuǎn)到登錄頁(yè)面的配置 沒(méi)有登錄的用戶請(qǐng)求需要登錄的頁(yè)面時(shí)自動(dòng)跳轉(zhuǎn)到登錄頁(yè)面,不是必須的屬性,
//不輸入地址的話會(huì)自動(dòng)尋找項(xiàng)目web項(xiàng)目的根目錄下的”/login.jsp”頁(yè)面。
shiroFilter.setLoginUrl("/page/login.jsp");
//自定義過(guò)濾
Map<String, String> map = new LinkedHashMap<>();
// 不能對(duì)login方法進(jìn)行攔截,若進(jìn)行攔截的話,這輩子都登錄不上去了,這個(gè)login是LoginController里面登錄校驗(yàn)的方法
map.put("/login", "anon");
map.put("/static/**", "anon");
//對(duì)所有請(qǐng)求進(jìn)行攔截
map.put("/**", "authc");
shiroFilter.setFilterChainDefinitionMap(map);
return shiroFilter;
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring MVC+FastJson+hibernate-validator整合的完整實(shí)例教程
這篇文章主要給大家介紹了關(guān)于Spring MVC+FastJson+hibernate-validator整合的完整實(shí)例教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04
Springmvc RequestMapping請(qǐng)求實(shí)現(xiàn)方法解析
這篇文章主要介紹了Springmvc RequestMapping請(qǐng)求實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Maven項(xiàng)目在new module后,pom文件顯示為Ignored pom.xml問(wèn)題
在Maven項(xiàng)目中,若創(chuàng)建過(guò)同名module后刪除,再次創(chuàng)建時(shí)可能導(dǎo)致pom.xml文件被IDEA忽略,原因是IDEA保留了之前module的痕跡,導(dǎo)致重建時(shí)將其視為已刪除的module,解決方法是進(jìn)入IDEA設(shè)置,找到Maven的Ignored Files設(shè)置2024-09-09
spring bean.xml文件p標(biāo)簽使用報(bào)錯(cuò)的解決
這篇文章主要介紹了spring bean.xml文件p標(biāo)簽使用報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
Java利用棧實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了Java利用棧實(shí)現(xiàn)簡(jiǎn)易計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
java開(kāi)發(fā)ShardingSphere的路由引擎類型示例詳解
這篇文章主要為大家介紹了java開(kāi)發(fā)ShardingSphere的路由引擎類型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
解決項(xiàng)目沒(méi)有build path的問(wèn)題
這篇文章主要介紹了解決項(xiàng)目沒(méi)有build path的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
java 實(shí)現(xiàn)當(dāng)前時(shí)間加減30分鐘的時(shí)間代碼
這篇文章主要介紹了java 實(shí)現(xiàn)當(dāng)前時(shí)間加減30分鐘的時(shí)間代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Java?C++算法題解leetcode801使序列遞增的最小交換次數(shù)
這篇文章主要為大家介紹了Java?C++題解leetcode801使序列遞增的最小交換次數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10

