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