Spring實戰筆記:Web中的Spring
1.Spring MVC中用戶請求處理
上圖展示了請求使用Spring MVC所經歷的所有站點。
1:在請求離開瀏覽器時,會帶有所有請求內容的信息,至少會包含請求的URL。
請求通過Spring的DispatcherServlet前端控制器將請求發送給Spring MVC控制器(Controller)。
2:DispatcherServlet會查詢一個或多個處理器映射(handler mapping)來確定請求的下一站在哪裏。
處理器映射會根據請求所攜帶的URL信息來進行決策。
3:一旦選擇了合適的控制器(Controller),DispatcherServlet會將請求發送給選中的控制器。
到了控制器,請求會卸下提交的信息並等待控制器處理這些信息。
4:控制器處理完之後會產生一些信息即模型(model)。控制器將模型數據打包,並標示出用於渲染輸出的視圖名。然後將請求連同模型和視圖名發送回DispatcherServlet。
5:DispatcherServlet會使用視圖解析器(view resolve)來將邏輯視圖名匹配為一個特定的視圖實現。
6:視圖的實現,交付模型數據。
7:視圖將使用模型數據渲染輸出,這個輸出會通過響應對象傳遞給客戶端。
2.基本控制器
@Controller:聲明為一個控制器;
@RequestMapping:聲明他們所要處理的請求:
@RequestMapping(vaule="/", method=GET):當收到對"/"的HTTP GET請求時,就會調用home()該註解的方法。
@RequestParam:接收請求輸入,將請求作為查詢參數;
@PathVariable:使用占位符,將請求作為路徑的一部分;
兩者不同點:使用@RequestParam時,URL是這樣的:http://host:port/path?參數名=參數值
使用@PathVariable時,URL是這樣的:http://host:port/path/參數值
@RequestMapping(value="/user",method = RequestMethod.GET) public @ResponseBody User printUser(@RequestParam(value = "id", required = false, defaultValue = "0") int id) { User user = new User(); user = userService.getUserById(id); return user; } @RequestMapping(value="/user/{id:\\d+}",method = RequestMethod.GET) public @ResponseBody User printUser2(@PathVariable int id) { User user = new User(); user = userService.getUserById(id); return user; }
@Valid:告知Spring,需要確保這個對象滿足校驗限制。
Java校驗API所提供的校驗註解:
註解 | 描述 |
@AssertFalse | 所註解的元素必須是Boolean類型,並且值為false |
@AssertTrue | 所註解的元素必須是Boolean類型,並且值為true |
@DecimalMax | 所註解的元素必須是數字,並且值要小於或等於給定的BigDecimalString值 |
@DecimalMin | 所註解的元素必須是數字,並且值要大於或等於給定的BigDecimalString |
@Digits | 所註解的元素必須是數字,並且它的值必須有指定的位數 |
@Future | 所註解的元素的值必須是一個將來的日期 |
@Max | 所註解的元素必須是數字,並且它的值要大於或等於給定的值 |
@Min | 所註解的元素必須是數字,並且它的值要小於或等於給定的值 |
@NotNull | 所註解元素的值必須不能為null |
@Null | 所註解元素的值必須為null |
@Past | 所註解的元素的值必須是一個已過去的日期 |
@Parttern | 所註解的元素的值必須匹配給定的正則表達式 |
@Size | 所註解的元素的值必須是String、集合或數組,並且它的長度要符合給定的範圍 |
@Controller @RequestMapping(DetailController.VIEW_PREFIX) public class DetailController extends AjaxBaseController { public static final String VIEW_PREFIX = "/ajax/detail"; public static final String GET_DETAIL = "/getDetailList"; public static final String FIND = "/find"; @Autowired private JobDetailService jobDetailService; /** * 查找 */ @ResponseBody @RequestMapping(value = FIND, method = RequestMethod.GET) public AjaxPackVo<DetailVo> find(@RequestParam("id") Long id){ AjaxPackVo<DetailVo> packVo = new AjaxPackVo<>(); DetailVo dr = jobDetailService.findVo(id); packVo.setVo(dr); return packVo; } @ResponseBody @RequestMapping(value = GET_DETAIL, method = RequestMethod.POST) public AjaxPackVo<DetailVo> getDetail(@RequestBody DetailSo detailSo){ AjaxPackVo<DetailVo> detailVoAjaxPackVo = new AjaxPackVo<>(); PageList<DetailVo> detailVoPageList = jobDetailService.getPageList(detailSo); detailVoAjaxPackVo.setPageList(detailVoPageList); return detailVoAjaxPackVo; }
@ResponseStatus:異常上添加註解,從而將其映射為某一個HTTP狀態碼;
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Spittle Not Found") //將異常映射為HTTP狀態404
@ExceptionHandler:方法上添加註解,使其用來處理異常;
二.保護Web應用
使用Spring Security為Web應用提供安全性,保護應用中的信息。
Spring Security提供了完整的安全性解決方案,能夠在Web請求級別和方法調用級別處理身份認證和授權。充分利用了依賴註入和面向切面技術。
Spring Security從兩個角度解決安全性問題:
(1)使用Servlet規範中的Filter保護Web請求並限制URL級別的訪問;
(2)Spring Security還能夠使用Spring AOP保護方法調用--借助於對象代理和使用通知。能夠確保只有具備適當權限的用戶才能訪問安全保護的方法。
Spring Security被分成11個模塊:
模塊 | 描述 |
ACL | 支持通過訪問控制列表(ACL)為域對象提供安全性 |
切面(Aspects) | 一個很小的模塊,當使用Spring Security註解時,會使用基於AspectJ的切面,而不是使用標準的Spring AOP |
CAS客戶端 | 提供與Jasig的中心認證服務(Central Authentication Service,CAS)進行集成的功能 |
配置(Configuration) | 包含通過XML和Java配置Spring Security的功能支持 |
核心(Core) | 提供Spring Security基本庫 |
加密(Cryptography) | 提供了加密和密碼編碼的功能 |
LDAP | 支持基於LDAP進行認證 |
OpenID | 支持使用OpenID進行集中式認證 |
Remoting | 提供了對Spring Remoting的支持 |
標簽庫(Tag Library) | Spring Security的JSP標簽庫 |
Web | 提供了Spring Security基於Filter的Web安全性支持 |
@EnableWebSecurity:該註解將會啟用Web安全功能,它必須配置在一個實現了WebSecurityConfigure的bean中;
@EnableWebMvcSecurity:如果你的應用正好是使用Spring MVC開發的,那麽就應該考慮使用該註解代替@EnableWebSecurity;
@Configuration @EnableWebMvcSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter{}
Spring實戰筆記:Web中的Spring