posted @ 2010-02-22 16:59 長城 閱讀(742) | 評論 (0) | 編輯 收藏
posted @ 2010-02-20 23:56 長城 閱讀(577) | 評論 (0) | 編輯 收藏
posted @ 2010-02-09 01:25 長城 閱讀(486) | 評論 (0) | 編輯 收藏
posted @ 2010-02-08 00:30 長城 閱讀(384) | 評論 (0) | 編輯 收藏
spring-security最后一天,今天的主要內容是將需要指定權限才可以訪問的資源放到數據庫中,脫離applicationContext.xml配置文件。然后我們將近兩天學習的srping-security整合到教育辦公系統中。
我們繼續昨天的內容,將資源文件信息保存到數據庫中。
1.applicationContext.xml
將昨天applicationContext.xml“配置SpringSecurity的http安全服務”部分的內容替換為:
<sec:http auto-config="true" session-fixation-protection="none" /> <bean class="org.springframework.security.intercept.web.FilterSecurityInterceptor" autowire="byType"> <sec:custom-filter before="AUTHENTICATION_PROCESSING_FILTER"/> <property name="objectDefinitionSource" ref="objectDefinitionSource"/> </bean> |
這里的objectDefinitionSource是下邊的類,cutom-filter是在調用AUTHENTICATION_PROCESSING_FILTER過濾器之前調用FilterSecurityInterceptor。
2.添加數據表
resc表與role表是多對多關系。
1).resc
2).resc_role
3.相關類
要讓spring-security可以從數據庫中獲取相關資源信息,我們必須編寫一個實現FactoryBean接口的類。
package cn.itcast.cc.spring.security; import java.util.LinkedHashMap; import java.util.Map; import javax.annotation.Resource; import org.springframework.beans.factory.FactoryBean; import org.springframework.security.ConfigAttributeDefinition; import org.springframework.security.ConfigAttributeEditor; import org.springframework.security.intercept.web.DefaultFilterInvocationDefinitionSource; import org.springframework.security.intercept.web.RequestKey; import org.springframework.security.util.AntUrlPathMatcher; import org.springframework.security.util.UrlMatcher; import org.springframework.stereotype.Component; @Component("objectDefinitionSource") public class DefaultFilterInvocationDefinitionSourceImpl implements FactoryBean { @Resource ResourceDetailsService resourceDetailsService; private UrlMatcher getUrlMatcher() { UrlMatcher urlMatcher = new AntUrlPathMatcher(); return urlMatcher; } @Override public Object getObject() throws Exception { UrlMatcher urlMatcher = this.getUrlMatcher(); // 獲取數據Map Map<String, String> srcMap = resourceDetailsService.buildRequestMap(); LinkedHashMap<RequestKey, Object> requestMap = new LinkedHashMap<RequestKey, Object>(); ConfigAttributeEditor editor = new ConfigAttributeEditor(); // 轉換數據Map for (Map.Entry<String, String> entry : srcMap.entrySet()) { String url = entry.getKey(); String roles = entry.getValue(); if (roles != null) { editor.setAsText(roles); requestMap.put(new RequestKey(url), editor.getValue()); } else { requestMap.put(new RequestKey(url), ConfigAttributeDefinition.NO_ATTRIBUTES); } } // 生成并返回對象 return new DefaultFilterInvocationDefinitionSource(urlMatcher, requestMap); } @Override public Class getObjectType() { return null; } @Override public boolean isSingleton() { return false; } } |
其中ResourceDetailsService接口的實現類如下:
package cn.itcast.cc.spring.security; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; import org.springframework.stereotype.Component; @Component("userDetailsService") public class ResourceDetailsServiceImpl implements ResourceDetailsService { @Resource private SimpleJdbcTemplate jdbcTemplate; @Override public Map<String, String> buildRequestMap() { // 注意:這里需要使用左外連接查詢,是因為有些頁面沒有指定role。 // 即,任何權限都不可以訪問的頁面! String sql = "SELECT res_string as url,r.name as role " + "FROME resc LEFT JOIN resc_role rr ON rr.resc_id = resc.id " + "LEFT JOIN role r ON rr.role_id = r.id"; List<Map<String, Object>> results = this.jdbcTemplate.queryForList(sql); Map<String, String> srcMap = new HashMap<String, String>(); // 將查詢后的數據拼接并放入到Map中 for(Map<String,Object> val:results){ String url = (String) val.get("url"); String role = (String) val.get("role"); if(srcMap.containsKey(url)){ role = srcMap.get(url) + "," + role; } srcMap.put(url, role); } return srcMap; } } |
Spring-security還為我們提供了其他實用的輔助功能,具體的google一下吧!
posted @ 2010-02-04 23:18 長城 閱讀(407) | 評論 (0) | 編輯 收藏
posted @ 2010-02-03 23:52 長城 閱讀(2624) | 評論 (0) | 編輯 收藏
今天重點內容是AJAX技術在教育辦公系統中V層的應用,實現的功能有:AJAX分頁查詢、AJAX刪除、AJAX修改。
還記得學習AJAX時使用JQuery向服務器發送請求,并在回調函數中將返回的數據動態插入到DOM的某處嗎?Yes,我們今天主要就是玩這個技術。感覺沒什么好總結的,就是疊代碼、串代碼,沒什么新鮮東西。
但我想說的是看著佟佟搞著代碼,操作著頁面多少有些惡心。因為我以前是做桌面的組件沒這么麻煩,也沒這么靈活,但目標都是一樣的——顯示數據,提供給用戶查詢或編輯。所以我要思考一個問題,將分頁、DAO和AJAX操作封裝成像桌面軟件的組件那樣方便易用,其實已經實現了通用分頁和DAO。關于頁面AJAX并不理想,雖然JQuery有很多插件,但從這兩天的內容來看插件的操作并不理想,有時間我要為此多研究研究。
明天的內容比較有吸引力!哈哈!
posted @ 2010-02-02 21:33 長城 閱讀(292) | 評論 (0) | 編輯 收藏
每次學習項目或者新的知識時,都 不能建立宏觀的了解。中午或者晚上需要回來整理一下,才能對所學的知識有個宏觀的了解(框架的了解)。我們現在做的這個項目,似乎一直學習的是新知識,其實并不是。而是Java的高級用法,它讓我感覺到了Java的強悍。
今日重點通用分頁功能,幾乎每一個像樣些的練習都有分頁功能,它如此重要!今天的分頁功能是通用的,適用于任何WEB應用?;谧蛱斓膬蓚€工具類,今天新添加了一個HibernateDao 擴展了SimpleHibernateDao。這個DAO除了進行常規的CURD操作,還為我們提供了分頁功能和多條件模糊查詢功能,用起來更方便。
下面是查詢分頁信息操作的時序圖:
(如有需要代碼的,可以給我留言!)
項目整體上來說并不難,只要抓住了項目的框架和重點內容。什么才是最難的?自己動手實踐才是最難的。來傳智播客學習已經三個月了,我一直堅持著整理學習日志,想將每天的學習重點都詳細的整理出來,但那根本不現實,因為學習內容太豐富了。我也有動手去實踐那些重點的內容,但效果并不另我滿意。我想我應該拿出更多的時間去實踐,但寫日志占用了我大部分時間!
有失必有得,這都是個人的選擇。我之所以寫日志,是想練習自己對文章框架和知識結構的整理能力。做為一個優秀的程序員,我想這一點是十分重要的。我在這方面得到了一定的提升,別我欣慰。但仍然需要繼續努力!說心里話,我的文章結構還差的很,因為沒有經過細心整理和校驗。
我想我應該靈活的去處理實踐與寫作的時間,當實踐變得重要時就應該拿出大部分時間給實踐。當理論性知識重要時,更應該拿出些時間去寫日志。嗯,就這么做吧!還有一個月20天課程就結束了!
posted @ 2010-01-31 23:55 長城 閱讀(2056) | 評論 (5) | 編輯 收藏
posted @ 2010-01-30 23:11 長城 閱讀(951) | 評論 (0) | 編輯 收藏
posted @ 2010-01-30 00:31 長城 閱讀(624) | 評論 (0) | 編輯 收藏