【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】