SpringValidator校验解析_第1页
SpringValidator校验解析_第2页
SpringValidator校验解析_第3页
SpringValidator校验解析_第4页
SpringValidator校验解析_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、表单校验解析表单校验的必要性基于Web的应用,必须对用户提交的表单进行前台和后台的校验。前台验证主要看需求和用户体验。用户输出错误的表单参数,可以马上得到提醒,同时减轻服务器压力。后台验证注重的是安全性。防止恶意用户向后台提交非法数据。后台验证是必要的,前台验证是充分的。前台的校验通常是通过html,javascript等前台的技术来限制用户的输入,并对用户做出友好的提示和建议,它的最大好处是快。在表单数据尚未提交到后台应用程序即能做出校验并提示给用户,用户可以更改或者重新输入数据。这种方式的用户体验好。但是,仅仅前台的校验是不能保证提交数据的合法性的。尽管现在有一些前台脚本的压缩和加密技术可

2、以初步模糊前台的脚本,不过通过一定的手段是可以恢复本来面目的。这样我们的前台就完全暴露在用户面前了。用户就可以通过firebug之类的工具篡改前台页面和数据,甚至可以向后台直接提交非法数据。如果后台不再对数据进行校验,轻则程序会崩掉,重则被不良企图者利用,这会是致命的。后台校验通常是对客户端提交的表单进行逻辑校验。校验失败则向前台返回错误信息,校验通过之后才允许进一步执行程序。后台校验需要用户提交表单之后,才进行校验,能有效地保证提交数据的合法性。后台校验的用户体验较差,同时在后台频繁地校验表单参数,加重了服务端的负担。所以,对于一个Web项目,前台和后台的表单校验,都是必不可少的。前后台校验

3、的统一2.1. 增删改查2.1.1. 查询Web项目最常用的操作是增删改查。查询操作应使用Http GET提交表单,增加、删除、修改操作应该使用Http POST提交表单。查询操作的主要漏洞是SQL注入。为了防止SQL注入,Web应用程序访问数据库时,不应该使用字符串拼接的形式。参数化查询可以防止SQL注入。参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值。即使用户传入非法数据,查询结果会为空,并不会更改数据库。所以,查询操作只需进行前台校验,表单提交方式

4、为GET。. 增删改增删改操作会更改数据库。为了防止恶意用户插入非法数据,必须在后台进行表单校验。同时,为了加强用户体验和减轻服务器负担,需要结合前台校验。所以,增删改操作应进行前后台校验,表单提交方式为POST。2.2 字符集编码使用不同的字符集编码,汉字的长度进行不同处理。如果前台使用GBK编码,表单提交到后台服务端时,在进行编码转换之前,汉字会存储为两个字符。然而,在进行前台校验时,浏览器(IE9, Firefox, Google Chrome)把汉字处理成一个字符。数据库的字符串字段类型,建议选用nvarchar和nchar。因为varchar和char会把汉字存储为两个字符。My S

5、QL, SQL server和Oracle均支持nvarchar和nchar。前台、后台和数据库对汉字长度的处理不一致,是一件很让开发人员头疼的事情。为了解决这个问题,客户端、服务端和数据库,应该统一使用utf-8编码,所有的字符(包括中文)都应该处理为1。前后台检验的具体实现样例前台使用jquery.validate和html进行校验。后台校验整合了Spring 3 Validator和Hibernate Validator。Tips: JSR-303是一个接口标准,并不是Spring框架的一部分。Spring 3支持了JSR-303标准。Hibernate Validator是JSR-30

6、3的一个实现。一个表单对应一个后台FormBean, 即使表单只有一个参数,我们也应该创建一个FormBean。前台页面通过HTTP POST提交的数据,都应该直接导入FormBean中。尽可能地避免req.getParameter()的写法。 创建部门的ftl页面代码:新建部门账户$tips错误$tips客户名称*部门账户编号部门账户的编号,最长不超过16位字符。*部门账户名称部门账户的名称,最长不超过32位字符。取消functioninitialize()$(#objBean).validate(rules:departmentId:required:true,maxlength:16,d

7、epartmentName:required:true,maxlength:32);部门Controller里面的创建部门POST方法:/*新增部门账户,post方法。*/SuppressWarnings(unchecked)RequestMapping(value=/market/org/createorg,method=RequestMethod.POST)publicModelAndViewcreateOrg(ModelAttribute(map)HashMapmap,ValidCreateOrgFormorgForm,BindingResultresult,HttpServletReq

8、uestreq,HttpServletResponseres)/表单参数校验if(result.hasErrors()req.setAttribute(tips,表单参数有误,请检查后重新提交!);returnthis.listAllOrganization(req,res,query);ModelAndViewmav=newModelAndView();OrganizationBeanbean=newOrganizationBean();bean.setCustomerId(orgForm.getCustomerId();bean.setCustomerName(orgForm.getCus

9、tomerId_name();bean.setDepartmentId(orgForm.getDepartmentId();bean.setDepartmentName(orgForm.getDepartmentName();ResponseBeanresponseBean=orgMgrService.createOrg(bean);/记录日志map.put(resBean,responseBean);if(!responseBean.getResultCode().equals(0)mav.addObject(tips,responseBean.getResultDec();/查询客户res

10、ponseBean=orgMgrService.listAllCustomer();ListcustList=null;if(CommonConst.OPER_SUCCESS_CODE.equals(responseBean.getResultCode()custList=(List)responseBean.getResultObj();mav.addObject(custList,custList);else;mav.addObject(ftlName,organization/OrgCreateMgr.ftl);mav.setViewName(/mainfrm.ftl);returnma

11、v;elsereq.setAttribute(departmentName,null);returnlistAllOrganization(req,res,query);方法里的参数CreateOrgFormorgForm是表单参数,它是一个FormBean。前台提交的表单参数会自动匹配CreateOrgForm中的属性名,并把相应的数据传入CreateOrgForm的属性值中。CreateOrgForm的属性名必须和前台表单的标签id相同。在参数CreateOrgFormorgForm前添加注解Valid。通过Valid注解,Spring MVC会根据FormBean的限制条件,进行数据校验

12、。校验结果设置进紧跟其后的BindingResultresult参数中。在Controller方法体的最前面,插入以下代码:/表单参数校验if(result.hasErrors()req.setAttribute(tips,表单参数有误,请检查后重新提交!);returnthis.listAllOrganization(req,res,query);后台校验出错时,我们并不需要返回具体错误。因为后台校验主要是基于安全考虑的,不应该给恶意用户提供太多的信息。表单参数已经在前台进行校验,并且会在前台进行相应的提示。在用户正常操作的前提下,经过了前台校验的表单,一定能通过后台验证的。创建部门的For

13、mBean代码如下:packagecom.sunguard.mvc.storage.market.formbean;importorg.hibernate.validator.constraints.Length;importorg.hibernate.validator.constraints.NotBlank;publicclassCreateOrgFormNotBlankprivateStringcustomerId;privateStringcustomerId_name;NotBlankprivateStringdepartmentId;NotBlankLength(max=32)p

14、rivateStringdepartmentName;publicStringgetCustomerId()returncustomerId;publicvoidsetCustomerId(StringcustomerId)this.customerId=customerId;publicStringgetCustomerId_name()returncustomerId_name;publicvoidsetCustomerId_name(StringcustomerId_name)this.customerId_name=customerId_name;publicStringgetDepa

15、rtmentId()returndepartmentId;publicvoidsetDepartmentId(StringdepartmentId)this.departmentId=departmentId;publicStringgetDepartmentName()returndepartmentName;publicvoidsetDepartmentName(StringdepartmentName)this.departmentName=departmentName;FormBean的属性前使用的限制注解,如NotBlank、Length(max=32)等,是Hibernate Va

16、lidator的注解。总结:前台和后台验证都必不可少。前台校验侧重于用户体验和减轻服务器负担,后台校验更注重安全性。查询操作使用HTTP GET提交表单,Web程序的查询应该为参数化查询。增删改操作使用HTTP POST提交表单,每个表单对应一个FormBean,在FormBean中添加Hibernate Validator的限制注解。Controller中的POST方法参数中,表单参数前面必须添加Valid注解BindResult result参数必须紧跟表单参数之后。FormBean的属性名必须与前台表单里面的标签id相同。表单校验出错,只需把错误信息返回到当前模块的查询页面。Tips通过

17、req.setAttribute(tips,表单参数有误,请检查后重新提交!);.语句设置。进一步建议:与记录日志的整合每个表单都对应一个FormBean,任何增删改操作都应该在日志中留下记录,即每次进入POST方法都必须记录日志。我们可以定义一个抽象父类LogInfo。publicabstractLogInfoprivateStringoperType;privateStringoperName;privateStringoperDescripton;privateintoperResultCode;/gettersandsetters.然后,每个FormBean都去继承LogInfo.在每

18、个Controller的POST方法里面,通过set方法为这四个父类属性设值。记录日志所需要的值可以从这四个属性中获取。Spring Validator和Hibernate Validator的比较:Spring Framework自带的validation的做法是,继承父类Validator,为每个FormBean绑定一个校验类。具体做法如下:publicclassPersonprivateStringname;privateintage;/theusualgettersandsetters.对应的校验类如下:publicclassPersonValidatorimplementsValidatorpublicbooleansupports(Classclazz)returnPerson.class.equals(clazz);publicvoidvalidate(Objectobj,Errorse)ValidationUtils.rejectIfEmpty(e,name,name.empty);Personp=(Person)obj;if(p.getAge()110)e.rejectValue(age,too.darn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论