apache shiro與spring整合、動態filterChainDefinitions、以及認證、授權
apache shiro是一個安全認證框架,和spring security相比,在於他使用了比較簡潔易懂的認證和授權方式。其提供的native-session(即把使用者認證後的授權資訊儲存在其自身提供Session中)機制,這樣就可以和HttpSession、EJB Session Bean的基於容器的Session脫耦,到和客戶端應用、Flex應用、遠端方法呼叫等都可以使用它來配置許可權認證。 在exit-web-framework裡的vcs-admin例子用到該框架,具體使用說明可以參考官方幫助文件。在這裡主要講解如何與spring結合、動態建立filterchaindefinitions、以及認證、授權、和快取處理。
apache shiro 結合spring
Shiro 擁有對Spring Web 應用程式的一流支援。在Web 應用程式中,所有Shiro 可訪問的萬惡不請求必須通過一個主要的Shiro 過濾器。該過濾器本身是極為強大的,允許臨時的自定義過濾器鏈基於任何URL 路徑表示式執行。 在Shiro 1.0 之前,你不得不在Spring web 應用程式中使用一個混合的方式,來定義Shiro 過濾器及所有它在web.xml中的配置屬性,但在Spring XML 中定義SecurityManager。這有些令人沮喪,由於你不能把你的配置固定在一個地方,以及利用更為先進的Spring 功能的配置能力,如PropertyPlaceholderConfigurer 或抽象bean 來固定通用配置。現在在Shiro 1.0 及以後版本中,所有Shiro 配置都是在Spring XML 中完成的,用來提供更為強健的Spring 配置機制。以下是如何在基於Spring web 應用程式中配置Shiro: web.xml:
<!-- Spring ApplicationContext配置檔案的路徑,可使用萬用字元,多個路徑用,號分隔 此引數用於後面的Spring Context Loader --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath*:/applicationContext-shiro.xml </param-value> </context-param> <!-- shiro security filter --> <filter> <!-- 這裡的filter-name要和spring的applicationContext-shiro.xml裡的 org.apache.shiro.spring.web.ShiroFilterFactoryBean的bean name相同 --> <filter-name>shiroSecurityFilter</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>shiroSecurityFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
applicationContext-shiro.xml檔案中,定義web支援的SecurityManager和"shiroSecurityFilter"bean將會被web.xml 引用。
<bean id="shiroSecurityFilter">
<!-- shiro的核心安全介面 -->
<property name="securityManager" ref="securityManager" />
<!-- 要求登入時的連結 -->
<property name="loginUrl" value="/login.jsp" />
<!-- 登陸成功後要跳轉的連線 -->
<property name="successUrl" value="/index.jsp" />
<!-- 未授權時要跳轉的連線 -->
<property name="unauthorizedUrl" value="/unauthorized.jsp" />
<!-- shiro連線約束配置 -->
<property name="filterChainDefinitions">
<value>
/login = authc
/logout = logout
/resource/** = anon
</value>
</property>
</bean>
<bean id="securityManager">
</bean>
<bean id="lifecycleBeanPostProcessor"/>
啟用Shiro註解
在獨立應用程式和Web應用程式中,你可能想為安全檢查使用Shiro 的註釋(例如,@RequiresRoles,@RequiresPermissions 等等)。這需要Shiro 的Spring AOP 整合來掃描合適的註解類以及執行必要的安全邏輯。以下是如何使用這些註解的。只需新增這兩個bean 定義到applicationContext-shiro.xml 中:
<bean depends-on="lifecycleBeanPostProcessor"/>
<bean>
<property name="securityManager" ref="securityManager"/>
</bean>
動態建立filterchaindefinitions
有時,在某些系統想通過讀取資料庫來定義org.apache.shiro.spring.web.ShiroFilterFactoryBean的filterChainDefinitions。這樣能夠通過操作介面或者維護後臺來管理系統的連結。
在shrio與spring整合好了以後,除錯原始碼的高人可能已經注意到。專案啟動時,shrio通過自己的org.apache.shiro.spring.web.ShiroFilterFactoryBean類的filterChainDefinitions(授權規則定義)屬性轉換為一個filterChainDefinitionMap,轉換完成後交給ShiroFilterFactoryBean保管。ShiroFilterFactoryBean根據授權(AuthorizationInfo類)後的資訊去判斷哪些連結能訪問哪些連結不能訪問。filterChainDefinitionMap裡面的鍵就是連結URL,值就是存在什麼條件才能訪問該連結,如perms、roles。filterChainDefinitionMap是一個Map,shiro擴展出一個Map的子類Ini.Section
現在有一張表的描述實體類,以及資料訪問:
@Entity
@Table(name="TB_RESOURCE")
public class Resource implements Serializable {
//主鍵id
@Id
private String id;
//action url
private String value;
//shiro permission;
private String permission;
//------------------Getter/Setter---------------------//
}
@Repository
public class ResourceDao extends BasicHibernateDao<Resource, String> {
}
通過該類可以知道permission欄位和value就是filterChainDefinitionMap的鍵/值,用spring FactoryBean介面的實現getObject()返回Section給filterChainDefinitionMap即可
public class ChainDefinitionSectionMetaSource implements FactoryBean<Ini.Section>{
@Autowired
private ResourceDao resourceDao;
private String filterChainDefinitions;
/**
* 預設premission字串
*/
public static final String PREMISSION_STRING="perms[\"{0}\"]";
public Section getObject() throws BeansException {
//獲取所有Resource
List<Resource> list = resourceDao.getAll();
Ini ini = new Ini();
//載入預設的url
ini.load(filterChainDefinitions);
Ini.Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
//迴圈Resource的url,逐個新增到section中。section就是filterChainDefinitionMap,
//裡面的鍵就是連結URL,值就是存在什麼條件才能訪問該連結
for (Iterator<Resource> it = list.iterator(); it.hasNext();) {
Resource resource = it.next();
//如果不為空值新增到section中
if(StringUtils.isNotEmpty(resource.getValue()) && StringUtils.isNotEmpty(resource.getPermission())) {
section.put(resource.getValue(), MessageFormat.format(PREMISSION_STRING,resource.getPermission()));
}
}
return section;
}
/**
* 通過filterChainDefinitions對預設的url過濾定義
*
* @param filterChainDefinitions 預設的url過濾定義
*/
public void setFilterChainDefinitions(String filterChainDefinitions) {
this.filterChainDefinitions = filterChainDefinitions;
}
public Class<?> getObjectType() {
return this.getClass();
}
public boolean isSingleton() {
return false;
}
}
定義好了chainDefinitionSectionMetaSource後修改applicationContext-shiro.xml檔案
<bean id="chainDefinitionSectionMetaSource">
<property name="filterChainDefinitions">
<value>
/login = authc
/logout = logout
/resource/** = anon
</value>
</property>
</bean>
<bean id="shiroSecurityFilter">
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/login.jsp" />
<property name="successUrl" value="/index.jsp" />
<property name="unauthorizedUrl" value="/unauthorized.jsp" />
<!-- shiro連線約束配置,在這裡使用自定義的動態獲取資源類 -->
<property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" />
</bean>
<bean id="securityManager">
</bean>
<bean id="lifecycleBeanPostProcessor"/>
shiro資料庫認證、授權
在shiro認證和授權主要是兩個類,就是org.apache.shiro.authc.AuthenticationInfo和org.apache.shiro.authz.AuthorizationInfo。該兩個類的處理在org.apache.shiro.realm.AuthorizingRealm中已經給出了兩個抽象方法。就是:
/**
* Retrieves the AuthorizationInfo for the given principals from the underlying data store. When returning
* an instance from this method, you might want to consider using an instance of
* {@link org.apache.shiro.authz.SimpleAuthorizationInfo SimpleAuthorizationInfo}, as it is suitable in most cases.
*
* @param principals the primary identifying principals of the AuthorizationInfo that should be retrieved.
* @return the AuthorizationInfo associated with this principals.
* @see org.apache.shiro.authz.SimpleAuthorizationInfo
*/
protected abstract AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals);
/**
* Retrieves authentication data from an implementation-specific datasource (RDBMS, LDAP, etc) for the given
* authentication token.
* <p/>
* For most datasources, this means just 'pulling' authentication data for an associated subject/user and nothing
* more and letting Shiro do the rest. But in some systems, this method could actually perform EIS specific
* log-in logic in addition to just retrieving data - it is up to the Realm implementation.
* <p/>
* A {@code null} return value means that no account could be associated with the specified token.
*
* @param token the authentication token containing the user's principal and credentials.
* @return an {@link AuthenticationInfo} object containing account data resulting from the
* authentication ONLY if the lookup is successful (i.e. account exists and is valid, etc.)
* @throws AuthenticationException if there is an error acquiring data or performing
* realm-specific authentication logic for the specified <tt>token</tt>
*/
protected abstract AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException;
doGetAuthenticationInfo(AuthenticationToken token)(認證/登入方法)會返回一個AuthenticationInfo,就是認證資訊。是一個對執行及對使用者的身份驗證(登入)嘗試負責的方法。當一個使用者嘗試登入時,該邏輯被認證器執行。認證器知道如何與一個或多個Realm協調來儲存相關的使用者/帳戶資訊。從這些Realm中獲得的資料被用來驗證使用者的身份來保證使用者確實是他們所說的他們是誰。
doGetAuthorizationInfo(PrincipalCollection principals)是負責在應用程式中決定使用者的訪問控制的方法。它是一種最終判定使用者是否被允許做某件事的機制。與doGetAuthenticationInfo(AuthenticationToken token)相似,doGetAuthorizationInfo(PrincipalCollection principals) 也知道如何協調多個後臺資料來源來訪問角色惡化許可權資訊和準確地決定使用者是否被允許執行給定的動作。
簡單的一個使用者和一個資源實體:
@Entity
@Table(name="TB_RESOURCE")
public class Resource implements Serializable {
//主鍵id
@Id
private String id;
//action url
private String value;
//shiro permission;
private String permission;
//------------------Getter/Setter---------------------//
}
@Entity
@Table(name="TB_USER")
@SuppressWarnings("serial")
public class User implements Serializable {
//主鍵id
@Id
private String id;
//登入名稱
private String username;
//登入密碼
private String password;
//擁有能訪問的資源/連結()
private List<Resource> resourcesList = new ArrayList<Resource>();
//-------------Getter/Setter-------------//
}
@Repository
public class UserDao extends BasicHibernateDao<User, String> {
public User getUserByUsername(String username) {
return findUniqueByProperty("username", username);
}
}
實現org.apache.shiro.realm.AuthorizingRealm中已經給出了兩個抽象方法:
public class ShiroDataBaseRealm extends AuthorizingRealm{
@Autowired
private UserDao userDao;
/**
*
* 當用戶進行訪問連結時的授權方法
*
*/
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
if (principals == null) {
throw new AuthorizationException("Principal物件不能為空");
}
User user = (User) principals.fromRealm(getName()).iterator().next();
//獲取使用者響應的permission
List<String> permissions = CollectionUtils.extractToList(user.getResourcesList(), "permission",true);
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermissions(permissions);
return info;
}
/**
* 使用者登入的認證方法
*
*/
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
String username = usernamePasswordToken.getUsername();
if (username == null) {
throw new AccountException("使用者名稱不能為空");
}
User user = userDao.getUserByUsername(username);
if (user == null) {
throw new UnknownAccountException("使用者不存在");
}
return new SimpleAuthenticationInfo(user,user.getPassword(),getName());
}
}
定義好了ShiroDataBaseRealm後修改applicationContext-shiro.xml檔案
<bean id="chainDefinitionSectionMetaSource">
<property name="filterChainDefinitions">
<value>
/login = authc
/logout = logout
/resource/** = anon
</value>
</property>
</bean>
<bean id="shiroSecurityFilter">
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/login.jsp" />
<property name="successUrl" value="/index.jsp" />
<property name="unauthorizedUrl" value="/unauthorized.jsp" />
<!-- shiro連線約束配置,在這裡使用自定義的動態獲取資源類 -->
<property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" />
</bean>
<bean id="shiroDataBaseRealm">
<!-- MD5加密 -->
<property name="credentialsMatcher">
<bean>
<property name="hashAlgorithmName" value="MD5" />
</bean>
</property>
</bean>
<bean id="securityManager">
<property name="realm" ref="shiroDataBaseRealm" />
</bean>
<bean id="lifecycleBeanPostProcessor"/>
shiro EHcache 與 Spring EHcache整合
shiro CacheManager建立並管理其他Shiro元件使用的Cache例項生命週期。因為Shiro能夠訪問許多後臺資料來源,如:身份驗證,授權和會話管理,快取在框架中一直是一流的架構功能,用來在同時使用這些資料來源時提高效能。任何現代開源和/或企業的快取產品能夠被插入到Shiro 來提供一個快速及高效的使用者體驗。
自從spring 3.1問世後推出了快取功能後,提供了對已有的 Spring 應用增加快取的支援,這個特性對應用本身來說是透明的,通過快取抽象層,使得對已有程式碼的影響降低到最小。
該快取機制針對於 Java 的方法,通過給定的一些引數來檢查方法是否已經執行,Spring 將對執行結果進行快取,而無需再次執行方法。
可通過下列配置來啟用快取的支援:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd">
<!-- 使用快取annotation 配置 -->
<cache:annotation-driven cache-manager="ehCacheManager" />
</beans>
@Cacheable和**@CacheEvict**來對快取進行操作
@Cacheable:負責將方法的返回值加入到快取中
@CacheEvict:負責清除快取
/**聲明瞭一個名為 persons 的快取區域,當呼叫該方法時,Spring 會檢查快取中是否存在 personId 對應的值。*/
@Cacheable("persons")
public Person profile(Long personId) { ... }
/**指定多個快取區域。Spring 會一個個的檢查,一旦某個區域存在指定值時則返回*/
@Cacheable({"persons", "profiles"})
public Person profile(Long personId) { ... }
</code>
</pre>
<pre>
<code>
/**清空所有快取*/
@CacheEvict(value="persons",allEntries=true)
public Person profile(Long personId, Long groundId) { ... }
/**或者根據條件決定是否快取*/
@CacheEvict(value="persons", condition="personId > 50")
public Person profile(Long personId) { ... }
在shiro裡面會有授權快取。可以通過AuthorizingRealm類中指定快取名稱。就是authorizationCacheName屬性。當shiro為使用者授權一次之後將會把所有授權資訊都放進快取中。現在有個需求。當在更新使用者或者刪除資源和更新資源的時候,要重新整理一下shiro的授權快取,給shiro重新授權一次。因為當更新使用者或者資源時,很有可能已經把使用者本身已有的資源去掉。不給使用者訪問。所以。藉助spring的快取工廠和shiro的快取能夠很好的實現這個需求。
將applicationContext-shiro.xml檔案新增快取
<bean id="chainDefinitionSectionMetaSource">
<property name="filterChainDefinitions" >
<value>
/login = authc
/logout = logout
/resource/** = anon
</value>
</property>
</bean>
<bean id="shiroSecurityFilter">
<property name="securityManager" ref="securityManager" />
<property name="loginUrl" value="/login.jsp" />
<property name="successUrl" value="/index.jsp" />
<property name="unauthorizedUrl" value="/unauthorized.jsp" />
<!-- shiro連線約束配置,在這裡使用自定義的動態獲取資源類 -->
<property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" />
</bean>
<bean id="shiroDataBaseRealm">
<!-- MD5加密 -->
<property name="credentialsMatcher">
<bean>
<property name="hashAlgorithmName" value="MD5" />
</bean>
</property>
<property name="authorizationCacheName" value="shiroAuthorizationCache" />
</bean>
<bean id="securityManager">
<property name="realm" ref="shiroDataBaseRealm" />
<property name="cacheManager" ref="cacheManager" />
</bean>
<bean id="lifecycleBeanPostProcessor"/>
<!-- 使用快取annotation 配置 --/>
<cache:annotation-driven cache-manager="ehCacheManager" />
<!-- spring對ehcache的快取工廠支援 -->
<bean id="ehCacheManagerFactory">
<property name="configLocation" value="classpath:ehcache.xml" />
<property name="shared" value="false" />
</bean>
<!-- spring對ehcache的快取管理 -->
<bean id="ehCacheManager">
<property name="cacheManager" ref="ehCacheManagerFactory"></property>
</bean>
<!-- shiro對ehcache的快取管理直接使用spring的快取工廠 -->
<bean id="cacheManager">
<property name="cacheManager" ref="ehCacheManagerFactory" />
</bean>
ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--
maxElementsInMemory為快取物件的最大數目,
eternal設定是否永遠不過期,
timeToIdleSeconds物件處於空閒狀態的最多秒數,
timeToLiveSeconds物件處於快取狀態的最多秒數
-->
<diskStore path="java.io.tmpdir"/>
<cache name="shiroAuthorizationCache" maxElementsInMemory="300" eternal="false" timeToLiveSeconds="600" overflowToDisk="false"/>
</ehcache>
public class UserDao extends BasicHibernateDao<User, String> {
public User getUserByUsername(String username) {
return findUniqueByProperty("username", username);
}
@CacheEvict(value="shiroAuthorizationCache",allEntries=true)
public void saveUser(User entity) {
save(entity);
}
}
@Repository
public class ResourceDao extends BasicHibernateDao<Resource, String> {
@CacheEvict(value="shiroAuthorizationCache",allEntries=true)
public void saveResource(Resource entity) {
save(entity);
}
@CacheEvict(value="shiroAuthorizationCache",allEntries=true)
public void deleteResource(Resource entity) {
delete(entity);
}
}
當userDao或者reaourceDao呼叫了相應帶有快取註解的方法,都會將AuthorizingRealm類中的快取去掉。那麼就意味著 shiro在使用者訪問連結時要重新授權一次。
整個apache shiro的使用,vcs admin專案和vcs admin jpa中都會有例子。可以參考showcase/vcs_admin或者showcase/vcs_admin_jpa專案中的例子去理解。。
相關推薦
apache shiro與spring整合、動態filterChainDefinitions、以及認證、授權
apache shiro是一個安全認證框架,和spring security相比,在於他使用了比較簡潔易懂的認證和授權方式。其提供的native-session(即把使用者認證後的授權資訊儲存在其自身提供Session中)機制,這樣就可以和HttpSession、EJB
javaEE Mybatis,Mybatis與Spring整合之動態代理方式(推薦),自動建立Dao層實現類
src/applicationContext.xml(Spring核心配置檔案): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.or
shiro與spring整合的配置(第一種)
web.xml的配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://j
quartz與spring整合實現動態任務增刪改查
本文最初是為了實現定時推送功能,為推送設定一個時間,到時間後推送到雲巴伺服器。 所以這裡會用到quartz定時任務排程,而且我新增一個定時推送,同時就要新增一個定時任務。所以這裡也涉及到了任務的增刪改查。 以下是程式碼實現: 1、定時任務管理類,實現對任務的CURD pa
web專案shiro與spring整合 maven依賴及web配置詳解
依賴shiro的maven座標: <dependency> <groupId>org.apache.shiro</groupId> <artifa
Shiro入門-shiro與spring整合
引入jar <!-- shiro核心jar --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shi
shiro與spring整合中shiroFilter配置引數loginUrl及unauthorizedUrl含義小記
shiro與spring整合的時候一般會使用shiro的Filter來代理網站的Filter。網上有很多關於配置shiroFilter的例子,但是感覺都沒有給出引數的具體含義。在此小小的記錄一下。 shiroFilter的xml配置如下: &l
008-shiro與spring web項目整合【二】認證、授權、session管理
添加 ner != efi ebs ref private date err 一、認證 1、添加憑證匹配器 添加憑證匹配器實現md5加密校驗。 修改applicationContext-shiro.xml: <!-- realm -->
010-shiro與spring web項目整合【四】緩存Ehcache、Redis
principal eba view event ica inter element edi value 一、Ehcache shiro每次授權都會通過realm獲取權限信息,為了提高訪問速度需要添加緩存,第一次從realm中讀取權限數據,之後不再讀取,這裏Shiro和E
Apache shiro的簡單介紹與使用(與spring整合使用)
簡單介紹 ace .cn album spring 整合 amp 介紹 pri http://pic.cnhubei.com/space.php?uid=1774&do=album&id=1343605http://pic.cnhubei.com/space
Apache Camel 與 Spring Boot 整合,通過FTP定時採集、處理檔案
1、概要: 本專案主要是通過在Spring平臺上配置Camel、FTP,實現定時從FTP伺服器下載檔案到本地、解析檔案、存入資料庫等功能。 2、搭建空專案: Spring Boot有幾種自動生成空專案的機制:CLI、Spring tool suite、網站Spring Initializr,我
Mybatis(3、延遲載入、查詢快取、與ehcache整合、逆向工程、與spring整合)
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/www1056481167/article/details/70597788 延遲載入 延遲載入:先從單表查詢、需要時再從關聯表去關聯查詢,大大提高 資料庫效能,因為
MongoDB自動增長id實現、自定義函式呼叫、與Spring整合
昨天同事問實現MongoDB主鍵自動增長有什麼好的辦法,雖然喜歡MongoDB客戶端驅動程式自動生成的id,不過還是來測試了一下,僅僅是測試哦 廢話少說 1、建立專案,新增依賴 <dependencies> <dependen
Activiti環境配置、專案搭建、與Spring整合、簡單示例
概念 示例專案下載 環境搭建: FBI WARNING 兩個視訊,螢幕錄影專家錄製,非病毒,本站願意承擔責任,下載完檔案請先核對MD5。 1.Eclipse配置Tomcat和部署WEB應用.exe(MD5:81c1dfb994ff5b2094ce
JAVAWEB開發之mybatis詳解(二)——高階對映、查詢快取、mybatis與Spring整合以及懶載入的配置和逆向工程
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "ht
apache mina 學習(十四)-----與spring整合
mina與spring整合的主要問題就是mina中一些bean的配置需要spring的ioc,我們首先看一個簡單的服務端程式碼: public void initialize() throws IOException { // Create an Acceptor N
Hibernate--根據實體類獲得表名、主鍵名、欄位名(與Spring整合)(二)
在上一篇中,我們建立了HibernateConfigurationUtil類,可以通過它來獲得實體類對應的表名、列名等相關資訊,本篇我們會就藉助於HibernateConfigurationUtil類以及Java反射,來實現一個JDBCUitl工具類,實現類似於Hibern
Mybatis中Mapper代理形式開發與spring整合
can sna 修改 jar xid oca pac user cal 1.導入jar包 2.分包 cogfig:存放配置文件 mapper:存放映射與接口 pojo:存放實體類 test:測試代碼 3.編寫配置文件 SqlMapConfig.xml <?
Shiro與Spring集成
open ons 過濾 周期 .cn def 訪問 tex bean 1.新建web工程,加入 Spring 和 Shiro 的 jar 包 2.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web
mybatis與spring整合
fig bsp 切面 業務 開啟 per cep ret ever 1.Spring同mybatis的整合步驟? DataSource(主要提供的數據源) 整合SqlSe