挨踢部落故事匯(28):夢(mèng)醒在Java進(jìn)階處
原創(chuàng)【51CTO.com原創(chuàng)稿件】夢(mèng)想還是要有的,萬(wàn)一見(jiàn)鬼了呢,但你永遠(yuǎn)見(jiàn)不到鬼。今宵夢(mèng)醒何“處”,學(xué)習(xí)路長(zhǎng)路漫漫。
背鍋蝸牛是個(gè)Java瘋狂熱愛(ài)者,他的Java進(jìn)階夢(mèng)分享了如何防止小的問(wèn)題產(chǎn)生的大問(wèn)題,以及一些學(xué)習(xí)感悟。需要不斷的體會(huì)和實(shí)踐,起一個(gè)拋磚引玉的作用。從表單交互問(wèn)題,圖片上傳問(wèn)題、服務(wù)器問(wèn)題,加密問(wèn)題、數(shù)據(jù)庫(kù)等問(wèn)題進(jìn)行了詳細(xì)闡述。希望能對(duì)大家有一些幫助。
背鍋蝸牛·JavaEE開(kāi)發(fā)工程師
背鍋蝸牛。該不該擱下重重的殼|尋找到底哪里有藍(lán)天|隨著輕輕的風(fēng)輕輕的飄|
背鍋蝸牛是個(gè)懷著架構(gòu)師的夢(mèng)想做著Java開(kāi)發(fā)的工作,兼著DBA和運(yùn)維職責(zé)的搞笑小青年,踩著他的滑板鞋溜達(dá)摩擦的過(guò)著怡然自得的愜意生活。
夢(mèng)想還是要有的,萬(wàn)一見(jiàn)鬼了呢,但你永遠(yuǎn)見(jiàn)不到鬼。今宵夢(mèng)醒何“處”,學(xué)習(xí)路長(zhǎng)路漫漫。
與夢(mèng)相遇。學(xué)習(xí)需要目標(biāo)。“別再學(xué)習(xí)Java了,Java末落了,C語(yǔ)言才是王道” 背鍋蝸牛大學(xué)好友說(shuō)。話說(shuō)真的感謝他,沒(méi)有好友的勸說(shuō)背鍋蝸牛也沒(méi)有明確的目標(biāo)。他愛(ài)上Java是因?yàn)閳?bào)名參加了學(xué)校舉辦的網(wǎng)頁(yè)設(shè)計(jì)大賽,看完了網(wǎng)頁(yè)三劍客,便可以草草的作出一個(gè)網(wǎng)頁(yè)。與此同時(shí)學(xué)校開(kāi)設(shè)了Java課,背鍋蝸牛就被Java中的圖形用戶界面所吸引,于是乎他開(kāi)始瘋狂的自學(xué)Java,尋找Java資料和視頻,就這樣慢慢的喜歡上了Java這門(mén)語(yǔ)言。
與夢(mèng)相識(shí)。學(xué)習(xí)需要耐心。學(xué)習(xí)是辛苦的,需要你找到興趣點(diǎn),需要持之以恒。自從喜歡上了Java這門(mén)語(yǔ)言,背鍋蝸牛有空的時(shí)候就會(huì)背著電腦去圖書(shū)館看書(shū)、敲代碼,不感興趣的課也會(huì)看Java書(shū)籍。當(dāng)時(shí)一些入門(mén)的書(shū)籍有《瘋狂Java講義》、 《Java語(yǔ)言程序設(shè)計(jì)(基礎(chǔ)篇 原書(shū)第8版)》、《Java核心技術(shù)(卷1、卷2)》等。有了Java開(kāi)發(fā)基礎(chǔ),出于對(duì)Java的狂熱,背鍋蝸牛開(kāi)始學(xué)習(xí)Java進(jìn)階篇,《Java語(yǔ)言程序設(shè)計(jì):進(jìn)階篇(原書(shū)第8版)》、《Java常用算法手冊(cè)》、《Java數(shù)據(jù)結(jié)構(gòu)和算法第二版、算法(第4版)》、
光看書(shū)和視頻,沒(méi)有實(shí)踐并不會(huì)掌握全部技術(shù),于是背鍋蝸牛想著應(yīng)該參加下比賽,檢驗(yàn)下自己。但獨(dú)木難成舟。出生牛犢不怕虎,他自薦參加院校老師組織的項(xiàng)目、比賽,并在全國(guó)信息技術(shù)大賽中獲得全國(guó)二等獎(jiǎng)。學(xué)習(xí)需要你花費(fèi)時(shí)間,花費(fèi)精力,學(xué)習(xí)要耐的住性子,需要興趣。并不代表你取的一點(diǎn)小成就就忘乎所以,參加了這場(chǎng)比賽,他知道原來(lái)大神那么的多,自己是那么的菜,人家學(xué)的那么深,不但有幾年的Android客戶端和IOS客戶端開(kāi)發(fā)經(jīng)驗(yàn),還有大的后臺(tái)系統(tǒng)的支持。還是別人家的學(xué)校好,背鍋蝸牛還需要努力。要學(xué)習(xí)JavaEE方面的框架。
與夢(mèng)相背。學(xué)習(xí)并不是一帆風(fēng)順。為了追求技術(shù)上的進(jìn)步。背鍋蝸牛申請(qǐng)調(diào)劑到一個(gè)普通本科學(xué)校讀取研究生。出于對(duì)技術(shù)的熱愛(ài),他選擇了從未見(jiàn)過(guò)面的導(dǎo)師?;蛟S是對(duì)Java的喜歡,或許是為了賭口氣。他本科畢業(yè)時(shí)淘了本5大洋的JavaEE書(shū)籍,在研究生前的那個(gè)暑假并沒(méi)有那么放松,看著JavaEE的視頻和書(shū)籍,做著筆記,研究生好好參加項(xiàng)目,好好提升自身實(shí)力。結(jié)果是研究生的學(xué)校從未開(kāi)設(shè)過(guò)Java課程,所有的項(xiàng)目都使用C#。研究生期間,沒(méi)事的時(shí)候就看看Java設(shè)計(jì)模式,它才是經(jīng)典中的經(jīng)典。后來(lái)因?yàn)轫?xiàng)目的需要背鍋蝸牛參加了一個(gè)C#項(xiàng)目的開(kāi)發(fā),開(kāi)始的時(shí)候被告知這個(gè)項(xiàng)目快要結(jié)束了,需要寫(xiě)些代碼優(yōu)化下,結(jié)果是他從一個(gè)代碼優(yōu)化的,變成了寫(xiě)業(yè)務(wù)邏輯的,又變成了一個(gè)寫(xiě)前端的。“這個(gè)功能很簡(jiǎn)單,網(wǎng)上都有現(xiàn)成的代碼”,“這個(gè)很簡(jiǎn)單,明天能不能完成”。不屬于他的鍋要被,屬于他的鍋也要背”??旖Y(jié)束的時(shí)候背鍋蝸牛選擇了退出,當(dāng)時(shí)不知道是否太任性。他的第二個(gè)項(xiàng)目也因?yàn)榕c其他的項(xiàng)目的沖突,最終被pass了。懷才不遇的他仍選擇繼續(xù)前行。就在那年他接觸到了Matlab,大數(shù)據(jù),Hadoop和Mahout等。學(xué)會(huì)了如何搭建服務(wù)器集群、如何實(shí)現(xiàn)數(shù)據(jù)庫(kù)的讀寫(xiě)分離、分庫(kù)分表等。夢(mèng)想不是夢(mèng),需要真心的付出。
項(xiàng)目中的技術(shù)瓶頸,背鍋蝸??偨Y(jié)了5個(gè)方面
一、表單交互問(wèn)題
A.表單重復(fù)提交:測(cè)試不充分,修改表單信息時(shí),按鈕沒(méi)有做disable(置灰),在網(wǎng)速較慢的時(shí)候,導(dǎo)致用戶可能多次重復(fù)點(diǎn)擊,數(shù)據(jù)庫(kù)中有重復(fù)記錄,數(shù)據(jù)庫(kù)壓力增大。對(duì)于大的在線促銷活動(dòng)和秒殺、搶單活動(dòng)有可能拖垮整個(gè)網(wǎng)站。
解決方法:1、防止表單重復(fù)提交;2、按鈕disable事件 ;3、使用數(shù)據(jù)庫(kù)緩存降低數(shù)據(jù)庫(kù)的壓力;4、系統(tǒng)使用高可用架構(gòu),搭建服務(wù)器集群;5、簡(jiǎn)單的方法:將活動(dòng)和網(wǎng)站隔離開(kāi),單獨(dú)搭建一個(gè)高可用的服務(wù)。6、對(duì)促銷活動(dòng)或者秒殺活動(dòng)需要防止脫離頁(yè)面直接調(diào)用服務(wù)等。
B.文本框處理:沒(méi)有對(duì)輸入文本框的內(nèi)容進(jìn)行過(guò)濾,對(duì)某些輸入框操作進(jìn)行限制,可能導(dǎo)致輸入的文本框的內(nèi)容是可以執(zhí)行的,會(huì)導(dǎo)致安全問(wèn)題;某些文本框的內(nèi)容是可以復(fù)制的等。
解決方法:對(duì)所有要輸入的文本框內(nèi)容進(jìn)行特殊字符的過(guò)濾,防止腳本注入問(wèn)題和XSS問(wèn)題、SQL注入問(wèn)題;根據(jù)實(shí)際情況,禁止某些文本框的復(fù)制等操作,例如:對(duì)密碼框使用password屬性,不明文顯示,禁止密碼框的復(fù)制操作,密碼加密等;使用正則表達(dá)式過(guò)濾輸入等。
C.上傳文件的過(guò)濾:對(duì)文件的格式和后綴名沒(méi)有過(guò)濾和限制,有的上傳的文件是可以執(zhí)行的腳本。例如:含有獲取cookie信息的js后綴的腳本文件,對(duì)使用cookie存儲(chǔ)用戶信息的來(lái)說(shuō)可能存在cookie欺騙。
解決方法:1.對(duì)一般上傳的文件限制后綴名上傳;2.復(fù)雜點(diǎn)的對(duì)上傳的文件的內(nèi)容進(jìn)行判斷
二、圖片上傳問(wèn)題
A.圖片上傳和顯示問(wèn)題:項(xiàng)目中需要有上傳圖片的功能,圖片如何顯示和處理?
解決方法:1.圖片太大可以使用圖片截取插件,截取部分圖片上傳。2.圖片太大,不能截取,要按照指定的大小顯示,可以使用Js等比例縮小圖片上傳(實(shí)際文件大小并沒(méi)有變)。3. 利用H5 canvas畫(huà)布技術(shù)或者相應(yīng)的圖片處理Jar包(Java以前的版本中rt.jar包中含有圖片處理函數(shù))進(jìn)行圖片數(shù)據(jù)化為 base64 的字符串,***傳到后臺(tái),后臺(tái)將base64的字符串?dāng)?shù)據(jù)進(jìn)行圖像化儲(chǔ)存;canvas還可以生成圖片的縮略圖(實(shí)際是按照?qǐng)D片的質(zhì)量的百分比重繪圖片),不要縮的太小否則圖片會(huì)失真。
B.圖片的存儲(chǔ)問(wèn)題:圖片上傳之后如何存儲(chǔ)?
解決方法:1.很少的上傳圖片的需求,可以在后臺(tái)建立一個(gè)文件夾存儲(chǔ)上傳的圖片即可。2.對(duì)系統(tǒng)中有比較大的圖片存儲(chǔ)需求,可以使用單獨(dú)的圖片存儲(chǔ)服務(wù)器,比如使用nginx或者apache服務(wù)器,采用靜態(tài)分離技術(shù)。對(duì)于要可靠保存的圖片可以將圖片服務(wù)器的內(nèi)容最終備份到其他服務(wù)器上。3.可以對(duì)圖片進(jìn)行base64處理后,可以存儲(chǔ)在非關(guān)系行數(shù)據(jù)庫(kù)Redis中。
圖片上傳的小提示:
(1)使用form表單上傳文件不要忘記: enctype=”multipart/form-data”。
(2)文件上傳路徑要定義好,沒(méi)有時(shí)要?jiǎng)?chuàng)建好路徑。
(3)文件的命名可以設(shè)置下,文件的內(nèi)容和名稱可以檢查下,防止上傳的文件和文件名中含有可執(zhí)行的腳本命令。
C.驗(yàn)證碼問(wèn)題:驗(yàn)證碼可以防止惡意注冊(cè),可以自己編寫(xiě)驗(yàn)證碼也可以使用成熟的驗(yàn)證碼生成插件。為了防止惡意注冊(cè),可以使用賬號(hào)綁定手機(jī)或郵箱等。
三、服務(wù)器問(wèn)題
A.服務(wù)調(diào)用問(wèn)題:webservice接口調(diào)用,部署到服務(wù)器后,webservice空指針,原因spring容器沒(méi)有注入遠(yuǎn)程WS對(duì)象。
解決方法:用spring的factoryBean對(duì)webservice接口創(chuàng)建進(jìn)行定義,調(diào)用getObject創(chuàng)建ws的bean。
B.服務(wù)調(diào)用的跨域問(wèn)題: 不同服務(wù)或網(wǎng)站之間的調(diào)用就牽扯到跨域問(wèn)題。跨域,指的是瀏覽器不能執(zhí)行其他網(wǎng)站的腳本。它是由瀏覽器的同源策略造成的,是瀏覽器對(duì)JavaScript施加的安全限制。所謂同源是指:域名(www.baidu.com),協(xié)議(http/https),端口(80/8080)均相同。
解決方法:(1)使用javascript中的src。Javascript中的script和img標(biāo)簽中的src可以跨域??梢詫?shù)據(jù)附在src中傳遞。
(2)使用服務(wù)jquery中的dataType:jsonp屬性(將下圖的dataType:xml改成jsonp即可),其原理就是src。
(3)直接封裝成xml傳遞,如下的data:<soapenv></soapenv>。
(4)其他的方法:自行g(shù)oogle,百度。
C.網(wǎng)站的會(huì)話管理:
分布式會(huì)話管理解決方案有Session Stick(會(huì)話保持),Session復(fù)制,Session集中管理,基于Cookie管理。
四、加密問(wèn)題
加密相關(guān):保證cookie的安全使用cookie時(shí)加鹽。***的用來(lái)保護(hù)密碼的方式是采用加鹽密碼散列 (salted password hasing)。Hash 算法是一種把任何數(shù)量的數(shù)據(jù)轉(zhuǎn)換為一個(gè)指定長(zhǎng)度的無(wú)法逆轉(zhuǎn)的指紋的功能。加密的hash 算法有:SHA256,SHA512,RipeMD 和 WHIRLPOOL 等。
五、數(shù)據(jù)庫(kù)問(wèn)題
Mysql忘記密碼:
# /etc/init.d/mysql stop
# mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
# mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root' and host='root' or host='localhost';//把空的用戶密碼都修改成非空的密碼就行了。
mysql> FLUSH PRIVILEGES;
mysql> quit # /etc/init.d/mysqld restart
# mysql -uroot -p
Enter password: <輸入新設(shè)的密碼newpassword>
MySql5.6操作時(shí)報(bào)錯(cuò):You must SET PASSWORD before executing this statement。
解決方法:
mysql> SET PASSWORD = PASSWORD('123456');
Query OK, 0 rows affected (0.03 sec)
mysql> create database roger;
Query OK, 1 row affected (0.00 sec)
也就是用mysql> SET PASSWORD = PASSWORD('123456');這句話重新設(shè)置一次密碼!
與夢(mèng)相知。學(xué)習(xí)不要自大。技術(shù)你懂的越多,你會(huì)發(fā)現(xiàn)實(shí)際懂的越少。勿要一葉障目,知識(shí)是一個(gè)慢慢積累的過(guò)程,只有當(dāng)你看的多了,積累的多了,才能對(duì)有的事有自己的看法。才能讓你在面試或者職位的升遷上有一些優(yōu)勢(shì)。知識(shí)是相互聯(lián)系的,你掌握一門(mén)知識(shí)往往是不夠的。比如:說(shuō)你想當(dāng)一個(gè)Java開(kāi)發(fā)工程師,你需要懂操作系統(tǒng),數(shù)據(jù)庫(kù),網(wǎng)絡(luò)等。知識(shí)要活學(xué)活用,哪怕是開(kāi)玩笑。
與夢(mèng)相愛(ài)。學(xué)習(xí)是一個(gè)積累的過(guò)程。你此時(shí)的辛苦,可能是你明天的碩果。技術(shù)之路上充滿各種挫折和失敗。不停的業(yè)務(wù)需求變更,徹夜的通宵達(dá)旦,需要“對(duì)著干”的決心和勇氣。做的好不見(jiàn)的有什么獎(jiǎng)勵(lì),做的不好肯定挨批甚至炒魷魚(yú)。知識(shí)需要不停的更新和積累,是多少個(gè)通宵的不眠。時(shí)間如梭,明日夢(mèng)醒何處,是沉溺于夢(mèng)想中,還是沉睡在夢(mèng)中。他已在夢(mèng)想的路上。
【寫(xiě)在***】
作為一個(gè)JavaEE開(kāi)發(fā)工程師,幽默還是要有的,來(lái)段詼諧的Java串燒來(lái)結(jié)束背鍋蝸牛的故事吧。
七夕我和你只差一句話的距離,我想等你來(lái)找我。而你卻不明白我的心,卻總是說(shuō):show me the code。寧愿new一個(gè)對(duì)象(實(shí)例化對(duì)象),都不愿引用我這個(gè)對(duì)象(對(duì)象的調(diào)用和引用)。寧愿copy和clone一個(gè)對(duì)象(java對(duì)象的復(fù)制與clone)都不發(fā)短信給我?guī)绎w。不愿掏錢(qián)seriable(對(duì)象的序列化)一個(gè)flower我怎能接受你的心意(對(duì)象傳遞的時(shí)候需要序列化才能傳輸)。我說(shuō)你和我只差一步,你說(shuō)是什么呢?你寧愿呆在自己的局部的圈子里(局部變量),都不愿來(lái)到全局的圈子里(全局變量),讓我看見(jiàn)你。愛(ài)在心里口難開(kāi),或許你不善言辭,你可以找一個(gè)快遞小哥(代理模式),來(lái)表達(dá)你的心意。女生的心里你別猜,你不知道我喜歡什么,你可以買(mǎi)個(gè)鮮花與巧克力組合(組合模式)或者其他的東西來(lái)討好我(適配器模式),使用匿名(匿名類)的方式來(lái)反射你的心意(反射機(jī)制)。我是那個(gè)唯一(hashcode和equals判斷)的我。只要你需要我,我永遠(yuǎn)都是唯一(單例模式)。
如果你也愿意分享你的故事,請(qǐng)加51CTO開(kāi)發(fā)者QQ交流群 627843829聯(lián)系群主小官,期待你精彩的故事!
【51CTO原創(chuàng)稿件,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文作者和出處為51CTO.com】