五合一小程序網(wǎng)站推廣網(wǎng)站排名
大家好,我叫小帥今天我們來繼續(xù)Spring Boot的內(nèi)容。
文章目錄
- 1. 獲取JSON對(duì)象
- 2. 獲取URL中參數(shù)@PathVariable
- 3.上傳?件@RequestPart
- 3. 獲取Cookie/Session
- 3.1 獲取和設(shè)置Cookie
- 3.1.1傳統(tǒng)獲取Cookie
- 3.1.2簡(jiǎn)潔獲取Cookie
- 3. 2 獲取和存儲(chǔ)Session
- 3.2.1獲取Session(1)使? HttpServletRequest
- 3.2.2簡(jiǎn)潔獲取 Session(1) @SessionAttribute(value = "username",required = false)
- 3.2.2簡(jiǎn)潔獲取 Session(2)
- 4. 獲取Header
- 4.1傳統(tǒng)獲取 header
- 4.2簡(jiǎn)潔獲取 Header (@RequestHeader("User-Agent") 里面參數(shù)是header里面的鍵值對(duì)的Key)
1. 獲取JSON對(duì)象
接收J(rèn)SON對(duì)象, 需要使? @RequestBody 注解,作用是這個(gè) 方法或者類是返回正文
但是@RestController = @RequestBody + @Controller所以我們使用@RestController就可以。
代碼:
@RestController
@RequestMapping("/test")
public class test {//produces參數(shù)是返回JSON字符串@RequestMapping(value = "/getUser", produces = "application/json")public String getUser() {User user = new User("111111", "111111");return user.toString();//字符串的方式返回}//consumes參數(shù)是傳過來JSON字符串(可以是格式化的JOSN字符串)@RequestMapping(value = "/setUser",produces = "application/json", consumes = "application/json")public String setUser(String name, String password) {User user = new User(name, password);return user.toString();}
}
后端正確接收了
通過Fiddler觀察?下請(qǐng)求參數(shù)效果:
get:
post:
2. 獲取URL中參數(shù)@PathVariable
path variable: 路徑變量
和字?表達(dá)的意思?樣, 這個(gè)注解主要作?在請(qǐng)求URL路徑上的數(shù)據(jù)綁定
默認(rèn)傳遞參數(shù)寫在URL上,SpringMVC就可以獲取到.
后端實(shí)現(xiàn)代碼:
@RequestMapping("/get/{name}/{password}")public String method8(@PathVariable String name,@PathVariable("name") String password){return "解析路徑:name:" + name + ",password:" + password;}
是postman發(fā)送請(qǐng)求:
3.上傳?件@RequestPart
后端代碼實(shí)現(xiàn):
@RequestMapping("getFile")public String pushFile(@RequestPart("file") MultipartFile file) throws IOException {//獲取文件名稱String fileName = file.getOriginalFilename();return fileName;}
效果:
上傳成功了。
3. 獲取Cookie/Session
理解cookie
HTTP 協(xié)議??是屬于 “?狀態(tài)” 協(xié)議.
“?狀態(tài)” 的含義指的是:
默認(rèn)情況下 HTTP 協(xié)議的客?端和服務(wù)器之間的這次通信, 和下次通信之間沒有直接的聯(lián)系.
但是實(shí)際開發(fā)中, 我們很多時(shí)候是需要知道請(qǐng)求之間的關(guān)聯(lián)關(guān)系的.
例如登陸?站成功后, 第?次訪問的時(shí)候服務(wù)器就能知道該請(qǐng)求是否是已經(jīng)登陸過了.
上述圖中的 “令牌” 通常就存儲(chǔ)在 Cookie 字段中。
比如說,我現(xiàn)在訪問了csdn,現(xiàn)在我又退了出去,這個(gè)時(shí)候?yàn)g覽器就自動(dòng)保存了一個(gè)身份標(biāo)識(shí)。
理解Session
我們先來了解?下什么是會(huì)話,就是對(duì)話的意思。
會(huì)話是?個(gè)客?與服務(wù)器之間的不中斷的請(qǐng)求響應(yīng). 對(duì)客?的每個(gè)請(qǐng)求,服務(wù)器能夠識(shí)別出請(qǐng)求來?于同?個(gè)客?. 當(dāng)?個(gè)未知的客?向Web應(yīng)?程序發(fā)送第?個(gè)請(qǐng)求時(shí)就開始了?個(gè)會(huì)話.當(dāng)客?明確結(jié)束會(huì)話或服務(wù)器在?個(gè)時(shí)限內(nèi)沒有接受到客?的任何請(qǐng)求時(shí),會(huì)話就結(jié)束了.
Session是服務(wù)器為了保存??信息?創(chuàng)建的?個(gè)特殊的對(duì)象.
服務(wù)器需要清楚的區(qū)分每個(gè)請(qǐng)求是屬于哪個(gè)??, 也就是屬于哪個(gè)會(huì)話, 就需要在服務(wù)器這邊記錄每個(gè)會(huì)話以及與??的信息的對(duì)應(yīng)關(guān)系.
Session的本質(zhì)就是?個(gè) “哈希表”, 存儲(chǔ)了?些鍵值對(duì)結(jié)構(gòu). Key 就是SessionID, Value 就是??信息(??信息可以根據(jù)需求靈活設(shè)計(jì)).
- 當(dāng)??登陸的時(shí)候, 服務(wù)器在 Session 中新增?個(gè)新記錄, 并把 sessionId返回給客?端. (通過HTTP 響應(yīng)中的 Set-Cookie 字段返回).
- 客?端后續(xù)再給服務(wù)器發(fā)送請(qǐng)求的時(shí)候, 需要在請(qǐng)求中帶上 sessionId. (通過 HTTP 請(qǐng)求中的Cookie 字段帶上).
- 服務(wù)器收到請(qǐng)求之后, 根據(jù)請(qǐng)求中的 sessionId在 Session 信息中獲取到對(duì)應(yīng)的??信息, 再進(jìn)?后續(xù)操作.找不到則重新創(chuàng)建Session, 并把SessionID返回。
Cookie 和 Session 的區(qū)別
- Cookie 是客?端保存??信息的?種機(jī)制. Session 是服務(wù)器端保存??信息的?種機(jī)制.
- Cookie 和 Session之間主要是通過 SessionId 關(guān)聯(lián)起來的, SessionId 是 Cookie 和 Session 之間的橋梁。
- cookie 和 Session 經(jīng)常會(huì)在?起配合使?. 但是不是必須配合。
- 完全可以? Cookie 來保存?些數(shù)據(jù)在客?端. 這些數(shù)據(jù)不?定是???份信息, 也不?定是SessionId。
- Session 中的sessionId 也不需要?得通過 Cookie/Set-Cookie 傳遞, ?如通過URL傳遞.
3.1 獲取和設(shè)置Cookie
3.1.1傳統(tǒng)獲取Cookie
代碼:
@RequestMapping("/getCookie")public String method10(HttpServletRequest request, HttpServletResponse response){// 獲取所有 cookie 信息Cookie[] cookies = request.getCookies();//打印Cookie信息StringBuilder builder = new StringBuilder();if (cookies!=null){for (Cookie ck:cookies) {builder.append(ck.getName()+":"+ck.getValue());}}return "Cookie信息:"+builder;}
解釋:
Spring MVC是基于 Servlet API 構(gòu)建的原始 Web 框架, 也是在Servlet的基礎(chǔ)上實(shí)現(xiàn)的
HttpServletRequest , HttpServletResponse 是Servlet提供的兩個(gè)類, 是Spring MVC?法的內(nèi)置對(duì)象. 需要時(shí)直接在?法中添加聲明即可.
HttpServletRequest對(duì)象代表客?端的請(qǐng)求, 當(dāng)客?端通過HTTP協(xié)議訪問服務(wù)器時(shí),HTTP請(qǐng)求頭中的所有信息都封裝在這個(gè)對(duì)象中,通過這個(gè)對(duì)象提供的?法,可以獲得客?端請(qǐng)求的所有信息.
HttpServletResponse對(duì)象代表服務(wù)器的響應(yīng). HTTP響應(yīng)的信息都在這個(gè)對(duì)象中, ?如向客?
端發(fā)送的數(shù)據(jù), 響應(yīng)頭, 狀態(tài)碼等. 通過這個(gè)對(duì)象提供的?法, 可以獲得服務(wù)器響應(yīng)的所有內(nèi)容
看看效果:
此時(shí)沒有設(shè)置Cookie, 通過瀏覽器訪問: http://127.0.0.1:8080/test/getCookie,得到Cookie為null
我們?cè)O(shè)置?下Cookie的值,鍵盤f12
再次訪問:
從這個(gè)例?中, 也可以看出Cookie是可以偽造的, 也就是不安全的, 所以使?Cookie時(shí), 后端需要進(jìn)?Cookie校驗(yàn)
3.1.2簡(jiǎn)潔獲取Cookie
@RequestMapping("/getCookie2")public String cookie(@CookieValue("cdm") String cdm) {return "Cookie:" + cdm;}
效果:
3. 2 獲取和存儲(chǔ)Session
Session是服務(wù)器端的機(jī)制, 我們需要先存儲(chǔ), 才能再獲取
Session 也是基于HttpServletRequest 來存儲(chǔ)和獲取的
Session的存儲(chǔ)
代碼:
//存儲(chǔ)Session@RequestMapping("/setSession")public String setSession(HttpServletRequest request) {// 獲取Session對(duì)象HttpSession session = request.getSession();if (session != null) {session.setAttribute("username", "java");}return "session 存儲(chǔ)成功";}
解釋:
void setAttribute(String name, Object value): 使?指定的名稱綁定?個(gè)對(duì)象到該 session 會(huì)話
效果:
獲取Session
獲取Session有兩種?式:
- HttpSession getSession(boolean create);
- HttpSession getSession();
HttpSession getSession(boolean create): 參數(shù)如果為 true, 則當(dāng)不存在會(huì)話時(shí)新建會(huì)話; 參數(shù)如果為 false, 則當(dāng)不存在會(huì)話時(shí)返回 null
HttpSession getSession(): 和getSession(true) 含義?樣, 默認(rèn)值為true
3.2.1獲取Session(1)使? HttpServletRequest
//存儲(chǔ)Session@RequestMapping("/setSession")public String setSession(HttpServletRequest request) {// 獲取Session對(duì)象HttpSession session = request.getSession();if (session != null) {session.setAttribute("username", "java");}return "session 存儲(chǔ)成功";}//獲取session@RequestMapping("/getSession")public String session(HttpServletRequest request) {// 如果 session 不存在, 不會(huì)?動(dòng)創(chuàng)建HttpSession session = request.getSession(false);String username = null;if (session != null && session.getAttribute("username") != null) {username = (String) session.getAttribute("username");}return "username:" + username;}
Object getAttribute(String name): 返回在該 session 會(huì)話中具有指定名稱的對(duì)象,如果沒有指定名
稱的對(duì)象,則返回 null.
HttpServletRequest request 如果 session 不存在, 不會(huì)?動(dòng)創(chuàng)建
效果:
3.2.2簡(jiǎn)潔獲取 Session(1) @SessionAttribute(value = “username”,required = false)
代碼:
//獲取session@RequestMapping("/getSession2")public String getSession2(@SessionAttribute(value = "username",required = false)String username) {//獲取到session字符串,直接返回return "username:" + username;}
解釋:value是:獲取username的值,required是:沒有Session對(duì)象時(shí),不創(chuàng)建,返回null
效果:
3.2.2簡(jiǎn)潔獲取 Session(2)
代碼:
//獲取session@RequestMapping("/getSession3")public String getSession3(HttpSession session) {//獲取到session對(duì)象String username = (String)session.getAttribute("username");return "username:" + username;}
解釋:HttpSession session獲取到session對(duì)象
效果:
4. 獲取Header
4.1傳統(tǒng)獲取 header
獲取Header也是從 HttpServletRequest 中獲取
效果:
通過Fiddler觀察, 獲取的User-Agent是否正確
4.2簡(jiǎn)潔獲取 Header (@RequestHeader(“User-Agent”) 里面參數(shù)是header里面的鍵值對(duì)的Key)
比如說獲取User-Agent:
代碼:
//獲取header@RequestMapping("/getUserAgent2")public String getUserAgent2(@RequestHeader("User-Agent") String userAgent) {return "User-Agent" + userAgent;}
再比如獲取Host
好了,今天就到在這里,感謝觀看。