Spring Security 从配置入门 学习讲解。万恶之源------------web.xml
这段时间,工作闲了下来,接触了Spring Security,对于我一个基础很差的人来说,无疑是个挑战啊。
经过一段时间的摸索,终于有了点眉目,在这里,要特别感谢http://blog.csdn.net/u012367513/article/details/38866465 二当家的 博文对我的帮助。我的代码也是在他的基础上整理而来,只是增加了自己的一些见解。 再次感谢他的帮助。
我的基础很是薄弱,最然 二当家的 博文中已经讲解的很是清楚,但是我还是希望自己能过上一遍。
本文适宜读者: Spring 基础薄弱,和我一样,配置文件大白的人。 希望高手们都留下宝贵的意见。
废话不多说,开码!
我希望看完这篇文章后我们能解决一下问题:
首先,Spring Security 到底是用来干嘛的?
再次,Security 是怎么工作的?
最后,我们为什么要用Security。
--------------------------------------------------------------------------
我先大体上说下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>
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。