辽阳剐什教育咨询有限公司

新聞中心

01-17
2018
我用Python玩小游戲“跳一跳”,瞬間稱霸了朋友圈!
從前幾天微信最新版本 6.6.1 的更新開始,微信小程序游戲“跳一跳”似乎在一夜之間風(fēng)靡了朋友圈。它甚至比五六年前的飛機(jī)大戰(zhàn)游戲都火爆,這種小游戲的火爆不僅僅是因?yàn)橛心?、有意思,更重要的是可以進(jìn)行好友 PK!“跳一跳”的小游戲推出后,很多準(zhǔn)備奮發(fā)向上的同學(xué),這個(gè)假期的美好愿景被毀了。為了多跳幾步,以及朋友圈的排名,大家在整個(gè)假期都是這樣的:就這樣跳啊跳...擠地鐵跳,蹲馬桶跳,乘電梯跳,靜默的每 1 秒都不能浪費(fèi)在辦公室,還要時(shí)刻警覺(jué)后面...說(shuō)好的工作呢...我控制不住我自己?。】墒呛芏嗳速M(fèi)盡心思跳了一下午也沒(méi)超過(guò) 100 分但排行榜里四分之三的人都超過(guò)三位數(shù)了……真是扎心了……今天小編來(lái)告訴你,如何才能獲取高分,如何才能占據(jù)朋友圈榜首?游戲攻略拿高分普通版本的高分秘籍是這樣的:如果你每次都能挑到各自的正中間的話,可以 + 2 分,如果連著跳到中間會(huì) + 4、+6、+8、+10……跳到污水井蓋上面,停留 2 秒,等到下水道聲音響起直接 + 5 分跳到魔方上面,停留 2 秒,等到魔方轉(zhuǎn)正會(huì)直接 + 10 分跳到音樂(lè)盒上面,停留 2 秒,等到音樂(lè)響起會(huì)直接 + 30 分跳到便利店,停留 2 秒,等到便利店開門會(huì)直接 + 15 分以上是針對(duì)普通用戶,但對(duì)咱們程序猿來(lái)說(shuō)用這套太 Low 了,接下來(lái)要說(shuō)的是如何從技術(shù)層面去實(shí)現(xiàn)高分:技術(shù)手段實(shí)現(xiàn)高分通過(guò) Python 手段在 Github 上面已經(jīng)有人用 Python 來(lái)玩跳一跳這個(gè)游戲了,想多少分就有多少分。GitHub 地址:https://github.com/wangshub/wechat_jump_game步驟:安卓手機(jī)打開 USB 調(diào)試,設(shè)置》開發(fā)者選項(xiàng)》USB 調(diào)試。電腦與手機(jī) USB 線連接,確保執(zhí)行 adb devices 可以找到設(shè)備 id。界面轉(zhuǎn)至微信跳一跳游戲,點(diǎn)擊開始游戲。運(yùn)行 python wechat_junp_auto.py,如果手機(jī)界面顯示 USB 授權(quán),請(qǐng)點(diǎn)擊確認(rèn)。很有趣!簡(jiǎn)單點(diǎn)說(shuō)就是:用電腦幫你玩微信跳一跳,全自動(dòng),不用手動(dòng)。效果:這里梳理一份稍微完整一點(diǎn)的操作步驟,以 Mac 的為例,Win 的思路是一樣的。另外,這里用的是安卓手機(jī),iOS 也差不多,不過(guò)要下載一個(gè) 5.5GB 的 Xcode。1、下載程序,打開下面的鏈接,點(diǎn)右側(cè) clone or download,再點(diǎn) download zip。2、解壓 zip 文檔,再把文件夾挪到桌面,打開文件夾,你會(huì)看到很多東東:3、打開 mac 系統(tǒng)自帶的“終端”,這是一個(gè)命令行應(yīng)用,win 用 cmd 就可以了吧。4、通過(guò)終端進(jìn)入文件夾,命令行如下:~/Decktop/wechat_jump_game-master5、安裝 pip,在終端輸入 sudo easy_install pip 再回車,可能要輸入密碼。6、安裝各種依賴程序,在終端輸入 pip install -r requirements.txt 再回車,系統(tǒng)會(huì)自動(dòng)安裝。requirements.txt 就是文件夾里的一個(gè) txt 文檔,里面寫著會(huì)自動(dòng)安裝哪些程序。pip 就是第 5 步安裝的程序,如果沒(méi)安裝,pip install -r requirements.txt 將無(wú)法執(zhí)行。7、安裝 adb,打開下面的鏈接查看,有 3 種方法,建議用第二種,是英文,如果你不懂英文可以百度中文教程。https://stackoverflow.com/questions/31374085/installing-adb-on-mac-os-x8、打開安卓手機(jī)的設(shè)置 - 開發(fā)者選項(xiàng) - USB 調(diào)試(如果沒(méi)有開發(fā)者選項(xiàng),可百度打開開發(fā)者選項(xiàng)的方法),用 USB 線連接手機(jī)和電腦,手機(jī)可能會(huì)彈出對(duì)話框,點(diǎn)同意。如果出現(xiàn)運(yùn)行腳本后小人不跳的情況,請(qǐng)檢查是否有打開“USB 調(diào)試(安全模式)”,記得順便打開 USB 模擬點(diǎn)擊。9、在終端輸入 adb devices,如果看到下面這種信息,說(shuō)明 adb 已正確安裝,也說(shuō)明電腦成功檢測(cè)到手機(jī)。如果你系統(tǒng)是 Win10 或 Win8 可能需要先設(shè)置一下“禁用強(qiáng)制驅(qū)動(dòng)程序簽名”。不然會(huì)出現(xiàn)下面的“文件的哈希值不在指定目錄中”安裝不上 adb 驅(qū)動(dòng)的問(wèn)題,網(wǎng)上有教程請(qǐng)自行學(xué)習(xí)。10、打開微信跳一跳點(diǎn)開始,在終端輸入 python wechat_jump_auto.py 點(diǎn)回車,游戲就會(huì)自動(dòng)開始~ 請(qǐng)根據(jù)手機(jī)分辨率運(yùn)行相應(yīng)的 *.py 文件。注意:我跳了很多次,最后都會(huì)掉下盒子,暫時(shí)最多只能跳到 1800+ 分,不能一直跳下去。分辨率不同,配置文件也不一樣,具體看 config 這個(gè)文件夾。別刷太高分,有人刷到 4000,結(jié)果分?jǐn)?shù)被微信清零。實(shí)驗(yàn)結(jié)果:只要有耐心,你就是王者下面分析一下代碼,Main 部分有一個(gè) While 循環(huán),只要你不終止,它會(huì)一直重復(fù)操作。Main部分代碼里面主要調(diào)用的自定義函數(shù)有三個(gè),還有一個(gè) time.sleep 是為了延遲一下:pull_screenshot() #獲取圖像find_piece_and_board(im) #根據(jù)圖像獲取兩個(gè)點(diǎn)的坐標(biāo)值jump(math.sqrt((board_x - piece_x) ** 2 + (board_y - piece_y) ** 2))#根據(jù)兩點(diǎn)距離和手機(jī)像素計(jì)算按壓時(shí)間并 JUMPpull_screenshot()這個(gè)函數(shù)主要是利用 adb 來(lái)獲取圖像,這里順便說(shuō)一下“adb”,adb 是連接 Android 手機(jī)與 PC 端的橋梁,可以讓用戶在電腦上對(duì)手機(jī)進(jìn)行全面的操作。借助 adb 工具,我們可以管理設(shè)備,還可以進(jìn)行如安裝軟件、系統(tǒng)升級(jí)、運(yùn)行 Shell 命令等等操作。如“pull”就是獲取設(shè)備中的文件,想更多了解 ADB 請(qǐng)自行學(xué)習(xí)~find_piece_and_board()根據(jù)圖像獲取當(dāng)前小人位置和落點(diǎn)的坐標(biāo)系(piece_x, piece_y, board_x, board_y),這個(gè)是這個(gè)腳本中的核心部分。jump根據(jù)設(shè)定的“長(zhǎng)按的時(shí)間系數(shù)”計(jì)算需要的按壓時(shí)間,這個(gè)系數(shù)是根據(jù)手機(jī)分辨率推出來(lái)的,按壓時(shí)間設(shè)定不小于 200ms,核心命令是 adb 的“input swipe”?!癷nput swipe”模擬的是手指在屏幕上的滑動(dòng)事件,如果兩個(gè)點(diǎn)坐標(biāo)不變化就成了長(zhǎng)按了。代碼中四個(gè)變量的設(shè)置是:“swipe_x1,swipe_y1,swipe_x2,swipe_y2 = 320,410,320,410”,所以是模擬的長(zhǎng)按,其實(shí)滑動(dòng)也是可以的。偽造 POST 請(qǐng)求刷分除了可以用 Python 實(shí)現(xiàn)高分,還有網(wǎng)友爆料還可以直接偽造 POST 請(qǐng)求刷分,直接改分?jǐn)?shù)。昨日,V2EX 網(wǎng)站上一篇題為《微信跳一跳 可以直接更改分?jǐn)?shù), POST 請(qǐng)求沒(méi)有校驗(yàn)… 》的文章獲得大量曝光,帖中指出微信小程序存在漏洞,跳一跳小游戲可以直接改分?jǐn)?shù)。用戶朱鵬飛根據(jù)帖子的指引,發(fā)現(xiàn)甚至連微信小程序、小游戲的源代碼都可以直接下載,只需要知道 appid 和版本號(hào),就可以直接構(gòu)造 URL 下載后綴為 wxapkg 的源碼包,不需要任何驗(yàn)證。據(jù)微信公眾號(hào)“小專欄平臺(tái)”消息,截自 1 月 1 日 23:50,微信官方已經(jīng)修復(fù)了這個(gè)漏洞。不過(guò),據(jù)說(shuō)一些老版本的微信還是可以抓包獲取包地址。最后一個(gè)微信已經(jīng)修復(fù) Bug(部分版本沒(méi)有修復(fù)),但只要利用好前面兩個(gè)攻略,再配合對(duì)節(jié)奏的把握,登上朋友圈前幾完全不在話下。話不多說(shuō),趕緊去玩吧?。?!
01-17
2018
WebAPI 實(shí)現(xiàn)前后端分離
隨著Web技術(shù)的發(fā)展,現(xiàn)在各種框架,前端的,后端的,數(shù)不勝數(shù)。全棧工程師的壓力越來(lái)越大?,F(xiàn)在的前端的框架,既可以做各種Web,又可以做各種APP,前端框架更新?lián)Q代越來(lái)越快,越來(lái)越多。傳統(tǒng)的模式前端和后端進(jìn)行調(diào)試,修改都非常麻煩。往往前端配合后端很痛苦,后端也嫌前端麻煩。(無(wú)解,能動(dòng)手解決的事,盡量別動(dòng)嘴。辦公室應(yīng)該常備一些,繃帶,止血條,速效救心丸等藥品。為了阻止事態(tài)升級(jí),辦公室要加強(qiáng)刀具管制條例。)前后端分離前端根據(jù)事先約定好的文檔,可以自己摸擬數(shù)據(jù),然后開發(fā),測(cè)試,調(diào)試UI,發(fā)布到線上時(shí)把API接口改成線上API接口,即可完事。前端日后增加新功能,修改UI,自己修改,自己編譯更新自己UI站點(diǎn),發(fā)布線上只要調(diào)上線上API接口即可。并不需要麻煩到后端。兩者工作進(jìn)行分離。后端需要跟前端商量好接口,寫好接口文檔,在接口功能上相互溝通(其實(shí)相當(dāng)于需求相互溝通),一旦接口文檔訂好之后,只需按事先約定實(shí)現(xiàn)API接口即口。把項(xiàng)目編譯好發(fā)布到線上服務(wù)器。即可完事。后端實(shí)現(xiàn)WebApi接口,還可以面對(duì)各種調(diào)用,如PC端web,手機(jī)APP,或者其它設(shè)備。一個(gè)接口多種調(diào)用,實(shí)現(xiàn)代碼去重。工作模式分析對(duì)前端和后端進(jìn)行分離。各司其職,各自在自己的領(lǐng)域集中精力研究。更能有效的加深技術(shù)深度。 前后端分離的模式,你需要N名前端工程師和N名后端工程師。首先我們要約定一些返回基本的格式,比如用XML,還是JSON。結(jié)果大多數(shù)前端都是喜歡JSON,因?yàn)镴S天生就支持JSON。我貼出一些示例代碼  {    "ResultCode": 1300,    "Message":"權(quán)限不足",    "Date":null,   }: ::::返回參數(shù)說(shuō)明參數(shù)名類型是否必有說(shuō)明ResultCodeint是返回碼Messagestring是結(jié)果說(shuō)明DetailErrorjosn否具體錯(cuò)誤Datejosn否數(shù)據(jù)        ResultCodeResultCode說(shuō)明1000成功1100服務(wù)器異常1200身份驗(yàn)證異常1300權(quán)限不足1400傳遞參數(shù)驗(yàn)證不通過(guò)1500版本異常1600業(yè)務(wù)邏輯異常1700系統(tǒng)成升級(jí)中1800該接口己棄用          具體異常這是一個(gè)有點(diǎn)爭(zhēng)議的地方,有很多業(yè)務(wù)邏輯異常,出于對(duì)用戶的友好提示。一些生澀難懂的錯(cuò)誤提示,直接給到用戶,用戶一臉懵逼。但是后端卻不能修改成友好提示,這樣不方便調(diào)試,尋找問(wèn)題原因。一般來(lái)講,前端可以自動(dòng)修改友好提示給用戶。如果后端返回字符串,前端寫死在代碼中,萬(wàn)一,某一天后端認(rèn)為這個(gè)描述更符合場(chǎng)景,修改的字符串。敵軍還有30秒到達(dá)戰(zhàn)場(chǎng)。建議:盡量使用異常代碼,大家可以看到上面貼出例子,就使用的異常代碼。每種異常都有唯一編號(hào),描述可以更改。但是編號(hào)不變。用戶異常(1601000)說(shuō)明1601001賬號(hào)/密碼錯(cuò)誤1601002賬號(hào)被冰凍1601003原密碼不對(duì)    版本控制 每個(gè)API都有一個(gè)版本,其實(shí)也是就針對(duì)APP,如果是WEB端的,都是直接升級(jí)的因?yàn)锽/S結(jié)構(gòu)本身就是存在升級(jí)方便的優(yōu)勢(shì),只需要把服務(wù)端更新就可以了。版本控制一般用兩種方式第一種:URL不變,版本寫在HTTP標(biāo)頭內(nèi)面。第二種:版本寫在URL上面。本人推薦第二種,比較直接方便了解。示例:http://www.xxx.com/版本號(hào)當(dāng)前版本號(hào):v1 http://www.baidu.com/v1/UserSecurity/LoginAPI風(fēng)格現(xiàn)在流行的api風(fēng)格比較多,最出名的就是restful風(fēng)格。按本人的經(jīng)驗(yàn),完全走restful風(fēng)格是很困難的,可能也是水平問(wèn)題,在團(tuán)隊(duì)內(nèi)面也要考慮到其它成員的水平問(wèn)題。我們目前API風(fēng)格還是保留以前風(fēng)格。示例,V*代表版本號(hào)http://xx.com/V*/UserSecurity/SignOutHTTP謂詞使用 Post 方法在服務(wù)器上創(chuàng)建/修改/刪除資源使用 Get 方法從服務(wù)器檢索某個(gè)資源或者資源集合基本命名規(guī)則使用駱駝式命名法-大駝峰法跨域處理前端站點(diǎn)和后端API布署到不同的站點(diǎn),就會(huì)產(chǎn)生跨域問(wèn)題。什么是同源策略?同源是域名,協(xié)議,端口相同。也就是說(shuō)如果不同,則是非同源。同源策略是瀏覽器的一基本的安全功能,非同源訪問(wèn),瀏覽器會(huì)進(jìn)行拒絕。HMTL上面的SRC地址,你可以指定任何URL,表單提交,你可以提交到任何URL。但是,你如果使用AJAX技術(shù),就會(huì)受到同源策略的影響,拒絕提交。現(xiàn)代瀏覽器幾乎都支持跨域資源請(qǐng)求的一種方式。這種技術(shù)叫CORS(跨域資源共享)CORS跨域分兩種第一種,簡(jiǎn)單跨域。第二種,復(fù)雜跨域。解決方案:HTTP輸出標(biāo)頭增加如何節(jié)點(diǎn)注意有前端框架版本,對(duì)安全要求較高,不能使用通配符*,要指定跨域域名。Access-Control-Allow-Origin:* 下面節(jié)點(diǎn)可填,可不填,根據(jù)實(shí)際情況,自行決定。123Access-Control-Allow-Methods:GET,POST,OPTIONSAccess-Control-Allow-Credentials:trueAccess-Control-Allow-Headers:根據(jù)請(qǐng)求頭的內(nèi)容,填寫  注意:復(fù)雜跨域比要簡(jiǎn)單跨域麻煩,更花費(fèi)性能。因?yàn)閺?fù)雜跨域在請(qǐng)求之前會(huì)先發(fā)一個(gè)options預(yù)請(qǐng)求,根據(jù)響應(yīng)判斷服務(wù)器是否支持跨域。也就是說(shuō),實(shí)際上請(qǐng)求了兩次。Cookies作用域不同的站點(diǎn),如何通用Cookies?一般情況只需把cookies作用域設(shè)置頂級(jí)域名,瀏覽器會(huì)自動(dòng)把cookies在訪問(wèn)子域名的時(shí)候捎上去。示例,訪問(wèn)二級(jí)域名時(shí)候,cookies默認(rèn)會(huì)被傳送過(guò)去。頂級(jí)域名:baidul.com cookies作用域:.baidu.com 二級(jí)域名: www.baidu.com api.baidu.com 示例下面貼一些示例文檔,其它的就不多講啦 基本上,WebApi前后端分離的細(xì)節(jié)和注意點(diǎn),都記錄下來(lái),還有更多的細(xì)節(jié),需要讀者在開發(fā)過(guò)程自己去尋找答案。隨筆完畢!
01-17
2018
谷歌出來(lái)走兩步:Home Max可致無(wú)線路由器崩潰
1月17日消息,谷歌Home Max智能音箱已經(jīng)正式發(fā)售,價(jià)格是399美元。沒(méi)想到上市沒(méi)有多長(zhǎng)時(shí)間,就有該產(chǎn)品的用戶在谷歌論壇上反饋該音響問(wèn)題頻頻。谷歌Home Max可致無(wú)線路由器崩潰(圖片來(lái)自TheVerge)       谷歌產(chǎn)品論壇上有了一份初步報(bào)告,稱用戶在使用Home Max播放音樂(lè)時(shí),無(wú)線網(wǎng)絡(luò)可能會(huì)產(chǎn)生崩潰停止工作的情況。 目前谷歌方面要求用戶將含有關(guān)鍵字“GHT3 -無(wú)法設(shè)置最大的網(wǎng)絡(luò)”的截圖和路由器日志的情況保留,以便他們對(duì)此問(wèn)題進(jìn)行診斷。       對(duì)于出現(xiàn)的問(wèn)題, 谷歌公司的發(fā)言人對(duì)此作出回應(yīng),谷歌Home Max用戶反映的問(wèn)題描述顯示,當(dāng)該用戶的Home Max連接無(wú)線網(wǎng)絡(luò)時(shí),無(wú)線路由器就會(huì)崩潰,只能通過(guò)重啟無(wú)線路由器來(lái)解決這個(gè)問(wèn)題。       不過(guò)一部分用戶認(rèn)為,路由器的硬件配置不同可能是導(dǎo)致這個(gè)問(wèn)題出現(xiàn)的原因。但自最初的用戶反映該情況以后,有人證實(shí),他們?cè)诓煌臒o(wú)線路由器上都遇到了同樣的問(wèn)題。      據(jù)了解,谷歌Home Max是一款尺寸較大的音箱。這款音箱配備了雙4.5英寸低音單元和0.7英寸的高音單元。谷歌在10月份的發(fā)布會(huì)上表示,谷歌Home Max的音量要比谷歌Home大20倍,而用戶可以通過(guò)Cast、藍(lán)牙或3.5毫米接口去連接音箱。       Home Max還支持Smart Sound功能,它將會(huì)讓揚(yáng)聲器自動(dòng)適應(yīng)房間尺寸,消除一些雜音。如果將音響放置在墻邊或者架子上,它們會(huì)聽(tīng)起來(lái)不同。Smart Sound功能就能夠讓這些差別消除。       Home Max能夠支持許多主流音樂(lè)在線平臺(tái),比如YouTube Muisc Spotify以及Google Play Muisc、Pandora等。
01-16
2018
“微信之父”張小龍透露公眾號(hào)兩大驚喜!
微信公眾號(hào)將會(huì)單獨(dú)發(fā)布app,以后會(huì)是直接對(duì)作者進(jìn)行贊賞,而不是對(duì)公眾號(hào)。2018微信公開課PRO版”在廣州保利世貿(mào)博覽館舉行,“微信之父”張小龍?jiān)谥髦佳葜v中公布了微信公眾平臺(tái)的最新變化。Part1-贊賞恢復(fù),可直接打賞作者2017年4月19日,微信方面宣布,因蘋果公司新規(guī)出臺(tái),對(duì)應(yīng)用內(nèi)支付規(guī)則進(jìn)行了變更,iOS版微信公眾平臺(tái)及表情平臺(tái)贊賞功能從當(dāng)天17:00起被關(guān)閉,安卓等其他版本微信贊賞功能不受影響。對(duì)此,張小龍?jiān)凇?018微信公開課PRO版”現(xiàn)場(chǎng)表示,公眾號(hào)贊賞功能會(huì)很快恢復(fù)過(guò)來(lái)。此外,還有一個(gè)改變,公眾號(hào)以后會(huì)是直接對(duì)作者進(jìn)行贊賞?!?017年,微信和蘋果公司做了很好的合作,經(jīng)過(guò)協(xié)調(diào)達(dá)成了一些共識(shí)。跟蘋果公司溝通之后,我們也對(duì)自己思考了很多。之前沒(méi)有把作者作為一個(gè)獨(dú)立個(gè)體,以后會(huì)是直接對(duì)作者進(jìn)行贊賞。對(duì)公眾號(hào)打賞還是對(duì)公眾號(hào)背后的作者打賞,是兩個(gè)事情?!盤art2-公眾號(hào)出app,將實(shí)現(xiàn)手機(jī)端編輯目前,微信公眾號(hào)的內(nèi)容編輯只能在PC端實(shí)現(xiàn)。張小龍透露,微信公眾號(hào)的app很快就會(huì)推出。他說(shuō):“公眾號(hào)的app做了,但還沒(méi)有發(fā)布,因?yàn)闆](méi)有達(dá)到我們的預(yù)期。微信是為手機(jī)而生,但公眾號(hào)后臺(tái)還是在PC上生成,這點(diǎn)確實(shí)很奇怪。我們確實(shí)很早就應(yīng)該把a(bǔ)pp推出來(lái),但因?yàn)槲覀冏约旱膯?wèn)題,沒(méi)出來(lái),挺可惜的?!盤art3-微信之父“跳一跳”6000分!張小龍?jiān)诂F(xiàn)場(chǎng)還玩起了最近大火的小程序游戲“跳一跳”,并透露自己最高分為6000多分,獲得了“立地成佛”的稱號(hào)。作為微信花了最多的時(shí)間來(lái)做、也是最大的項(xiàng)目,張小龍對(duì)“小程序”非常有信心和耐心。他說(shuō):“希望小程序一步步地長(zhǎng)大,而不是被催肥。小程序代表一種表達(dá)的方式,未來(lái)萬(wàn)事萬(wàn)物都包含信息。小程序剛好是各種信息的載體,是人們連接信息的方式?!?017年,微信月活躍用戶數(shù)達(dá)到9.8億,微信支付用戶破8億,小程序經(jīng)歷數(shù)十次更新完善……作為微信一年一度最大盛會(huì),在“2018微信公開課PRO版”上,微信2017年重點(diǎn)業(yè)務(wù)線陣容全面亮相,小程序、微信支付、企業(yè)微信等產(chǎn)品亮眼呈現(xiàn)?,F(xiàn)場(chǎng)參會(huì)嘉賓共同回顧2017并展望2018,以全新姿態(tài)迎接嶄新時(shí)代。
01-16
2018
今天是Windows 10免費(fèi)升級(jí)的最后一天
1月16日消息:今天是Windows 7/8.1免費(fèi)升級(jí)Windows 10的最后一天了,雖然這個(gè)“最后一天”已經(jīng)不是第一次了。  微軟將在明天正式關(guān)閉Windows 10免費(fèi)升級(jí)通道,之后擁有正版Windows 7和Windows 8.1的用戶想要升級(jí)到Windows 10,只能花錢了。Windows 10  事實(shí)上,微軟在2016年7月29日就結(jié)束了正常的Windows 10免費(fèi)升級(jí)通道,但為了視聽(tīng)障礙人士,微軟的輔助技術(shù)免費(fèi)升級(jí)通道一直都沒(méi)有關(guān)閉?! ∷裕?016年7月29日之后,人們?nèi)匀豢梢酝ㄟ^(guò)輔助技術(shù)通道免費(fèi)將Windows 7和Windows 8.1升級(jí)到Windows 10。  就在上個(gè)月,微軟宣布這個(gè)通道會(huì)在12月31日關(guān)閉,結(jié)果還是沒(méi)能關(guān)閉成功,延期到了現(xiàn)在。這一次應(yīng)該是真要關(guān)閉了吧?Windows 7/8.1免費(fèi)升級(jí)Windows 10系統(tǒng)的最后一個(gè)“后門”即將于明天正式封閉。這意味著用戶在今天之后將不再免費(fèi)升級(jí),今后想要升級(jí)至少需要支付119.99美元(Windows 10家庭版本)的費(fèi)用。Windows 10上線之初,微軟提供了長(zhǎng)達(dá)1年的免費(fèi)升級(jí)計(jì)劃,無(wú)論是正版還是盜版用戶在這個(gè)時(shí)間段內(nèi)都可以免費(fèi)升級(jí)至Windows 10。2016年7月29日免費(fèi)通道關(guān)閉之后,用戶發(fā)現(xiàn)通過(guò)“輔助技術(shù)”依然能夠免費(fèi)升級(jí)。輔助技術(shù)更新是Windows 10在2016年7月一年免費(fèi)升級(jí)期結(jié)束后的一個(gè)“小小漏洞”。因?yàn)槲④泴?duì)輔助技術(shù)的定義相當(dāng)寬泛,包括使用鍵盤快捷方式、放大鏡的Win7/8.1客戶都算,所以實(shí)質(zhì)上幾乎適用于任何人。微軟最初曾表示將于2017年12月31日關(guān)閉這個(gè)漏洞,不過(guò)本月微軟宣布做出調(diào)整,延長(zhǎng)至1月16日。
01-16
2018
谷歌地圖回歸中國(guó)?現(xiàn)在谷歌已出面否認(rèn)了
1月16日消息,外媒報(bào)道在中國(guó)谷歌地圖已經(jīng)可以使用。這或?qū)⑹枪雀柚鼗刂袊?guó)的一個(gè)信號(hào)?,F(xiàn)在谷歌總部對(duì)此做出了回應(yīng)。現(xiàn)在谷歌已出面否認(rèn)了(圖片來(lái)自baidu)      谷歌方面表示:“There have been no changes to Google Maps in China.(Google地圖在中國(guó)沒(méi)有任何變化)”。      另外,高德地圖也已經(jīng)否認(rèn)了合作傳聞,稱根據(jù)政府的相關(guān)政策,高德地圖沒(méi)有計(jì)劃與谷歌地圖進(jìn)一步合作。至于谷歌方面在是沒(méi)有回應(yīng)。        日本媒體報(bào)道稱,谷歌公司為谷歌地圖網(wǎng)站專門搭建了一個(gè)中國(guó)版本,并為中國(guó)iPhone用戶推出了一個(gè)地圖app。當(dāng)用戶使用谷歌地圖內(nèi)的導(dǎo)航功能時(shí),將會(huì)自動(dòng)跳轉(zhuǎn)至高德地圖,而谷歌地圖將不會(huì)支持應(yīng)用內(nèi)導(dǎo)航服務(wù)。       從多方面獲悉,谷歌也是積極回歸中國(guó)市場(chǎng)。2017年底谷歌中國(guó)開發(fā)者大會(huì)上,谷歌云首席科學(xué)家李飛飛在演講中宣布成立谷歌AI中國(guó)中心,中心落地北京。業(yè)內(nèi)認(rèn)為,谷歌正以AI之名強(qiáng)化在中國(guó)的業(yè)務(wù)。
01-16
2018
傳愛(ài)奇藝在美提交IPO申請(qǐng) 融資10億美元
1月16日消息,外媒湯森路透旗下IFR報(bào)道,百度旗下流媒體視頻服務(wù)愛(ài)奇藝已秘密在美國(guó)提交了IPO(首次公開招股)申請(qǐng),融資約10億美元。對(duì)此消息,愛(ài)奇藝方面拒絕置評(píng)。傳愛(ài)奇藝在美提交IPO申請(qǐng)(圖片來(lái)自baidu)      外媒援引消息人士說(shuō)法,愛(ài)奇藝IPO可能會(huì)在今年第一季度末或第二季度初完成。其實(shí)早在2017年9月,彭博社就援引兩位知情人士說(shuō)法,愛(ài)奇藝計(jì)劃最早于2018年在美國(guó)IPO,屆時(shí)的估值可能超過(guò)80億美元。        根據(jù)百度遞交給SEC的文件顯示,旗下視頻業(yè)務(wù)愛(ài)奇藝2016年?duì)I收112.83億元(16.25億美元),較2015年同期的52.95億元增長(zhǎng)113.1%。愛(ài)奇藝2015年?duì)I收則較2014年的28.7億元增長(zhǎng)84.3%。2016年,愛(ài)奇藝運(yùn)營(yíng)虧損27.65億元(3.98億美元),較2015年同期的虧損23.83億元有所增加。不過(guò),相比愛(ài)奇藝的營(yíng)收增長(zhǎng),其運(yùn)營(yíng)虧損的增幅并不大。       公開資料顯示,愛(ài)奇藝,原名奇藝,于2010年4月22日正式上線。2011,百度耗資4500萬(wàn)美元認(rèn)購(gòu)奇藝B輪優(yōu)先股,并于2012年11月3日,收購(gòu)原愛(ài)奇藝第二大股東普羅維登斯所持股份,成為其單一最大股東。       2013年,百度斥資3.7億美元收購(gòu)PPS,實(shí)現(xiàn)PPS與愛(ài)奇藝的合并,之后在自制劇,產(chǎn)品建設(shè),獨(dú)播等很多領(lǐng)域動(dòng)作頻繁。       2016年,百度公司發(fā)布公告稱,董事會(huì)收到了來(lái)自百度董事長(zhǎng)兼CEO李彥宏和愛(ài)奇藝CEO龔宇的非約束性提議,計(jì)劃收購(gòu)百度所持有的愛(ài)奇藝股份,估值28億美元。僅僅過(guò)了幾個(gè)月,百度董事長(zhǎng)兼首席執(zhí)行官李彥宏和愛(ài)奇藝首席執(zhí)行官龔宇代表買方財(cái)團(tuán)致信百度董事會(huì),宣布撤回今年2月提出的愛(ài)奇藝私有化要約。
12-19
2017
小程序發(fā)布后搜索不到是怎么回事
      隨著小程序商城的熱度不減,更多的電商大佬紛紛使用小程序,如今已建立起2萬(wàn)開發(fā)者、1.2億用戶日活的小程序生態(tài)。微信對(duì)小程序的大力支持,也讓無(wú)數(shù)的開發(fā)者和商戶看到了微信小程序的無(wú)限發(fā)展?jié)摿Α5?,身邊有很多朋友都?huì)遇到一些問(wèn)題,常見(jiàn)的就是在發(fā)布完的小程序后,自己的小程序在微信里搜不到的情況,這讓很多企業(yè)商戶摸不到頭腦,那么出現(xiàn)這種狀況的原因是什么呢?一、需登錄小程序平臺(tái)      在大家遇到小程序發(fā)布后搜索不到的情況時(shí),首先需要登錄自己的小程序平臺(tái),由于小程序?qū)徍送ㄟ^(guò)后,還需要登錄微信小程序平臺(tái)“點(diǎn)擊發(fā)布”這一項(xiàng),在發(fā)布后的兩小時(shí)內(nèi)才可以搜索到自己的小程序,可以首先嘗試一下此方法。二、小程序關(guān)鍵詞排名規(guī)則      當(dāng)你在微信中搜索小程序后,還是沒(méi)有發(fā)現(xiàn)自己的小程序。很有可能是在小程序商城中小程序的關(guān)鍵詞排名因素導(dǎo)致的。那么如何讓自己的小程序關(guān)鍵詞排名靠前呢?小編就和大家介紹一下小程序關(guān)鍵詞的排名規(guī)則:1、小程序上線時(shí)間越早,排名就會(huì)越靠前。2、微信小程序用戶使用的數(shù)量越多,排名就會(huì)越靠前。3、完全匹配出現(xiàn)關(guān)鍵詞次數(shù)越多,排名就會(huì)越靠前。4、小程序的名稱作為核心關(guān)鍵詞語(yǔ),排名就會(huì)越靠前。5、小程序中的關(guān)鍵詞出現(xiàn)1次,并且整體標(biāo)題的字?jǐn)?shù)越短的話,排名就會(huì)越靠前。當(dāng)大家遇到自己的小程序發(fā)布后在微信中搜索不到的情況時(shí),可以通過(guò)以上提到的方法進(jìn)行調(diào)整。隨著微信對(duì)微信小程序商城的大力優(yōu)化和扶持,越來(lái)越多的優(yōu)勢(shì)被大眾所熟知,加之微信小程序正處于紅利期,因此微信小程序的爆紅也就不無(wú)道理了。
07-11
2017
基于Maven+SSM整合shiro+Redis實(shí)現(xiàn)后臺(tái)管理項(xiàng)目
本項(xiàng)目由賣咸魚叔叔開發(fā)完成,歡迎大神指點(diǎn),慎重抄襲!參考了sojson提供的demo,和官方文檔介紹。完整實(shí)現(xiàn)了用戶、角色、權(quán)限CRUD及分頁(yè),還有shiro的登錄認(rèn)證+授權(quán)訪問(wèn)控制。項(xiàng)目架構(gòu):Maven + SpringMVC + Spring + Mybatis + Shiro + Redis數(shù)據(jù)庫(kù):MySql前端框架:H-ui 首先創(chuàng)建Maven項(xiàng)目1.pom.xml 加入依賴包<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>sys</groupId>  <artifactId>sys</artifactId>  <packaging>war</packaging>  <version>0.0.1-SNAPSHOT</version>  <name>sys Maven Webapp</name>  <url>http://maven.apache.org</url>        <dependencies>            <!-- spring依賴管理 -->            <!-- spring-context 是使用spring的最基本的環(huán)境支持依賴,會(huì)傳遞依賴core、beans、expression、aop等基本組件,以及commons-logging、aopalliance -->            <dependency>                <groupId>org.springframework</groupId>                <artifactId>spring-context</artifactId>                <version>4.3.2.RELEASE</version>            </dependency>                        <!-- spring-context-support 提供了對(duì)其他第三方庫(kù)的內(nèi)置支持,如quartz等 -->            <dependency>                <groupId>org.springframework</groupId>                <artifactId>spring-context-support</artifactId>                <version>4.3.2.RELEASE</version>            </dependency>                        <!-- spring-orm 是spring處理對(duì)象關(guān)系映射的組件,傳遞依賴了jdbc、tx等數(shù)據(jù)庫(kù)操作有關(guān)的組件 -->            <dependency>                <groupId>org.springframework</groupId>                <artifactId>spring-orm</artifactId>                <version>4.3.2.RELEASE</version>            </dependency>                        <!-- spring-webmvc 是spring處理前端mvc表現(xiàn)層的組件,也即是springMVC,傳遞依賴了web等web操作有關(guān)的組件 -->            <dependency>                <groupId>org.springframework</groupId>                <artifactId>spring-webmvc</artifactId>                <version>4.3.2.RELEASE</version>            </dependency>                        <!-- spring-aspects 增加了spring對(duì)面向切面編程的支持,傳遞依賴了aspectjweaver -->            <dependency>                <groupId>org.springframework</groupId>                <artifactId>spring-aspects</artifactId>                <version>4.3.2.RELEASE</version>            </dependency>                                    <!-- json解析, springMVC 需要用到 -->            <dependency>                <groupId>com.fasterxml.jackson.core</groupId>                <artifactId>jackson-databind</artifactId>                <version>2.6.0</version>            </dependency>                        <!-- mybatis依賴管理 -->            <!-- mybatis依賴 -->            <dependency>                <groupId>org.mybatis</groupId>                <artifactId>mybatis</artifactId>                <version>3.3.0</version>            </dependency>                        <!-- mybatis和spring整合 -->            <dependency>                <groupId>org.mybatis</groupId>                <artifactId>mybatis-spring</artifactId>                <version>1.2.3</version>            </dependency>                        <!-- mybatis 分頁(yè)插件 -->            <dependency>                <groupId>com.github.pagehelper</groupId>                <artifactId>pagehelper</artifactId>                <version>4.1.6</version>            </dependency>                        <!-- mysql驅(qū)動(dòng)包依賴 -->            <dependency>                <groupId>mysql</groupId>                <artifactId>mysql-connector-java</artifactId>                <version>5.1.37</version>            </dependency>                        <!-- c3p0依賴 -->            <dependency>                <groupId>com.mchange</groupId>                <artifactId>c3p0</artifactId>                <version>0.9.5</version>            </dependency>                        <!-- redis java客戶端jar包 -->            <dependency>                <groupId>redis.clients</groupId>                <artifactId>jedis</artifactId>                <version>2.9.0</version>            </dependency>                        <!-- 文件上傳 -->            <dependency>                <groupId>commons-fileupload</groupId>                <artifactId>commons-fileupload</artifactId>                <version>1.3.1</version>            </dependency>                        <dependency>                <groupId>commons-io</groupId>                <artifactId>commons-io</artifactId>                <version>2.5</version>            </dependency>                        <dependency>                <groupId>org.apache.commons</groupId>                <artifactId>commons-email</artifactId>                <version>1.4</version>            </dependency>                        <dependency>                <groupId>org.apache.logging.log4j</groupId>                <artifactId>log4j-core</artifactId>                <version>2.7</version>            </dependency>                        <dependency>                <groupId>org.apache.httpcomponents</groupId>                <artifactId>httpclient</artifactId>                <version>4.5.2</version>            </dependency>                        <dependency>                <groupId>org.apache.httpcomponents</groupId>                <artifactId>httpcore</artifactId>                <version>4.4.4</version>            </dependency>                                    <!-- junit -->            <dependency>                <groupId>junit</groupId>                <artifactId>junit</artifactId>                <version>4.11</version>            </dependency>                        <!-- servlet依賴 -->            <dependency>                <groupId>javax.servlet</groupId>                <artifactId>javax.servlet-api</artifactId>                <version>3.1.0</version>                <scope>provided</scope>            </dependency>            <!-- jsp依賴 -->            <dependency>                <groupId>javax.servlet.jsp</groupId>                <artifactId>jsp-api</artifactId>                <version>2.2</version>                <scope>provided</scope>            </dependency>            <!-- jstl依賴 -->            <dependency>                <groupId>org.glassfish.web</groupId>                <artifactId>jstl-impl</artifactId>                <version>1.2</version>                <exclusions>                    <exclusion>                        <groupId>javax.servlet</groupId>                        <artifactId>servlet-api</artifactId>                    </exclusion>                    <exclusion>                        <groupId>javax.servlet.jsp</groupId>                        <artifactId>jsp-api</artifactId>                    </exclusion>                </exclusions>            </dependency>                                <dependency>            <groupId>net.sf.json-lib</groupId>            <artifactId>json-lib</artifactId>            <version>2.4</version>            <classifier>jdk15</classifier>        </dependency>        <dependency>            <groupId>commons-httpclient</groupId>            <artifactId>commons-httpclient</artifactId>            <version>3.1</version>        </dependency>                      <!-- shiro依賴包 -->        <dependency>              <groupId>org.apache.shiro</groupId>              <artifactId>shiro-core</artifactId>              <version>1.2.3</version>          </dependency>          <dependency>              <groupId>org.apache.shiro</groupId>              <artifactId>shiro-spring</artifactId>              <version>1.2.3</version>          </dependency>          <dependency>              <groupId>org.apache.shiro</groupId>              <artifactId>shiro-cas</artifactId>              <version>1.2.3</version>              <exclusions>                  <exclusion>                      <groupId>commons-logging</groupId>                      <artifactId>commons-logging</artifactId>                  </exclusion>              </exclusions>          </dependency>          <dependency>              <groupId>org.apache.shiro</groupId>              <artifactId>shiro-web</artifactId>              <version>1.2.3</version>          </dependency>          <dependency>              <groupId>org.apache.shiro</groupId>              <artifactId>shiro-ehcache</artifactId>              <version>1.2.3</version>          </dependency>          <dependency>              <groupId>org.apache.shiro</groupId>              <artifactId>shiro-quartz</artifactId>              <version>1.2.3</version>          </dependency>        <!-- shiro end -->                                    </dependencies>         <build>        <finalName>sys</finalName>        <plugins>            <!-- 指定JDK編譯版本 -->            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-compiler-plugin</artifactId>                <version>3.1</version>                  <configuration>                    <source>1.8</source>                  <target>1.8</target>                </configuration>            </plugin>        </plugins>    </build></project>2.SSM框架配置beans.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:mvc="http://www.springframework.org/schema/mvc"    xmlns:context="http://www.springframework.org/schema/context"    xmlns:aop="http://www.springframework.org/schema/aop"    xmlns:tx="http://www.springframework.org/schema/tx"    xsi:schemaLocation="http://www.springframework.org/schema/beans                        http://www.springframework.org/schema/beans/spring-beans.xsd                          http://www.springframework.org/schema/mvc                        http://www.springframework.org/schema/mvc/spring-mvc.xsd                        http://www.springframework.org/schema/context                        http://www.springframework.org/schema/context/spring-context.xsd                        http://www.springframework.org/schema/aop                        http://www.springframework.org/schema/aop/spring-aop.xsd                        http://www.springframework.org/schema/tx                        http://www.springframework.org/schema/tx/spring-tx.xsd">        <!-- 數(shù)據(jù)庫(kù)連接池 -->    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">        <property name="driverClass" value="com.mysql.jdbc.Driver"/>          <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/sys_test?characterEncoding=UTF8&amp;allowMultiQueries=true"/>        <property name="user" value="root"/>          <property name="password" value="root"/>          <property name="maxPoolSize" value="100"/>          <property name="minPoolSize" value="10"/>          <property name="maxIdleTime" value="60"/>      </bean>        <!-- mybatis 的 sqlSessionFactory -->    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <property name="dataSource" ref="dataSource"/>        <property name="configLocation" value="classpath:mybatis-config.xml"></property>    </bean>        <!-- mybatis mapper接口自動(dòng)掃描、自動(dòng)代理 -->    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">       <property name="basePackage" value="com.sys.mapper" />    </bean>        <!-- 事務(wù)管理器 -->    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource" />    </bean>    <!-- 事務(wù)傳播行為 -->    <tx:advice id="txAdvice" transaction-manager="txManager">        <tx:attributes>            <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>            <tx:method name="page*" propagation="SUPPORTS" read-only="true"/>            <tx:method name="is*" propagation="SUPPORTS" read-only="true"/>            <tx:method name="*" propagation="REQUIRED" read-only="false"/>        </tx:attributes>    </tx:advice>    <!-- 織入事務(wù)增強(qiáng)功能 -->    <aop:config>        <aop:pointcut id="txPointcut" expression="execution(* com.sys.service..*.*(..))" />        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />    </aop:config>     <!-- 配置掃描spring注解(@Component、@Controller、@Service、@Repository)時(shí)掃描的包,同時(shí)也開啟了spring注解支持 -->     <!-- 這個(gè)地方只需要掃描service包即可,因?yàn)閏ontroller包由springMVC配置掃描,mapper包由上面的mybatis配置掃描 -->    <context:component-scan base-package="com.sys.service"></context:component-scan>    <!-- 開啟spring aop 注解支持,要想aop真正生效,還需要把切面類配置成bean -->    <aop:aspectj-autoproxy/>         </beans>dispatcher-servlet.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:mvc="http://www.springframework.org/schema/mvc"    xmlns:context="http://www.springframework.org/schema/context"    xmlns:aop="http://www.springframework.org/schema/aop"    xmlns:tx="http://www.springframework.org/schema/tx"    xsi:schemaLocation="http://www.springframework.org/schema/beans                        http://www.springframework.org/schema/beans/spring-beans.xsd                          http://www.springframework.org/schema/mvc                        http://www.springframework.org/schema/mvc/spring-mvc.xsd                        http://www.springframework.org/schema/context                        http://www.springframework.org/schema/context/spring-context.xsd                        http://www.springframework.org/schema/aop                        http://www.springframework.org/schema/aop/spring-aop.xsd                        http://www.springframework.org/schema/tx                        http://www.springframework.org/schema/tx/spring-tx.xsd">                            <!-- 配置掃描spring注解時(shí)掃描的包,同時(shí)也開啟了spring注解支持 -->    <context:component-scan base-package="com.sys" />    <!-- 開啟springMVC相關(guān)注解支持 -->    <mvc:annotation-driven />        <!-- 開啟spring aop 注解支持 -->    <aop:aspectj-autoproxy/>        <!-- 約定大于配置:約定視圖頁(yè)面的全路徑 = prefix + viewName + suffix -->    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="prefix" value="/WEB-INF/jsp/"></property>        <property name="suffix" value=".jsp"></property>    </bean>    <!-- 文件上傳解析器 -->    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        <property name="maxUploadSize" value="104857600" />        <property name="defaultEncoding" value="UTF-8" />        <property name="maxInMemorySize" value="40960" />    </bean>        <!-- 資源映射 -->    <mvc:resources location="/css/" mapping="/css/**" />    <mvc:resources location="/js/" mapping="/js/**" />    <mvc:resources location="/images/" mapping="/images/**" />    <mvc:resources location="/skin/" mapping="/skin/**" />    <mvc:resources location="/lib/" mapping="/lib/**" /> </beans>mybatis-config.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration>    <settings>        <!-- 使用log4j2作為日志實(shí)現(xiàn) -->        <setting name="logImpl" value="LOG4J2"/>    </settings>    <typeAliases>        <!-- 為指定包下的pojo類自動(dòng)起別名 -->        <package name="com.sys.pojo"/>    </typeAliases>        <mappers>        <!-- 自動(dòng)加載指定包下的映射配置文件 -->        <package name="com.sys.mapper"/>    </mappers></configuration>Log4j2.xml <?xml version="1.0" encoding="UTF-8"?>  <!DOCTYPE xml><Configuration status="OFF">    <Appenders>        <Console name="CONSOLE" target="SYSTEM_OUT">            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{0} - %msg%n" />        </Console>        <RollingFile name="ROLLING" fileName="/logs/ups-manager/log.log"             filePattern="/logs/log_%d{yyyy-MM-dd}_%i.log">            <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>            <Policies>                <TimeBasedTriggeringPolicy modulate="true" interval="1"/>                <SizeBasedTriggeringPolicy size="1024 KB"/>            </Policies>            <DefaultRolloverStrategy max="100"/>        </RollingFile>    </Appenders>        <Loggers>        <Root level="debug">            <AppenderRef ref="CONSOLE" />            <AppenderRef ref="ROLLING"/>        </Root>                <!-- 控制某些包下的類的日志級(jí)別 -->        <Logger name="org.mybatis.spring" level="error">            <AppenderRef ref="CONSOLE"/>        </Logger>    </Loggers></Configuration>web.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">    <!-- 初始化spring容器 -->    <listener>        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    </listener>        <!-- 設(shè)置post請(qǐng)求編碼和響應(yīng)編碼 -->    <filter>        <filter-name>characterEncodingFilter</filter-name>        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>            <init-param>                <param-name>encoding</param-name>                <param-value>UTF-8</param-value>            </init-param>        <init-param>            <!-- 為true時(shí)也對(duì)響應(yīng)進(jìn)行編碼 -->            <param-name>forceEncoding</param-name>            <param-value>true</param-value>        </init-param>    </filter>    <filter-mapping>        <filter-name>characterEncodingFilter</filter-name>        <!-- 設(shè)置為/*時(shí)才會(huì)攔截所有請(qǐng)求,和servlet有點(diǎn)區(qū)別,servlet設(shè)置為/*只攔截所有的一級(jí)請(qǐng)求,如/xx.do,而不攔截/xx/xx.do;servlet設(shè)置為/時(shí)才會(huì)攔截所有請(qǐng)求 -->        <url-pattern>/*</url-pattern>    </filter-mapping>    <context-param>        <param-name>contextConfigLocation</param-name>        <param-value>            classpath:spring-shiro.xml,            classpath:beans.xml,            classpath:dispatcher-servlet.xml        </param-value>    </context-param>          <!-- The filter-name matches name of a 'shiroFilter' bean inside applicationContext.xml -->    <filter>        <filter-name>shiroFilter</filter-name>        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>        <init-param>            <param-name>targetFilterLifecycle</param-name>            <param-value>true</param-value>        </init-param>    </filter>          <filter-mapping>        <filter-name>shiroFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>        <!-- 初始化springMVC容器 -->    <servlet>        <servlet-name>dispatcher</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <init-param>            <param-name>contextConfigLocation</param-name>            <param-value>classpath:dispatcher-servlet.xml</param-value>        </init-param>        <load-on-startup>1</load-on-startup>    </servlet>      <servlet-mapping>        <servlet-name>dispatcher</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping>        </web-app>3.實(shí)現(xiàn)用戶、角色、權(quán)限頁(yè)面操作功能,這里就不貼代碼了4.接下來(lái)就是shiro,登錄認(rèn)證和授權(quán)只需要繼承AuthorizingRealm,其繼承了 AuthenticatingRealm(即身份驗(yàn)證),而且也間接繼承了 CachingRealm(帶有緩存實(shí)現(xiàn))。身份認(rèn)證重寫doGetAuthenticationInfo方法,授權(quán)重寫doGetAuthorizationInfo方法。Shiro 默認(rèn)提供的 Realm 身份認(rèn)證流程 流程如下:首先調(diào)用 Subject.login(token) 進(jìn)行登錄,其會(huì)自動(dòng)委托給 Security Manager,調(diào)用之前必須通過(guò) SecurityUtils.setSecurityManager() 設(shè)置;SecurityManager 負(fù)責(zé)真正的身份驗(yàn)證邏輯;它會(huì)委托給 Authenticator 進(jìn)行身份驗(yàn)證;Authenticator 才是真正的身份驗(yàn)證者,Shiro API 中核心的身份認(rèn)證入口點(diǎn),此處可以自定義插入自己的實(shí)現(xiàn);Authenticator 可能會(huì)委托給相應(yīng)的 AuthenticationStrategy 進(jìn)行多 Realm 身份驗(yàn)證,默認(rèn) ModularRealmAuthenticator 會(huì)調(diào)用 AuthenticationStrategy 進(jìn)行多 Realm 身份驗(yàn)證;Authenticator 會(huì)把相應(yīng)的 token 傳入 Realm,從 Realm 獲取身份驗(yàn)證信息,如果沒(méi)有返回 / 拋出異常表示身份驗(yàn)證失敗了。此處可以配置多個(gè) Realm,將按照相應(yīng)的順序及策略進(jìn)行訪問(wèn)。 代碼實(shí)現(xiàn):/** * */package com.sys.shiro;import javax.annotation.Resource;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.AccountException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.DisabledAccountException;import org.apache.shiro.authc.SimpleAuthenticationInfo;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.apache.shiro.subject.SimplePrincipalCollection;import org.apache.shiro.util.ByteSource;import com.sys.pojo.AdminUser;import com.sys.service.AdminUserService;/**  * @ClassName: MyRealm  * @Description: shiro 認(rèn)證 + 授權(quán)   重寫 */public class MyRealm extends AuthorizingRealm {    @Resource    AdminUserService adminUserService;            /* (non-Javadoc)     * @see org.apache.shiro.realm.AuthorizingRealm#doGetAuthorizationInfo(org.apache.shiro.subject.PrincipalCollection)     */    /**     * 授權(quán)Realm     */    @Override    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {        String account = (String)principals.getPrimaryPrincipal();        AdminUser pojo = new AdminUser();        pojo.setAccount(account);        Long userId = adminUserService.selectOne(pojo).getId();        SimpleAuthorizationInfo info =  new SimpleAuthorizationInfo();        /**根據(jù)用戶ID查詢角色(role),放入到Authorization里.*/        info.setRoles(adminUserService.findRoleByUserId(userId));        /**根據(jù)用戶ID查詢權(quán)限(permission),放入到Authorization里.*/        info.setStringPermissions(adminUserService.findPermissionByUserId(userId));        return info;    }    /* (non-Javadoc)     * @see org.apache.shiro.realm.AuthenticatingRealm#doGetAuthenticationInfo(org.apache.shiro.authc.AuthenticationToken)     */    /**     * 登錄認(rèn)證Realm     */    @Override    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) {        String username = (String)token.getPrincipal();        String password = new String((char[])token.getCredentials());        AdminUser user = adminUserService.login(username, password);        if(null==user){            throw new AccountException("帳號(hào)或密碼不正確!");        }        if(user.getIsDisabled()){            throw new DisabledAccountException("帳號(hào)已經(jīng)禁止登錄!");        }        //**密碼加鹽**交給AuthenticatingRealm使用CredentialsMatcher進(jìn)行密碼匹配        return new SimpleAuthenticationInfo(user.getAccount(),user.getPassword(),ByteSource.Util.bytes("3.14159"), getName());    }        /**     * 清空當(dāng)前用戶權(quán)限信息     */    public  void clearCachedAuthorizationInfo() {        PrincipalCollection principalCollection = SecurityUtils.getSubject().getPrincipals();        SimplePrincipalCollection principals = new SimplePrincipalCollection(                principalCollection, getName());        super.clearCachedAuthorizationInfo(principals);    }    /**     * 指定principalCollection 清除     */    public void clearCachedAuthorizationInfo(PrincipalCollection principalCollection) {        SimplePrincipalCollection principals = new SimplePrincipalCollection(                principalCollection, getName());        super.clearCachedAuthorizationInfo(principals);    }        }shiro的配置:spring-shiro.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"    xmlns:context="http://www.springframework.org/schema/context"    xsi:schemaLocation="       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">        <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">        <!--shiro 核心安全接口  -->        <property name="securityManager" ref="securityManager"></property>        <!--登錄時(shí)的連接  -->        <property name="loginUrl" value="/login"></property>              <!--未授權(quán)時(shí)跳轉(zhuǎn)的連接  -->        <property name="unauthorizedUrl" value="/unauthorized.jsp"></property>           <!-- 其他過(guò)濾器 -->           <property name="filters">               <map>                   <!-- <entry key="rememberMe" value-ref="RememberMeFilter"></entry> -->                   <entry key="kickout" value-ref="KickoutSessionControlFilter"/>               </map>           </property>                      <!-- 讀取初始自定義權(quán)限內(nèi)容-->        <!-- 如果使用authc驗(yàn)證,需重寫實(shí)現(xiàn)rememberMe的過(guò)濾器,或配置formAuthenticationFilter的Bean -->        <property name="filterChainDefinitions">            <value>                /js/**=anon                /css/**=anon                /images/**=anon                /skin/**=anon                   /lib/**=anon                   /nodel/**=anon                   /WEB-INF/jsp/**=anon                   /adminUserLogin/**=anon                                                             /**/submitLogin.do=anon                /**=user,kickout            </value>        </property>    </bean>                    <!-- Shiro生命周期處理器-->    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />        <!-- 安全管理器 -->    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">        <property name="realm" ref="MyRealm"/>        <property name="rememberMeManager" ref="rememberMeManager"/>    </bean>        <bean id="MyRealm" class="com.sys.shiro.MyRealm" >        <property name="cachingEnabled" value="false"/>    </bean>        <!-- 相當(dāng)于調(diào)用SecurityUtils.setSecurityManager(securityManager) -->    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">        <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/>        <property name="arguments" ref="securityManager"/>    </bean>        <!-- sessionIdCookie:maxAge=-1表示瀏覽器關(guān)閉時(shí)失效此Cookie -->    <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">          <constructor-arg value="rememberMe"/>          <property name="httpOnly" value="true"/>          <property name="maxAge" value="-1"/>      </bean>            <!-- 用戶信息記住我功能的相關(guān)配置 -->    <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">        <constructor-arg value="rememberMe"/>        <property name="httpOnly" value="true"/>        <!-- 配置存儲(chǔ)rememberMe Cookie的domain為 一級(jí)域名        這里如果配置需要和Session回話一致更好。-->        <property name="maxAge" value="604800"/><!-- 記住我==保留Cookie有效7天 -->    </bean>        <!-- rememberMe管理器 -->    <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">        <!-- rememberMe cookie加密的密鑰 建議每個(gè)項(xiàng)目都不一樣 默認(rèn)AES算法 密鑰長(zhǎng)度(128 256 512 位)-->        <property name="cipherKey"                  value="#{T(org.apache.shiro.codec.Base64).decode('3AvVhmFLUs0KTA3Kprsdag==')}"/>        <property name="cookie" ref="rememberMeCookie"/>    </bean>        <!-- 記住我功能設(shè)置session的Filter -->    <bean id="RememberMeFilter" class="com.sys.shiro.RememberMeFilter" />        <!-- rememberMeParam請(qǐng)求參數(shù)是 boolean 類型,true 表示 rememberMe -->    <!-- shiro規(guī)定記住我功能最多得user級(jí)別的,不能到authc級(jí)別.所以如果使用authc,需打開此配置或重寫實(shí)現(xiàn)rememberMe的過(guò)濾器 -->    <!-- <bean id="formAuthenticationFilter" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">        <property name="rememberMeParam" value="rememberMe"/>    </bean> -->            <bean id="KickoutSessionControlFilter" class="com.sys.shiro.KickoutSessionControlFilter">    </bean>                  </beans>5.登錄即密碼失敗多次后鎖定/** * */package com.sys.controller;import java.util.LinkedHashMap;import java.util.Map;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.AccountException;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.DisabledAccountException;import org.apache.shiro.authc.ExcessiveAttemptsException;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shiro.subject.Subject;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import com.sys.pojo.AdminUser;import com.sys.service.AdminUserService;import com.sys.common.JedisUtils;import com.sys.shiro.ShiroUtils;/**  * @ClassName: LoginController  * @Description: 登錄*/@Controllerpublic class LoginController{    protected final static Logger logger = LogManager.getLogger(LoginController.class);    protected Map<String, Object> resultMap = new LinkedHashMap<String, Object>();        @Resource    AdminUserService adminUserService;        /**    * @Description: 登錄認(rèn)證    * @param um 登錄賬號(hào)    * @param pw 登錄密碼    * @param rememberMe 記住我    * @param request    * @return    * @throws      * @author lao    * @Date 2018年1月15日下午12:24:19    * @version 1.00     */    @RequestMapping(value="/submitLogin.do",method=RequestMethod.POST)    @ResponseBody    public Map<String,Object> submitLogin(String um,String pw,boolean rememberMe,HttpServletRequest request){                Subject subject = SecurityUtils.getSubject();        UsernamePasswordToken token = new UsernamePasswordToken(um,ShiroUtils.getStrByMD5(pw));                            try{                      token.setRememberMe(rememberMe);            subject.login(token);            JedisUtils.del(um);            logger.info("------------------身份認(rèn)證成功-------------------");            resultMap.put("status", 200);            resultMap.put("message", "登錄成功!");        } catch (DisabledAccountException dax) {              logger.info("用戶名為:" + um + " 用戶已經(jīng)被禁用!");            resultMap.put("status", 500);            resultMap.put("message", "帳號(hào)已被禁用!");        } catch (ExcessiveAttemptsException eae) {              logger.info("用戶名為:" + um + " 用戶登錄次數(shù)過(guò)多,有暴力破解的嫌疑!");            resultMap.put("status", 500);            resultMap.put("message", "登錄次數(shù)過(guò)多!");        } catch (AccountException ae) {              logger.info("用戶名為:" + token.getPrincipal() + " 帳號(hào)或密碼錯(cuò)誤!");            String excessiveInfo = ExcessiveAttemptsInfo(um);            if(null!=excessiveInfo){                resultMap.put("status", 500);                resultMap.p
06-17
2017
有關(guān)Servlet和JSP的梳理
大二第一學(xué)期的時(shí)候有學(xué)JSP的課,但是因?yàn)樵陂_學(xué)之前做過(guò)JSP的小項(xiàng)目,所以一個(gè)學(xué)期的課也沒(méi)聽(tīng),直到期末考試成績(jī)出來(lái)了,才回想JSP的內(nèi)容還有多少記得,沒(méi)想到模模糊糊也記不起多少,趕緊回頭學(xué)回來(lái)。接下來(lái)是關(guān)于Servlet和JSP的梳理。-------------------------------------------------------------------------------------------------------------------------------------------------  Servlet是一個(gè)Java程序,一個(gè)Servlet應(yīng)用有一個(gè)或多個(gè)Servlet程序,而且JSP頁(yè)面也會(huì)被轉(zhuǎn)換和編譯成Servlet程序?! ervlet應(yīng)用無(wú)法獨(dú)立運(yùn)行,必須運(yùn)行在Servlet容器中。Servlet容器將用戶的請(qǐng)求傳遞給Servlet應(yīng)用,并將結(jié)果返回給用戶。由于大部分Servlet應(yīng)用都包含多個(gè)JSP頁(yè)面,因此更準(zhǔn)確地說(shuō)是“Servlet/JSP應(yīng)用”?! ∑渲?,Servlet API是開發(fā)Servlet的主要技術(shù)。而Servlet API有以下4個(gè)Java包:Java包包含的內(nèi)容javax.servlet定義Servlet和Servlet容器之間契約的類和接口javax.servlet.http定義HTTP Servlet和Servlet容器之間契約的類和接口javax.servlet.annotation標(biāo)注Servlet、Filter、Listener的標(biāo)注。它還被標(biāo)注原件定義元數(shù)據(jù)javax.servlet.descriptor包含提供程序化登陸web應(yīng)用程序的配置信息的類型?! ervlet技術(shù)的核心是Servlet,它是所有Servlet類必須直接或間接實(shí)現(xiàn)的一個(gè)接口,而Servlet接口定義了Servlet與Servlet容器之間的契約。這個(gè)契約歸結(jié)起來(lái)就是,Servlet容器將Servlet類載入內(nèi)存,并在Servlet實(shí)例上調(diào)用具體的方法。當(dāng)用戶的請(qǐng)求使得Servlet容器調(diào)用Servlet的Service方法,會(huì)傳入一個(gè)ServletRequest實(shí)例和一個(gè)ServletResponse實(shí)例,其中,ServletRequest中封裝了當(dāng)前的HTTP請(qǐng)求,而ServletResponse表示當(dāng)前用戶的HTTP響應(yīng)。對(duì)于每一個(gè)應(yīng)用程序,Servlet容器還會(huì)創(chuàng)建一個(gè)ServletContext實(shí)例,這個(gè)對(duì)象中封裝了上下文(應(yīng)用程序)的環(huán)境詳情。每個(gè)上下文只有一個(gè)ServletContext,而且每個(gè)Servlet實(shí)例都有一個(gè)配置的ServletConfig。  Servlet的生命周期方法:  Servlet容器的生命周期方法作用init該方法在Servlet第一次被請(qǐng)求的時(shí)候,Servlet就會(huì)調(diào)用這個(gè)方法,而后不再被調(diào)用,所以可以用這個(gè)方法進(jìn)行初始化工作。調(diào)用這個(gè)方法時(shí),Servlet容器會(huì)傳入一個(gè)ServletConfig。Service每當(dāng)請(qǐng)求Servlet時(shí),Servlet容器就會(huì)調(diào)用這個(gè)方法。第一次請(qǐng)求Servlet時(shí),Servlet容器調(diào)用init方法和Service方法。后續(xù)的請(qǐng)求將只調(diào)用Service方法。destroy當(dāng)要銷毀Servlet時(shí),Servlet容器就會(huì)調(diào)用這個(gè)方法。一般會(huì)在這個(gè)方法中編寫清除代碼?! ≡诮榻B一個(gè)Servlet中另外兩個(gè)非生命周期的方法:Servlet容器的非生命周期方法作用getServletInfo這個(gè)方法會(huì)返回Servlet的描述getServletConfig這個(gè)方法會(huì)返回由Servlet容器傳給init方法的ServletConfig。但是為了讓getServletConfig返回一個(gè)非null值,必須將傳給init方法的ServletConfig賦給一個(gè)類級(jí)變量。-------------------------------------------------------------------------------------------------------------------------------------------------   接下來(lái)是Servlet的各類接口:  ServletRequest 接口說(shuō)明ServletRequest對(duì)于每一個(gè)HTTP請(qǐng)求,Servlet容器都會(huì)創(chuàng)建一個(gè)ServletRequest實(shí)例,并將它傳給Servlet的Service方法。ServletRequest封裝了關(guān)于這個(gè)請(qǐng)求的信息?! 〕S玫姆椒ㄓ校骸   》椒ㄕf(shuō)明public int getContentLength()返回請(qǐng)求主體的字節(jié)數(shù)。public java.lang.String getContentType()返回請(qǐng)求主體的MIME類型。public java.lang.String getParameter(java.lang.String name)返回指定請(qǐng)求參數(shù)的值public java.lang.String getProtocol()返回這個(gè)HTTP請(qǐng)求的協(xié)議名稱和版本  ServletResponse接口說(shuō)明ServletResponse該接口表示一個(gè)Servlet響應(yīng)。在調(diào)用Servlet的Service方法前,Servlet容器首先創(chuàng)建一個(gè)ServletResponse,并將它作為第二個(gè)參數(shù)傳給Service方法。ServletResponse隱藏了向?yàn)g覽器發(fā)送響應(yīng)的復(fù)雜過(guò)程?! 〕S玫姆椒ǎ骸》椒ㄕf(shuō)明getWriter()返回了一個(gè)可以向客戶端發(fā)送文本的java.io.PrintWriter。默認(rèn)情況下,PrintWriter對(duì)象使用ISO-8859-1編碼。setContentType(“type”)設(shè)置響應(yīng)的內(nèi)容類型,并將”text/html”作為一個(gè)參數(shù)傳入。如果沒(méi)有設(shè)置相應(yīng)內(nèi)容類型,有些瀏覽器就會(huì)將HTML標(biāo)簽顯示為普通文本?! ervletConfig  接口說(shuō)明ServletConfig用于存儲(chǔ)關(guān)于Servlet的配置信息。當(dāng)Servlet容器初始化Servlet時(shí),Servlet容器會(huì)給Servlet的init()方法傳入一個(gè)ServletConfig。ServletConfig封裝可以通過(guò)@WebServlet或描述符傳給Servlet的配置信息。   常用的方法: 方法說(shuō)明java.lang.String getInitParameter(java,lang.String name)為了從Servlet內(nèi)部獲取到初始參數(shù)的值,要在Servlet容器傳給Servlet的init方法的ServletConfig中調(diào)用getInitParameter方法。java.util.Enumration<java.lang.String> getInitParameterNames()返回所有初始參數(shù)名稱的一個(gè)Enumeration。String contactName = servletConfig.getInitParameter(“contactName”)獲取contactName參數(shù)值  ServletContext接口說(shuō)明ServletContext每個(gè)Web應(yīng)用程序只有一個(gè)上下文,所以ServletContext可以存儲(chǔ)這個(gè)上下文,并且ServletContext還可以共享從應(yīng)用程序中的所有資料處訪問(wèn)到的信息,并且可以動(dòng)態(tài)注冊(cè)Web對(duì)象,而且是用ServletContext內(nèi)部的Map保存。  常用的方法: 方法說(shuō)明getServletContext().getInitParameter(String name)獲取在項(xiàng)目下的web.xml中設(shè)置context的初始化參數(shù)this.getServletContext().log(“測(cè)試”)在web.xml文件中,使用logger元素來(lái)設(shè)置日志文件getAttribute(String name)/get AttributeNames()獲取ServletContext中的屬性setAttribute(String name, Object object)設(shè)置ServletContext中的屬性removeAttribute(String name)移除ServletContext中的屬性  GenericServlet接口說(shuō)明GenericServletGenericServlet實(shí)現(xiàn)了Servlet和ServletConfig接口。將init方法中的ServletConfig賦給一個(gè)類級(jí)變量,以便可以通過(guò)getServletConfig獲取,為Servlet接口中的所有方法提供默認(rèn)的實(shí)現(xiàn),而且提供包括ServletConfig中的方法?! ttp Servlets    接口說(shuō)明HttpServletHttpServlet類覆蓋了javax.servlet.GenericServlet類。使用HttpServlet時(shí),還要借助分別代表Servlet請(qǐng)求和Servlet響應(yīng)的HttpServletRequest和HttpServletResponse對(duì)象。而HttpServlet與GenericServlet的差別在于,HttpServlet覆蓋的是doGet或者doPost方法,而不是Service方法,而且使用的是HttpServletRequest和HttpServletResponse,而不是ServletRequest和ServletResponse。HttpServletRequest表示HTTP環(huán)境中的Servlet請(qǐng)求HttpServletResponse表示HTTP環(huán)境中的Servlet響應(yīng)  各個(gè)接口常用的方法如下:  接口方法說(shuō)明 HttpServletRequestjava.lang.String getContextPath()返回表示請(qǐng)求上下文的請(qǐng)求URI部分。 HttpServletRequestCookie[] getCookies()返回一個(gè)Cookie對(duì)象的數(shù)組。 HttpServletRequestjava.lang.String getHeader(java.lang.String name)返回指定HTTP標(biāo)題的值。 HttpServletRequestjava.lang.String getMethod()返回生成這個(gè)請(qǐng)求的HTTP方法名稱 HttpServletRequestjava.lang.String getQueryString()返回請(qǐng)求URL中的查詢字符串。 HttpServletRequestHttpSession getSession()返回與這個(gè)請(qǐng)求相關(guān)的會(huì)話對(duì)象。如果沒(méi)有,將創(chuàng)建一個(gè)新的會(huì)話對(duì)象。 HttpServletRequestHttpSession getSession(Boolean create)返回與這個(gè)請(qǐng)求相關(guān)的繪畫對(duì)象,如果有,并且create參數(shù)為True,將創(chuàng)建一個(gè)新的會(huì)話對(duì)象。 HttpServletResponsevoid addCookie(Cookie cookie)給這個(gè)響應(yīng)對(duì)象添加一個(gè)cookie。 HttpServletResponsevoid addHeader(java.lang.String name, java.lang.String value)給這個(gè)響應(yīng)對(duì)象添加一個(gè)header。 HttpServletResponsevoid sendRedirect(java.lang.String location)發(fā)送一條響應(yīng)碼,將瀏覽器跳轉(zhuǎn)到指定的位置。-------------------------------------------------------------------------------------------------------------------------------------------------  當(dāng)用戶提交HTML表單時(shí),在表單元素中輸入的值就會(huì)被當(dāng)作請(qǐng)求參數(shù)發(fā)送到服務(wù)器。HTML輸入域(文本域、隱藏域或者密碼域)或者文本區(qū)的值,會(huì)被當(dāng)作字符串發(fā)送到服務(wù)器??盏妮斎胗蚧蛘呶谋緟^(qū)會(huì)發(fā)送空的字符串?! “鄠€(gè)值的select元素發(fā)出一個(gè)字符串?dāng)?shù)組,可以通過(guò)ServletRequest.getParameterValues進(jìn)行處理。  核查過(guò)的復(fù)選框會(huì)發(fā)送字符串"on"到服務(wù)器,未經(jīng)核查的復(fù)選框則不向服務(wù)器發(fā)送任何內(nèi)容,ServletRequest.getParameter(fieldName)返回null?! 芜x框?qū)⒈贿x中按鈕的值發(fā)送到服務(wù)器。如果沒(méi)有選擇任何按鈕,將沒(méi)有任何內(nèi)容被發(fā)送到服務(wù)器,并且ServletRequest.getParameter(fieldName)返會(huì)null?! ∪绻粋€(gè)表單中包含多個(gè)輸入同名的元素,那么所有值都會(huì)被提交,并且必須利用ServletRequest.getParameterValues來(lái)獲取它們。ServletRequest.getParameter將只返回最后一個(gè)值。