關(guān)于一個(gè)小項(xiàng)目

?????? 在《由Javaweb所想到的》這篇文章里已經(jīng)說(shuō)了很多的理論知識(shí)。現(xiàn)在是時(shí)候做一個(gè)小小的項(xiàng)目,來(lái)對(duì)這些理論做一次檢驗(yàn)了。

?????? 首先說(shuō)明一下,我要做的這個(gè)“小項(xiàng)目”,并不是一個(gè)真正的項(xiàng)目,它乃是一個(gè)赤裸裸的http服務(wù)集合。也就是說(shuō)我不會(huì)去寫前端。所有的一切我都會(huì)通過(guò)postman這個(gè)軟件,或者直接通過(guò)瀏覽器的地址欄去訪問(wèn)測(cè)試這些http服務(wù)。

???? 當(dāng)然這個(gè)項(xiàng)目不會(huì)太復(fù)雜,http服務(wù)不會(huì)太多。我也不想一開(kāi)始就直接列出http的各種服務(wù),因?yàn)槲腋杏X(jué)這也太枯燥乏味了一點(diǎn)。這個(gè)工程首先需要的是一個(gè)大的輪廓。那么它就是一個(gè)簡(jiǎn)單的博客系統(tǒng)。各位博客網(wǎng)站放心好了。只不過(guò)是個(gè)簡(jiǎn)單的練習(xí)??隙ú皇怯J覦博客這塊蛋糕,不過(guò)話說(shuō)這塊蛋糕當(dāng)年真的還是蠻大的啊。當(dāng)然了在這個(gè)講究團(tuán)隊(duì)合作的年代,一個(gè)人想在一個(gè)行業(yè)里有所建樹(shù)那已經(jīng)很難了。最起碼博主我已經(jīng)不存一丁點(diǎn)幻想了,所以純粹就是練習(xí)而已了。

?????? 嗯,首先我先建了一個(gè)文件夾,取名叫做數(shù)據(jù)庫(kù)。事實(shí)上,這件事情很簡(jiǎn)單,比我寫這么多的字要簡(jiǎn)單多了。但是說(shuō)實(shí)話,我不想去做。為什么?因?yàn)槲淖治覀內(nèi)祟愐呀?jīng)用了幾千年了。而文件夾我們只用了幾十年。所以這就叫做慣性?懂嗎?慣性。。。。。。

????? 所以要我說(shuō)實(shí)話的話,我寧愿用文字去寫上十萬(wàn)八千個(gè)字也不愿意動(dòng)手去建一個(gè)文件夾?!敖ㄒ粋€(gè)文件夾“說(shuō)實(shí)話,這句話真的有點(diǎn)怪怪的。

????? 可惜啊,本博主實(shí)在天資有限,不能靠賣字真乃一大遺憾。只能靠編程為生。雖說(shuō)編程這家伙古板刻薄,真的沒(méi)有文學(xué)精靈古怪那么可愛(ài)。但是有一大好處,那就是編程這家伙它不會(huì)動(dòng),就像那手里的玩具一樣,想玩便玩,不想玩放一邊即可。此話怎講?就是說(shuō)這家伙跟磚頭差不多,搬來(lái)倒去從來(lái)不變。對(duì)于這種不變的家伙,那在人類面前不就是個(gè)板凳嗎?

?????? 這么看來(lái),編程也有可愛(ài)的地方啊。

????? 所以本博主就不得不委曲求全,勉為其難地開(kāi)始動(dòng)工了。

????? 然后填一張表

項(xiàng)目名稱:簡(jiǎn)單博客

項(xiàng)目http服務(wù)簡(jiǎn)單介紹:這個(gè)也不用一個(gè)個(gè)介紹,概括到位即可。

發(fā)送驗(yàn)證碼 參數(shù):手機(jī)號(hào)

登錄 ? 參數(shù):手機(jī)號(hào) 驗(yàn)證碼

查看別人的文章列表 參數(shù):無(wú)

查看別人的文章? 參數(shù):文章id

查看自己的文章? 參數(shù):文章id

發(fā)表文章 參數(shù):文章題目 文章正文

修改文章 參數(shù):文章id

對(duì)文章進(jìn)行打分 參數(shù):文章id 參數(shù)

查看自己的文章列表? 參數(shù):無(wú)

刪除文章 參數(shù):文章id

因?yàn)槊纸凶龊?jiǎn)單博客,所以功能做的也很簡(jiǎn)單,總共也就10個(gè)http訪問(wèn)。

特點(diǎn)分析:主要使用自增主鍵id進(jìn)行文章識(shí)別

項(xiàng)目的數(shù)據(jù)庫(kù)結(jié)構(gòu):這個(gè)有輔助軟件,使用E-R圖即可。填寫參考什么什么E-R圖即可。

因?yàn)槭莏ava編程 所以不妨先想一想需要哪些承載數(shù)據(jù)的pojo類吧。

文章類 字段是 id 文章名 文章正文 分?jǐn)?shù) 用戶id

用戶類 字段是 id 手機(jī)號(hào)碼

用戶不設(shè)置用戶名,所以每個(gè)人都是匿名的。

也許需要做哪些http服務(wù),基本上已經(jīng)決定了數(shù)據(jù)庫(kù)基本包含哪些數(shù)據(jù)了。

項(xiàng)目的用戶認(rèn)證方式:

使用token認(rèn)證,在第一次用戶登錄的時(shí)候,給用戶發(fā)送token,以后每次用戶訪問(wèn)可以不用登錄,只要帶著此token進(jìn)行訪問(wèn)就行。token失效后仍然需要重新登錄才行。

首先是token的生成,有時(shí)候token的生成需要傳一個(gè)獨(dú)特的參數(shù)。

其實(shí)這個(gè)參數(shù)本身也是能夠作為一個(gè)token的。因?yàn)檫@個(gè)參數(shù)本來(lái)就是獨(dú)一無(wú)二的。

那么為什么不直接使用它呢?

那是因?yàn)檫@個(gè)參數(shù)雖然獨(dú)特,但是它有一個(gè)致命的缺點(diǎn),就是沒(méi)有保密性。因?yàn)閠oken要具備兩個(gè)特點(diǎn),一個(gè)就是獨(dú)特性,另一個(gè)就是保密性。所以token其實(shí)就是相當(dāng)于 是用戶名和密碼的二合一的這么一個(gè)東西。而且驗(yàn)證token的時(shí)候都是在內(nèi)存發(fā)生的,跟數(shù)據(jù)庫(kù)那是一點(diǎn)兒關(guān)系都沒(méi)有。而驗(yàn)證用戶名和密碼的時(shí)候往往要通過(guò)查詢數(shù)據(jù)庫(kù)來(lái)驗(yàn)證的。那么有人說(shuō)了,把所有的用戶名和密碼都放內(nèi)存中,驗(yàn)證的時(shí)候不是也和數(shù)據(jù)庫(kù)沒(méi)有關(guān)系了嗎?這樣子也是可以的。但是這就需要解決一個(gè)問(wèn)題,即內(nèi)存與數(shù)據(jù)庫(kù)數(shù)據(jù)同步的問(wèn)題。所以綜合來(lái)看token的方式性能上還是要好一些。

?????? 那么token是如何產(chǎn)生的呢?有沒(méi)有具體的代碼呢?這個(gè)網(wǎng)上是有的,而且還多的是。

?????? 比如:

/**??

?*?生成Token的工具類:??

?*/??

package?red.hearing.eval.modules.token;??


import?java.security.MessageDigest;??

import?java.security.NoSuchAlgorithmException;??

import?java.util.Random;??


import?sun.misc.BASE64Encoder;??


/**??

?*?生成Token的工具類??

?*?@author?zhous??

?*?@since?2018-2-23?13:59:27??

?*??

?*/??

public?class?TokenProccessor?{??


?????private?TokenProccessor(){};??

private?static?final?TokenProccessorinstance?=new?TokenProccessor();??


????public?static?TokenProccessor?getInstance()?{??

????????return?instance;??

????}??


????/**??

?????*?生成Token??

?????*?@return??

?????*/??

????public?String?makeToken()?{??

Stringtoken?=?(System.currentTimeMillis()?+?new?Random().nextInt(999999999))?+?"";??

?????????try?{??

MessageDigestmd?=MessageDigest.getInstance("md5");??

????????????byte?md5[]?=??md.digest(token.getBytes());??

BASE64Encoderencoder?=new?BASE64Encoder();??

????????????return?encoder.encode(md5);??

????????}?catch?(NoSuchAlgorithmException?e)?{??

????????????//?TODO?Auto-generated?catch?block??

????????????e.printStackTrace();??

????????}??

?????????return?null;??

????}??

}?

代碼出處:http://www.mamicode.com/info-detail-2347408.html?__cf_chl_jschl_tk__=5187b4cbae1ce3f798484c0ee3a1cb33215a22dd-1590133965-0-ATNIrRMRioittH1p_Z638x7nrCtoffpYUDzRMZA2twEJdn592NfR_B50ArAOfIxVxoBpH28XZeU9ilqEgIyLy3yYVVHmlmIMfAcLBStOAomDTJYUJQkB_jexv6F_x6DdXTVsrgQbYDXbmmrpUWq0_BW-1A7R_gyWFOYQUxleBTld2RsMs9idiv0-8GuYcg88BlMKptgMlGBUXuc-OEdLhUyPVVMmksTihpslziPcp8njeLJulgh5SK_xQ58phGonMYaFIhPWyS_4o5fRpL_M9JBu4Z2rVmEWqz6p7c21j0ItOUgxKxTFPjApfGtcNcxjCA

比如這個(gè)程序中生成的token,是一段“雜亂無(wú)章”的字符串。那么這樣的token 除非是被黑客攔截。要不然以現(xiàn)在的技術(shù)手段幾乎是“猜”不出來(lái)的。如果說(shuō)普通人設(shè)置的密碼是普通的鎖,那么這個(gè)字符串可以說(shuō)是保險(xiǎn)柜上的鎖了。

那么當(dāng)生成token之后,就需要傳給客戶端了。如何傳給客戶端,token是可以放在cookie中的。不管是不是放在cookie中,一般都是放在http的header中的。而與客戶端相關(guān)的信息,一般都放在session中。所以或許將token放置到session中就可以了。而這只是一種猜想,具體還要看網(wǎng)上一些代碼。于是我從網(wǎng)上找來(lái)了代碼。

/**??

?*???

?*/??

package?red.hearing.eval.modules.token;??


import?javax.servlet.http.HttpServletRequest;??


import?org.apache.commons.lang3.StringUtils;??


/**??

?*?Token的工具類??

?*?@author?zhous??

?*?@since?2018-2-23?14:01:41??

?*??

?*/??

public?class?TokenTools?{??


????/**??

?????*?生成token放入session??

?????*?@param?request??

?????*?@param?tokenServerkey??

?????*/??

????public?static?void?createToken(HttpServletRequest?request,String?tokenServerkey){??

Stringtoken?=TokenProccessor.getInstance().makeToken();??

????????request.getSession().setAttribute(tokenServerkey,?token);??

????}??


????/**??

?????*?移除token??

?????*?@param?request??

?????*?@param?tokenServerkey??

?????*/??

????public?static?void?removeToken(HttpServletRequest?request,String?tokenServerkey){??

????????request.getSession().removeAttribute(tokenServerkey);??

????}??


????/**??

?????*?判斷請(qǐng)求參數(shù)中的token是否和session中一致??

?????*?@param?request??

?????*?@param?tokenClientkey??

?????*?@param?tokenServerkey??

?????*?@return??

?????*/??

????public?static?boolean?judgeTokenIsEqual(HttpServletRequest?request,String?tokenClientkey,String?tokenServerkey){??

Stringtoken_client?=request.getParameter(tokenClientkey);??

????????if(StringUtils.isEmpty(token_client)){??

????????????return?false;??

????????}??

Stringtoken_server?=?(String)?request.getSession().getAttribute(tokenServerkey);??

????????if(StringUtils.isEmpty(token_server)){??

????????????return?false;??

????????}??


????????if(!token_server.equals(token_client)){??

????????????return?false;??

????????}??


????????return?true;??

????}??


}?


代碼出處:http://www.mamicode.com/info-detail-2347408.html?__cf_chl_jschl_tk__=5187b4cbae1ce3f798484c0ee3a1cb33215a22dd-1590133965-0-ATNIrRMRioittH1p_Z638x7nrCtoffpYUDzRMZA2twEJdn592NfR_B50ArAOfIxVxoBpH28XZeU9ilqEgIyLy3yYVVHmlmIMfAcLBStOAomDTJYUJQkB_jexv6F_x6DdXTVsrgQbYDXbmmrpUWq0_BW-1A7R_gyWFOYQUxleBTld2RsMs9idiv0-8GuYcg88BlMKptgMlGBUXuc-OEdLhUyPVVMmksTihpslziPcp8njeLJulgh5SK_xQ58phGonMYaFIhPWyS_4o5fRpL_M9JBu4Z2rVmEWqz6p7c21j0ItOUgxKxTFPjApfGtcNcxjCA


在使用servlet的時(shí)候。可以直接操作session 從而返回?cái)?shù)據(jù)就可以了。使用springmvc的時(shí)候,也是如此,

是的,是時(shí)候展示我從網(wǎng)上找的代碼了,代碼如下:

/**

* 讀取所有cookie?

* 注意二、從客戶端讀取Cookie時(shí),包括maxAge在內(nèi)的其他屬性都是不可讀的,也不會(huì)被提交。瀏覽器提交Cookie時(shí)只會(huì)提交name與value屬性。maxAge屬性只被瀏覽器用來(lái)判斷Cookie是否過(guò)期?

* @param request?

* @param response?

*/@RequestMapping("/showCookies")publicvoidshowCookies(HttpServletRequestrequest,HttpServletResponseresponse){Cookie[]cookies=request.getCookies();//這樣便可以獲取一個(gè)cookie數(shù)組? if(null==cookies){System.out.println("沒(méi)有cookie=========");}else{for(Cookiecookie:cookies){System.out.println("name:"+cookie.getName()+",value:"+cookie.getValue());}}}/**?

* 添加cookie?

* @param response?

* @param name?

* @param value?

*/@RequestMapping("/addCookie")publicvoidaddCookie(HttpServletResponseresponse,Stringname,Stringvalue){Cookiecookie=newCookie(name.trim(),value.trim());cookie.setMaxAge(30*60);// 設(shè)置為30min? cookie.setPath("/");System.out.println("已添加===============");response.addCookie(cookie);}/**?

* 修改cookie?

* @param request?

* @param response?

* @param name?

* @param value?

* 注意一、修改、刪除Cookie時(shí),新建的Cookie除value、maxAge之外的所有屬性,例如name、path、domain等,都要與原Cookie完全一樣。否則,瀏覽器將視為兩個(gè)不同的Cookie不予覆蓋,導(dǎo)致修改、刪除失敗。?

*/@RequestMapping("/editCookie")publicvoideditCookie(HttpServletRequestrequest,HttpServletResponseresponse,Stringname,Stringvalue){Cookie[]cookies=request.getCookies();if(null==cookies){System.out.println("沒(méi)有cookie==============");}else{for(Cookiecookie:cookies){if(cookie.getName().equals(name)){System.out.println("原值為:"+cookie.getValue());cookie.setValue(value);cookie.setPath("/");cookie.setMaxAge(30*60);// 設(shè)置為30min? System.out.println("被修改的cookie名字為:"+cookie.getName()+",新值為:"+cookie.getValue());response.addCookie(cookie);break;}}}}/**?

* 刪除cookie?

* @param request?

* @param response?

* @param name?

*/@RequestMapping("/delCookie")publicvoiddelCookie(HttpServletRequestrequest,HttpServletResponseresponse,Stringname){Cookie[]cookies=request.getCookies();if(null==cookies){System.out.println("沒(méi)有cookie==============");}else{for(Cookiecookie:cookies){if(cookie.getName().equals(name)){cookie.setValue(null);cookie.setMaxAge(0);// 立即銷毀cookie? cookie.setPath("/");System.out.println("被刪除的cookie名字為:"+cookie.getName());response.addCookie(cookie);break;}}}}

//通常開(kāi)發(fā)時(shí)先用以下的代碼將獲取的cookie進(jìn)行封裝

/**

? ? * 根據(jù)名字獲取cookie?

? ? * @param request?

? ? * @param name cookie名字?

? ? * @return?

? ? */publicCookiegetCookieByName(HttpServletRequestrequest,Stringname){Map<String,Cookie>cookieMap=ReadCookieMap(request);if(cookieMap.containsKey(name)){Cookiecookie=(Cookie)cookieMap.get(name);returncookie;}else{returnnull;}}/**?

? ? * 將cookie封裝到Map里面?

? ? * @param request?

? ? * @return?

? ? */privateMap<String,Cookie>ReadCookieMap(HttpServletRequestrequest){Map<String,Cookie>cookieMap=newHashMap<String,Cookie>();Cookie[]cookies=request.getCookies();if(null!=cookies){for(Cookiecookie:cookies){cookieMap.put(cookie.getName(),cookie);}}returncookieMap;}

代碼出處:http://www.itdecent.cn/p/a44b5781aa46

但是以上前兩段代碼好像并不符合我的需求。session的存在與客戶端瀏覽器是否關(guān)閉有關(guān)系。那么是否說(shuō)明session就是只適合于瀏覽器上的應(yīng)用呢?如果是安卓應(yīng)用,那是不是要使用另外一種內(nèi)存呢?

那么問(wèn)題出現(xiàn)了,那就是生成的token應(yīng)該存放在哪里?。。。。。。其實(shí)這很可能是一個(gè)錯(cuò)誤問(wèn)題。。。。。。那是因?yàn)榭赡芊?wù)器端根本就不存儲(chǔ)token。

從網(wǎng)上看了很多token的相關(guān)資料,感覺(jué)各個(gè)做法差別很大。大概就像是裝修房子一樣,幾萬(wàn)塊錢也能裝修,十幾萬(wàn)也能裝修,而幾十萬(wàn)幾百萬(wàn)也是裝修?;蛟S沒(méi)有絕對(duì)的安全?;蛟S要具體情況具體來(lái)分析。如果只是作為少數(shù)人不涉及到金錢的一個(gè)應(yīng)用。如果沒(méi)有那么大的厲害關(guān)系,可能簡(jiǎn)單使用一下就可以。如果涉及到大的厲害關(guān)系。那么就應(yīng)當(dāng)注意一下了。

????? 下面使用真名講一個(gè)小故事。

????? http 在提供http服務(wù)的時(shí)候。是需要識(shí)別客戶端的。如果是這么一種情況,http服務(wù)器發(fā)送一根管子給http客戶端。然后這個(gè)管子永遠(yuǎn)壞不了。并且別的人無(wú)法撕開(kāi)這根管子。如果是這種模型,那么只需要在管子連好之后,服務(wù)器對(duì)客戶端識(shí)別一次即可。因?yàn)樽R(shí)別之后,服務(wù)器記住這根管子就行了。

??? ?? 可是現(xiàn)實(shí)是這樣子的。管子太貴了,也太少了。管子只能租不能買。

即使你這個(gè)服務(wù)器和客戶端之間安好了這么一根管子。服務(wù)器和客戶端通完信之后,就得把管子給拆了,然后歸還。那么有人說(shuō)了,我不好容易租一回管子,那我就讓服務(wù)器和客戶端多說(shuō)幾句話可以嗎?說(shuō)它個(gè)三天三夜。設(shè)計(jì)者早就想好了這種情況。所以這種情況是不被允許的。因?yàn)楣茏訉氋F啊。所以公司規(guī)定了,安好管子之后。必須客戶端先說(shuō)話,而且只能說(shuō)一句話,而且這句話不能超過(guò)10個(gè)字??蛻舳苏f(shuō)完之后,服務(wù)器端說(shuō)。服務(wù)器也是只能說(shuō)一句話,而且這句話不能超過(guò)20個(gè)字。服務(wù)器說(shuō)完之后,就得馬上歸還管子。再想說(shuō)話,再租管子就是了。

?????? 雖然管子很貴,但是客戶端有錢啊,客戶端于是就說(shuō)了:“服務(wù)器,沒(méi)事,咱兩個(gè)盡情地聊,不要擔(dān)心租管子的事情,我已經(jīng)辦了年卡,這一年可以不限次數(shù)隨便租管子的”。然后客戶端就和服務(wù)器愉快自由自在地聊起天了。服務(wù)器一見(jiàn)客戶端這么熱情,頓時(shí)非常感動(dòng)。其實(shí)客戶端是有很多的,而服務(wù)器其實(shí)只有一個(gè)。服務(wù)器親眼見(jiàn)了各種各樣的客戶端。有的客戶端一輩子只來(lái)找它聊一句或者幾句,便在也不見(jiàn)這個(gè)客戶端的影子了。有的客戶端則可能天天來(lái)找它聊天,一天聊好幾萬(wàn)句也是有的。但是更多的是那種偶爾來(lái)一次,或者隔幾天來(lái)一次然后聊幾句的那種客戶端。不管怎么樣,客戶端每天過(guò)來(lái)聊天的次數(shù),那可真是無(wú)法預(yù)測(cè)的。不過(guò)整體來(lái)說(shuō)還算是均衡的。就像大馬路上行人的密度一樣,沒(méi)有辦法精確估計(jì)未來(lái)某一個(gè)時(shí)間的密度。但是總體來(lái)說(shuō)行人的密度一般是可以估計(jì)在一個(gè)范圍之內(nèi)的,當(dāng)然發(fā)生極端的情況下例外。而且上面所說(shuō)的行人密度,其實(shí)還符合一個(gè)函數(shù)曲線的,就是那個(gè)著名的概率曲線。?

? ? ? ? 不論這個(gè)曲線是什么樣子的,總而言之每個(gè)客戶端來(lái)聊天的次數(shù)是不一樣的。由于管子是通用的,而且在計(jì)算機(jī)世界中,又沒(méi)有所謂的個(gè)性,所以事實(shí)上所有的客戶端幾乎是一模一樣的。所以每次安好管子的時(shí)候。服務(wù)器端都要根據(jù)客戶端說(shuō)出的話進(jìn)行判斷,那么它是怎么判斷的呢?其實(shí)它是用一個(gè)小本子來(lái)解決這個(gè)問(wèn)題的。

??????? 從公司那里借來(lái)管子的時(shí)候,管子上印有客戶端的一些信息,比如上網(wǎng)號(hào)碼啊等等。而服務(wù)器端把這些都記在了這個(gè)本子上。當(dāng)客戶端說(shuō)話的時(shí)候,服務(wù)器端根據(jù)客戶端說(shuō)的話里帶的一個(gè)暗號(hào) 就從自己那本子上找,服務(wù)器端找啊找,? ?? 很快它就根據(jù)那暗號(hào)在那個(gè)本子上找到了那個(gè)暗號(hào)所對(duì)應(yīng)的信息,原來(lái)上網(wǎng)號(hào)是XXX。于是服務(wù)器端知道了自己已經(jīng)已經(jīng)和這個(gè)上網(wǎng)號(hào)在半個(gè)小時(shí)內(nèi)聊了50句了。所以這分明就是一個(gè)典型的“好客戶端”啊。于是服務(wù)器熱情地答話了。服務(wù)器就是這樣,假如它從它那個(gè)小本上,查出此客戶端以前從來(lái)沒(méi)有來(lái)聊過(guò)天的話。那么它就會(huì)冷冰冰地說(shuō):“對(duì)不起客戶端,你還沒(méi)告訴我您叫什么名字,密碼是多少” 本來(lái)客戶端就想知道今天的天氣,沒(méi)想到得到這樣的一個(gè)回答。所以客戶端很沮喪,也沒(méi)辦法只能再和服務(wù)器通一次信。先告訴服務(wù)器自己的用戶名密碼再說(shuō)。

?????? 這種搞個(gè)小本子的做法也是可以的。但是這個(gè)小本子上的內(nèi)容太容易被擦掉了,而且小本子也是很貴的啊。

于是服務(wù)器開(kāi)始想別的主意了。“最近客戶端不給錢了啊,所以小本子還是少買吧?!狈?wù)器想。于是服務(wù)器突然靈機(jī)一動(dòng)想到:“那么干脆,讓客戶端多發(fā)點(diǎn)暗號(hào)過(guò)來(lái)吧,我直接看暗號(hào)得了?!彼詮拇艘院筮@個(gè)服務(wù)器經(jīng)常受到客戶端很多暗號(hào),它一看暗號(hào)就知道這個(gè)客戶端的一些情況了。比如是不是第一次來(lái)聊天的等。

?????? 當(dāng)然了暗號(hào)是發(fā)過(guò)來(lái)了,服務(wù)器也得有眼力勁去看呢,其實(shí)服務(wù)器雖然沒(méi)錢買本子,但是眼力勁還是有的。

它收到了暗號(hào),馬上就開(kāi)始琢磨了,這暗號(hào)這么眼熟,肯定是我親自制作的啊。當(dāng)然只看一眼也是不行的,它把暗號(hào)的包裝層層打開(kāi),于是“圖窮而匕首現(xiàn)”打開(kāi)之后它說(shuō):“沒(méi)錯(cuò)這就是 最原來(lái)的東西啊”

? ? ?? 那么為什么要把匕首包在圖里面呢?在歷史書中這個(gè)問(wèn)題可能比較簡(jiǎn)單。那么在整個(gè)過(guò)程中,哪些需要被包在地圖里面呢?首先,圖是不少的,但是不是每張圖里面都有一個(gè)匕首。其次匕首放在圖里面,可能有幾個(gè)原因,一個(gè)是要驗(yàn)證算法。一個(gè)是為了保密匕首。 ? 那么問(wèn)題來(lái)了,匕首為什么要保密?用戶在登錄的時(shí)候給服務(wù)器的用戶名密碼顯然都沒(méi)有保密(意為加密)啊。那么怎么服務(wù)器給用戶發(fā)的這個(gè)就需要保密了呢?其實(shí)很簡(jiǎn)單,因?yàn)樗@個(gè)保密之后才算是密碼,不保密之前那叫名字。所以即使從對(duì)等的角度來(lái)說(shuō),客戶端給服務(wù)器發(fā)送的是密碼,那么服務(wù)器給客戶端也應(yīng)該發(fā)密碼才對(duì)。即使這密碼是他下次還要查看的。

? ? ? ? 所以也可以說(shuō),多給客戶端發(fā)的暗號(hào),就是隨機(jī)生成的密碼。然后發(fā)給了客戶端。所以這里的加密的作用可能就是生成一個(gè)密碼。 ?? 不過(guò)這密碼是服務(wù)器為客戶端定制的密碼。

項(xiàng)目使用的中間件:比如springboot shiro springcloud tomcat等

那么以前說(shuō)過(guò),為了降低javaweb開(kāi)發(fā)的難度,很多第三方公司開(kāi)發(fā)出了一些中間件。

這些中間件就像一個(gè)保姆一樣,幫助程序員從吃飯到洗衣服。。??偠灾?,是能管的都管了。

接下來(lái)就看程序員的了。。。

那么這些“保姆”們到底都管了哪些事情呢?

比如,springboot都管了哪些事情呢?

現(xiàn)在開(kāi)發(fā)一個(gè)javaweb,用到的“保姆”太多了。那么springboot這個(gè)“保姆”,她呢其實(shí)就是就是一個(gè)專門介紹別的“保姆”來(lái)工作的一個(gè)“保姆”。有了這樣一個(gè)“保姆”,再來(lái)請(qǐng)其他“保姆”來(lái)干活那就方便的多了。不用自己一個(gè)一個(gè)麻煩地去找了。而且這個(gè)“保姆”找來(lái)的“保姆”都是非常可靠的。

所以這個(gè)項(xiàng)目會(huì)先請(qǐng)這個(gè)springboot這個(gè)“保姆”

然后在讓這個(gè)“保姆”去請(qǐng)springmvc,mybatis,shiro,redis,rabbitqp這些“保姆”。

而這些“保姆”在系統(tǒng)上的安裝,一般來(lái)說(shuō)都是比較簡(jiǎn)單的。因?yàn)榫拖褚豢詈细竦膽?yīng)用軟件一樣。安裝一般并沒(méi)有太多需要注意的事情。只要運(yùn)行成功了,基本就是正確的。


項(xiàng)目的開(kāi)發(fā)周期:

項(xiàng)目的開(kāi)發(fā)大致計(jì)劃以及預(yù)備計(jì)劃:

項(xiàng)目的開(kāi)發(fā)工具:

其實(shí)本博主一直有個(gè)疑問(wèn)沒(méi)有想通。那就是為什么已經(jīng)有Eclipse還有人要制造出Ideal。也許是為了賺錢吧。

總而言之,作為編輯軟件,從txt到word最后又到Eclipse然后又到Ideal。變化真的挺大的。但是千變?nèi)f變,代碼的“心”是不變的。頗有一種“我看世事多變幻,世事看我卻依然”的感覺(jué)。

項(xiàng)目的備份策略:

項(xiàng)目的迭代策略:

項(xiàng)目的前端框架:

未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容