servlet登陆功能实现与思考
servlet实现登陆功能主要是通过get()
方法或者post()
方法接收前端页面输入的参数,然后跟数据库中已有的用户数据进行匹配,匹配上则登陆成功,否则失败。
由此,我觉得假如在这个过程中存在优化方案的话肯定是在这个匹配过程中。匹配过程中决定登陆速率的主要在两个方面,一个是匹配算法,另一个是表结构。匹配算法无非几个过程,先读取表的内容,然后通过for语句进行一一比对,实在没有优化的手段。于是我们可以从表结构下手,关于表结构优化方案,我们从主要从清理僵尸号下手。
人们在注册账号的时候大多数存在一个现象,就是一时心血来潮注册了账号之后不再登陆,每次匹配要匹配这些账号实在是浪费资源,但我们又不能将其从表中清除,因此我们应该设计一个算法使僵尸账号自动地被放到表尾。 想出来的解决方案有两个,一个是修改数据结构,让用户每次登入之后表中关于该用户的登陆次数字段加一,然后重新进行一次插入排序。另一个是写一个僵尸回收算法,每隔一段时间对僵尸号进行一次清理,把自上次清理后未在登陆过的账号按序排到表尾。
get()方法和post()方法的区别
get()
方法和post
方法都是http协议上对数据进行操作的方法。主要区别如下:
- 从名字上看,
get()
方法主要用于获取数据,post()
主要用于向服务器提交数据。此外delete()
主要负责删除数据,put()
主要负责更改数据。 -
get()
所能传递的参数是有限的,而post
传递的参数可以说无限的。这主要是受到它们传递参数的方法限制。get()
通过表头传递参数,URL的长度进而限制了它传递参数的数量,而post()
通过正文传递参数,因此可以是无限的参数。 -
get()
方法是不安全的,post
方法是安全的。这个主要也受到各自传递参数的方法影响。get()
通过URL或cookie传递参数,某种意义上是把参数暴露出来,而post()
通过BODY传递则不存在这个问题。 -
get()
能够被缓存,被保存为书签,方便传播,而post()
不行。这种差异是因为get()
方法把参数放进了URL,而post()
不是。 -
get()
限制Form表单的数据集的值必须为ASCII字符;而post()
支持整个ISO10646字符集。 -
get()
的执行效率远比post()
要高。这也是由于两者提交数据的方式不同造成的。
解决get()和post()乱码问题
解决post()乱码问题相对比较简单,只要通过设置post方法的参数对象request和response的setCharacterEncoding="gbk"即可。其中gbk支持简体和繁体,gb2
312只支持简体,而utf-8支持基本所有字体。解决get()乱码问题相对比较麻烦,要更改tomcat的配置文件。进入tomcat文件夹->conf->server.xml,找到conne
ctor标签,在该标签内添加一句语句URIEncoding="gbk"。造成这两种差异的主要原因是 post()方法是通过正文提交参数,get()是通过报头提交参数,而setCha
racterEncoding只能设置正文的编码格式,而不能设置报头的编码格式
提交复选框参数
提交复选框的时候只要让获取参数的变量为数组,然后把多个参数同时获取并保存到数组里即可。获取多个参数的方法为getParameterValues("name")
最后总结一句,我觉得get()
和post()
最主要的区别在于get()
是通过报头提交参数,post()
是通过正文提交参数,并由此衍生了各自的安全性、传输数据量等的区别。
PS:以上为小白的学习笔记,包含很多脑洞的想法,各位客官多多包涵,也希望大家能够多多指教晚辈