spring的一些小心得2

Felix 2021年08月06日 48次浏览

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 的保存和获取.