讨论一下用户输入数据没有通过逻辑严正的时候,如何安全的保持表单状态。
首先,要在每个动作(.do)上验证权限,可以在form的validate中验证,权限是一切操作的前提。
个人感觉validate验证框架的使用总是怪怪的,引入太多xml,不符合oo习惯,这里可以创建自己的验证类,比如创建validate包,来封装验证方法,在form的validate中调用。
通过了权限和基本格式的验证,下面还要通过逻辑上的验证,这点需要在handler层里面做了(也就是业务逻辑层的最底层,被action调用)。如果验证失败,可以返回自定义错误,被action捕获到,返回页面。
这时,页面还需要保持住刚才的状态,输入的数据不能丢失,或者只把错误的数据删掉。
比如,我们注册用户,因为用户名已经有了,所以要换名,页面应该显示“名字已存在”,并保留原来的密码,名字置空或不改。这需要把form的范围设置成session,并且有两种情况:一是提交和显示的都是一个form,这时只能在配置文件里把scope改成session,较死板;二是不使用一个form,比如提交了一个用户名来查询用户相关信息,可以session.setAttribute。Jsp把form显示出来,用户填写,提交,验证失败了直接返回页面或者把错误的信息置为空字符串再重新session.setAttribute再返回页面,直到成功就removeAttribute。
如果用户直接输入网页的地址呢?这肯定是要屏蔽掉的。有一种方法就是在页面引入逻辑,可以进行权限验证和判断某form是否存在等。还有一种方法就是用struts标签单纯看form是否存在,不存在就redirect。由于在每个动作上都使用了权限验证,所以第二种方法我觉得足够了。
如果恶意伪造代码欺骗服务器,由于仍然没有权限,就不能执行任何动作。
最后还要说,不存在100%安全的代码,是人做的就会被人破解。