欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

springboot補(bǔ)習(xí)系列之幾種scope詳解

目標(biāo)

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的石棉網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

  • 了解HTTP 請(qǐng)求/響應(yīng)頭及常見(jiàn)的屬性;
  • 了解如何使用SpringBoot處理頭信息 ;
  • 了解如何使用SpringBoot處理Cookie ;
  • 學(xué)會(huì)如何對(duì) Session 進(jìn)行讀寫(xiě);
  • 了解如何在不同請(qǐng)求間傳遞 flash參數(shù)

一、Http 頭信息

HTTP 頭(Header)是一種附加內(nèi)容,獨(dú)立于請(qǐng)求內(nèi)容和響應(yīng)內(nèi)容。

HTTP 協(xié)議中的大量特性都通過(guò)Header信息交互來(lái)實(shí)現(xiàn),比如內(nèi)容編解碼、緩存、連接保活等等。

如下面的一個(gè)請(qǐng)求響應(yīng):

Request

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Host: www.cnblogs.com
If-Modified-Since: Wed, 18 Jul 2018 13:47:45 GMT
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36

名稱用途
Accept客戶端期望的MIME 類型列表
Accept-Encoding客戶端期望的編解碼方式
Accept-Language客戶端期望的語(yǔ)言
Cache-Control緩存控制
Connection連接行為(keep-alive)
Host請(qǐng)求訪問(wèn)的主機(jī)
If-Modified-Since緩存控制
Upgrade-Insecure-Requests支持安全加密標(biāo)記
User-Agent用戶代理(客戶端標(biāo)識(shí))

Response

Cache-Control: private, max-age=10
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Wed, 18 Jul 2018 13:47:51 GMT
Expires: Wed, 18 Jul 2018 13:48:01 GMT
Last-Modified: Wed, 18 Jul 2018 13:47:51 GMT
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-UA-Compatible: IE=10

名稱用途
Cache-Control緩存控制
Connection連接行為(keep-alive)
Content-Encoding編解碼方式
Content-Type內(nèi)容類型(MIME)
Date當(dāng)前響應(yīng)時(shí)間
Expires文檔過(guò)期時(shí)間
Last-Modified最后一次更新時(shí)間
Transfer-Encoding傳輸編碼方式
Vary需要刷新的請(qǐng)求Header
X-Frame-OptionsFRAME展示策略(用于同源控制)
X-UA-CompatibleIE兼容屬性

更多的** Http Header **可以從這里找到

二、SpringBoot 處理頭信息

前面的內(nèi)容中已經(jīng)講過(guò)如何完成Controller方法及請(qǐng)求的映射。

在SpringBoot可通過(guò)@RequestHeader注解方式

將請(qǐng)求頭信息映射到參數(shù),如下面的片段:

 @GetMapping("/some")
 @ResponseBody
 public String someHeader(@RequestHeader(value = "Host") String host,
  @RequestHeader(value = "User-Agent") String userAgent,
  @RequestHeader(value = "Cache-Control", required = false) String cacheControl,
  HttpServletResponse response) {

 logger.info("host:{}", host);
 logger.info("User-Agent:{}", userAgent);
 logger.info("Cache-Control:{}", cacheControl);

 // 設(shè)置響應(yīng)頭
 response.setHeader("Cache-Control", "no-cache,no-store,must-revalidate");
 response.setHeader("Pragma", "no-cache");
 response.setDateHeader("Expires", 0);
 return "OK";
 }

而響應(yīng)頭呢,可以通過(guò)聲明一個(gè)HttpServletResponse參數(shù)后,

通過(guò)該對(duì)象進(jìn)行設(shè)置,上面的代碼非常容易理解。

如果希望獲得全部的請(qǐng)求頭,可以使用HttpHeaders對(duì)象:

 @GetMapping("/all")
 public ResponseEntity<Map<String, List<String>>> allHeaders(@RequestHeader HttpHeaders headers) {

 Map<String, List<String>> valueMap = new HashMap<String, List<String>>();
 for (String header : headers.keySet()) {
  valueMap.put(header, headers.get(header));
  logger.info("header[{}]={}", header, headers.get(header));
 }

 // 通過(guò)ResponseEntity設(shè)置響應(yīng)頭
 ResponseEntity<Map<String, List<String>>> entity = ResponseEntity.status(HttpStatus.OK)
  .header("new header", UUID.randomUUID().toString()).body(valueMap);
 return entity;
 }

上面的一段代碼中,可以將所有請(qǐng)求頭信息全部打印出來(lái)。

此外還須注意到,返回響應(yīng)使用了ResponseEntity對(duì)象,這是一個(gè)用于直接表示

響應(yīng)信息頭、內(nèi)容的對(duì)象,利用ResponseEntity可以很方便的設(shè)置響應(yīng)頭信息。

三、Cookie處理

Cookie一開(kāi)始服務(wù)器用于辨別用戶信息而記錄在瀏覽器上的信息。
到目前為止Cookie作為客戶端的存儲(chǔ)有了非常多的應(yīng)用場(chǎng)景。

SpringBoot 提供了@CookieValue以支持參數(shù)方式注入,如下:

 @GetMapping("/some")
 @ResponseBody
 public String someCookie(@CookieValue(value = "counter", defaultValue = "0") int counter,
  HttpServletResponse response) {

 logger.info("counter:{}", counter);
 counter += 1;

 String newValue = counter + "";

 // 設(shè)置Cookie
 response.addCookie(new Cookie("counter", newValue));
 return newValue;
 }

上述代碼中,訪問(wèn)/some 可以獲得一個(gè)counter的cookie值,

且每訪問(wèn)一次則自增一次,這是一個(gè)簡(jiǎn)單的訪問(wèn)計(jì)數(shù)器功能。

如果希望獲取全部的Cookie,可以參考以下代碼:

 @GetMapping("/all")
 public ResponseEntity<Map<String, String>>allCookies(HttpServletRequest request, HttpServletResponse response) {

 Map<String, String> valueMap = new HashMap<String, String>();
 for (Cookie cookie : request.getCookies()) {

  valueMap.put(cookie.getName(), cookie.getValue());
  logger.info("cookie[{}]={}", cookie.getName(), cookie.getValue());
 }

 // 設(shè)置Cookie
 response.addCookie(new Cookie("key", UUID.randomUUID().toString()));
 return new ResponseEntity<Map<String, String>>(valueMap, HttpStatus.OK);
 }

清理全部Cookie

 @GetMapping("/clear")
 public ResponseEntity<Map<String, String>> clearCookies(HttpServletRequest request, HttpServletResponse response) {

 Map<String, String> valueMap = new HashMap<String, String>();
 for (Cookie cookie : request.getCookies()) {

  valueMap.put(cookie.getName(), cookie.getValue());
  logger.info("cookie[{}]={}", cookie.getName(), cookie.getValue());

  // 清除
  cookie.setMaxAge(0);
  response.addCookie(cookie);
 }

 return new ResponseEntity<Map<String, String>>(valueMap, HttpStatus.OK);
 }

Cookie機(jī)制存在一定的缺陷,盡可能在考慮一些風(fēng)險(xiǎn)后使用

安全性無(wú)法保證,除非使用HTTPS;

瀏覽器端只有4KB大小的存儲(chǔ)上限;

四、Session處理

Session 指的是會(huì)話,是建立于Cookie機(jī)制上的一種身份識(shí)別方式。

由于Cookie自身的安全性和容量限制,大多數(shù)應(yīng)用中是在Cookie中存放一個(gè)唯一憑證;

服務(wù)側(cè)通過(guò)憑證再進(jìn)行身份信息的存取,這就是會(huì)話的由來(lái)。

不同的語(yǔ)言、框架采用的實(shí)現(xiàn)方式有些差異,比如JavaEE采用JSESSION_ID,而PHP則是PHPSESSID

Session的交互原理可以參考下面一個(gè)圖:

spring boot補(bǔ)習(xí)系列之幾種scope詳解

Springboot 內(nèi)嵌了Servlet容器,則是沿用的JSESSION_ID。因此在瀏覽一些JavaWeb站點(diǎn)時(shí)會(huì)發(fā)現(xiàn)該Cookie。

使用@SessionAttribute可以將會(huì)話中的屬性映射到方法參數(shù);

如果希望對(duì)Session屬性進(jìn)行操作,可以在Controller上聲明@SessionAttributes注解以指定想要變更的屬性;
之后,通過(guò)Model參數(shù)進(jìn)行寫(xiě)入即可(由框架自動(dòng)檢測(cè)并修改Session)

@SessionAttributes("seed")
public class SessionController {

 private static final Logger logger = LoggerFactory.getLogger(SessionController.class);
 @GetMapping("/some")
 @ResponseBody
 public String someSession(@SessionAttribute(value = "seed", required = false) Integer seed, Model model) {

  logger.info("seed:{}", seed);
  if (seed == null) {
   seed = (int) (Math.random() * 10000);
  } else {
   seed += 1;
  }
  model.addAttribute("seed", seed);

  return seed + "";
 }

上面的例子與Cookie實(shí)現(xiàn)訪問(wèn)計(jì)數(shù)器的功能是一樣的!

如果希望獲取全部會(huì)話,可以使用HttpSession

 @GetMapping("/all")
 public ResponseEntity<Map<String, Object>> allSessions(HttpSession session) {

  Map<String, Object> valueMap = new HashMap<String, Object>();
  Enumeration<String> iSession = session.getAttributeNames();

  while (iSession.hasMoreElements()) {
   String sessionName = iSession.nextElement();
   Object sessionValue = session.getAttribute(sessionName);

   valueMap.put(sessionName, sessionValue);
   logger.info("sessoin[{}]={}", sessionName, sessionValue);
  }

  // 寫(xiě)入session
  session.setAttribute("timestmap", new Date());
  return new ResponseEntity<Map<String, Object>>(valueMap, HttpStatus.OK);
 }

清除會(huì)話

 @GetMapping("/clear")
 public ResponseEntity<Map<String, Object>> clearSessions(HttpSession session) {

  Map<String, Object> valueMap = new HashMap<String, Object>();
  Enumeration<String> iSession = session.getAttributeNames();

  while (iSession.hasMoreElements()) {
   String sessionName = iSession.nextElement();
   Object sessionValue = session.getAttribute(sessionName);

   valueMap.put(sessionName, sessionValue);
   logger.info("sessoin[{}]={}", sessionName, sessionValue);
   
   session.removeAttribute(sessionName);
  }
  
  return new ResponseEntity<Map<String, Object>>(valueMap, HttpStatus.OK);
 }

五、Flash參數(shù)傳遞

Flash的意思是一瞬間,一閃而過(guò)的,因此很好理解,這是一類僅用來(lái)消費(fèi)一次的參數(shù),有些類似閱后即焚。
試想這樣的場(chǎng)景,你確認(rèn)完購(gòu)物車,完成訂單支付后進(jìn)入訂單管理界面,而此時(shí)界面上提示你"下單成功,請(qǐng)等待發(fā)貨"。
這便可以通過(guò)Flash傳參來(lái)實(shí)現(xiàn)。

Flash的意義是用作請(qǐng)求之間的瞬時(shí)參數(shù)傳遞,僅消費(fèi)一次后便不再用。

以下是一個(gè)示例:

 /**
  * 執(zhí)行跳轉(zhuǎn),并設(shè)置傳值
  *
  * @param counter
  * @param response
  * @return
  */
 @GetMapping("/first")
 public String first(final RedirectAttributes redirectAttrs) {

  logger.info("redirect start:{}");

  redirectAttrs.addFlashAttribute("flash", UUID.randomUUID().toString());
  return "redirect:/flash/second";
 }

 /**
  * 獲取傳值
  * 
  * @param session
  * @param response
  * @return
  */
 @GetMapping("/second")
 @ResponseBody
 public String second(@ModelAttribute("flash") String flash) {

  logger.info("redirect receive {}", flash);
  return flash;
 }

交互原理

spring boot補(bǔ)習(xí)系列之幾種scope詳解

Sprintboot中Flash機(jī)制也是利用Session實(shí)現(xiàn)的,其中FlashMapManager接口實(shí)現(xiàn)了Flash參數(shù)的管理。

默認(rèn)的實(shí)現(xiàn)是SessionFlashMapManager,可以通過(guò)RequestContextUtils獲得上下文中的FlashMapManager對(duì)象。

RequestContextUtils通過(guò)Request Scope(請(qǐng)求上下文)存取對(duì)象

這也是一個(gè)本文未提及的scope域,Request上下文是利用線程變量實(shí)現(xiàn)的,通常用于線程內(nèi)業(yè)務(wù)處理的數(shù)據(jù)交互。

小結(jié)

HTTP 頭信息是一種附加內(nèi)容,用于實(shí)現(xiàn)HTTP協(xié)議中的各種特性,在開(kāi)始部分介紹了常見(jiàn)的頭信息定義。

本文主要介紹了幾種常見(jiàn)的HTTP scope信息的存取方法,包括如何對(duì)header、cookie進(jìn)行讀取及修改。

springboot 內(nèi)嵌了Servlet容器,會(huì)話處理機(jī)制上沿用了JSESSIONID,通過(guò)代碼示例介紹了會(huì)話的處理方法;

Flash參數(shù)是一種閱后即焚的數(shù)據(jù),其底層實(shí)現(xiàn)也用了session的實(shí)現(xiàn)方案。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。

名稱欄目:springboot補(bǔ)習(xí)系列之幾種scope詳解
網(wǎng)頁(yè)網(wǎng)址:http://aaarwkj.com/article48/ihhghp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、網(wǎng)站內(nèi)鏈、外貿(mào)建站、網(wǎng)站導(dǎo)航、網(wǎng)站策劃響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
国产综合中文字幕不卡| 热久久这里只有精品视频| 亚洲欧美一区二区粉嫩| 变态另类欧美国产在线| 黄色av链接在线观看| 欧美人妻精品一区二区| 亚洲免费成人一区二区| 国产三级在线视频不卡| 亚洲永久免费精品一区二区三区 | 久草热不卡的av在线| 国产精品三级久久久| 欧美欧美一区二区三区| 七十二式性日韩视频| 亚洲国产欧美日韩国产| 色哟哟视频在线免费观看| 青青草原一区二区三区| 性知音国产精品粉色视频| 午夜免费视频观看在线| 日本一区二区高清网址| 亚洲熟妇丰满多毛的大昊| 国产传媒在线播放一区| 免费精品99久久久国产| 亚洲伦理av在线观看| 亚洲国产熟对白剧情一区二区| 日韩久久这里只有精品视频| 亚洲精品成人福利网站| 欧美国产精品久久综合| 亚洲一区二区三区视频在线观看 | 成年人免费观看黄色片| 欧美日韩亚洲国产专区精品| 男人的天堂久久精品激情| 天天操夜夜夜夜夜操| 色桃子av一区二区三区| 亚洲精品中文字幕乱码| 欧美日韩精品视频网站| 久久精品国语少妇对白| 亚洲天堂av在线播放| 亚洲av乱码专区国产乱码| 粉嫩在线一区二区懂色| 蜜臀av中文字幕亚洲| 尤物视频在线观看官网|