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