這段時間,工做閒了下來,接觸了Spring Security,對於我一個基礎不好的人來講,無疑是個挑戰啊。html
通過一段時間的摸索,終於有了點眉目,在這裏,要特別感謝http://blog.csdn.net/u012367513/article/details/38866465 二當家的 博文對個人幫助。個人代碼也是在他的基礎上整理而來,只是增長了本身的一些看法。 再次感謝他的幫助。java
個人基礎非常薄弱,最然 二當家的 博文中已經講解的非常清楚,可是我仍是但願本身能過上一遍。web
本文適宜讀者: Spring 基礎薄弱,和我同樣,配置文件大白的人。 但願高手們都留下寶貴的意見。spring
廢話很少說,開碼!安全
我但願看完這篇文章後咱們能解決一下問題:app
首先,Spring Security 究竟是用來幹嗎的?jsp
再次,Security 是怎麼工做的?ide
最後,咱們爲何要用Security。this
--------------------------------------------------------------------------url
我先大致上說下security的工做流程:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>SpringSecurityDemo</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 加載Spring security XML 配置文件 爲何要配置這個文件?!!! 由於百度! security是什麼? 就是依靠一個特殊的過濾器(DelegatingFilterProxy,他是幹嗎的?!), 依靠他來委託一個在spring上下文的一個bean完成工做。 而這個Bean,說白了就是一個過濾器。 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/securityConfig.xml </param-value> </context-param> <!-- Spring 容器監聽,這尼瑪又是個什麼東東? listener. 哦 ,是個監聽器啊。 看看他的源碼 public void contextInitialized(ServletContextEvent event) { contextLoader = createContextLoader(); if(contextLoader == null) contextLoader = this; contextLoader.initWebApplicationContext(event.getServletContext()); } 瞅見了麼,就特麼是來加載上面配置的securityConfig.xml文件 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 看吧,這就是看個特殊的過濾器,撒手掌櫃了,他到底幹什麼了,爲何咱們要配置他? 咱們來扒開他的皮,瞅一瞅吧, //這是他的doFilter方法 public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException { Filter delegateToUse = null; synchronized(delegateMonitor) { if(_flddelegate == null) //若是bean爲空 { WebApplicationContext wac = findWebApplicationContext(); //給我拿來配置文件 if(wac == null) //蝦米?配置文件爲空?! 媽的,給老子拋異常! 你給老子監聽的配置吃啦?! throw new IllegalStateException("No WebApplicationContext found: no ContextLoaderListener registered?"); _flddelegate = initDelegate(wac); //這是什麼?猜都出來了,在配置文件裏召喚bean(感情配置文件就是人才市場,掌櫃的招小工了..) } delegateToUse = _flddelegate; //小工招用完了,就你啦...可憐,三方呢? 工資了? 你他媽的剛畢業吧.... } invokeDelegate(delegateToUse, request, response, filterChain); //照完小工幹嗎去? 幹活唄!,給老子幹! 幹! } //這是initDeletegate protected Filter initDelegate(WebApplicationContext wac) throws ServletException { Filter delegate = (Filter)wac.getBean(getTargetBeanName(), javax/servlet/Filter); if(isTargetFilterLifecycle()) delegate.init(getFilterConfig()); return delegate; } //這是invokeDelegate protected void invokeDelegate(Filter delegate, ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException { delegate.doFilter(request, response, filterChain); } 咦? 不對呀,小工要造反了怎麼辦? 你無良老闆就啥都不幹? 對,我就是啥都不幹? 老子就是這麼任性。 老子把大家召喚來,就是給了大家生存的價值 (DelegatingFilterProxy作的事情是代理Filter的方法,從application context裏得到bean。 這讓bean能夠得到spring web application context的生命週期支持,使配置較爲輕便。) 大家就滿足吧! 唉...初來乍到,誰沒有被老闆坑過.... --> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>