spring 的作用主要还是集中在 IOC 和 AOP 俩大功能上做出的延申和扩展.
本人日常的工作中主要以 web 开发为主, 所以一下内容就以 web 微服务的开发为主线.
Java Web 的工作流程
(还是懒得画图)
client (web page) -> | web Application 容器 |
-> listening -> filter -> servlet | service | dao
-> filter -> listening -> client (web page)
servlet 中的流程
init -> service (doGet | doPost) -> destory
一般我们会把业务代码放在 servlet 里面去实现, 这里通常就会用到 SpringMVC 模式
SpringMVC 的工作流程(一般)
(还是没有图)
进DispatcherServlet -> 拦截器(prehandle) -> request mapping
-> controller | service | dao -> 拦截器(posthandle)
-> 渲染器(数据渲染, eg: freemarker,thymeleaf)
-> 拦截器(aftercompletion) -> 出
Spring Security 的默认工作流程
(...)
request -> filter1 -> MVC -> filter2 -> response
默认应该是使用session来保存用户信息的, 所以
filter1 中
获取 session -> 从 session 中获取 securityContent -> 存入 SecurityContentHolder
SecurityContentHolder 以 ThreadLocal 实现, 保证当前线程中任意一处都可以获取当前用户信息.
filter2 中
从 SecurityContentHolder 获取最新的 securityContent -> 存入 session
Why
web app中同一线程会处理不同 user 的访问session
实际使用
通常情况, 因为 session 是保存在服务器上的, 不能满足大数量访问和分布式的需求, 所以都是 disable session, 使用 token 和缓存服务(ehcache | redis 等)来实现对 securityContent 的保存和获取.