spring mvc 结合Hibernate Validator进行服务器验证
2013-07-25 11:03
344 查看
1.概述
在web页面,验证请求参数一般使用jquery Validation 。如果有人恶意绕过页面验证,进行请求,或者js验证规则不好实现,可使用spring mvc和Hibernate Validator进行验证。
2. 源码和配置实例
1,一个实体类User
@Entity @Table(name = "ss_user") public class User extends IdEntity { @NotEmpty private String loginName; //其他属性和验证规则就不多写了 //getter 和setters @NotEmpty(message = "Password must not be blank.") private String password; }persistence相关标签是为了持久化,在此不是必须的
@NotEmpty :hibernate validator的一个规则,表示此属性不能为空
password使用了自定义的错误消息提示
2.控制器
@RequestMapping(value = "/reg", method = RequestMethod.POST) public String login(@Valid User user, BindingResult result) { for (Object object : result.getAllErrors()) { if (object instanceof FieldError) { FieldError fieldError = (FieldError) object; System.out.println(fieldError.getField() + ":" + fieldError.getCode()); } if (object instanceof ObjectError) { ObjectError objectError = (ObjectError) object; } } if (result.hasErrors()) { return "register"; } //accountService.saveUser(user); return "success"; }@Valid 使用JSR303 BeanValidator 验证。hibernate
validator 是 JSR303 BeanValidator 的一个实现
BindResult result 验证结果,可通过接下来的方法遍历查看验证结果。在页面显示的时候,也需要使用它。
3.配置文件 spring-mvc.xml,
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> <mvc:annotation-driven /> <context:component-scan base-package="com.blueinfo.jee.web" /> <mvc:resources location="/static/" mapping="/static/**"/> <!-- 设置freeMarker的配置文件路径 --> <bean id="freemarkerConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="location" value="classpath:freemarker.properties" /> </bean> <!-- 注意:FreeMarker与SpringMVC集成时,其配置一定要放在SpringMVC的配置之前 --> <!-- 否则:在访问"/getUser"时服务器就会报告[HTTP Status 404 - /WEB-INF/jsp/myfree.jsp] --> <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <!-- 指定FreeMarker模板文件目录 --> <property name="templateLoaderPath" value="/WEB-INF/ftl/"/> <property name="freemarkerSettings" ref="freemarkerConfiguration" /> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="prefix" value=""/> <property name="suffix" value=".ftl"/> <property name="contentType" value="text/html; charset=UTF-8"/> <property name="requestContextAttribute" value="ctx"/> </bean>
mvc:annotion-driven 配置了此项才能才能在controller中使用@Valid
其它都是普通的spring mvc配置,主要配置freemarker作为页面模板。
4,页面register.ftl
<#import "spring.ftl" as spring /> -------------------------1 <html> <head> <#assign ct = ctx.contextPath > <title>登陆页</title> <link href="${ct}/static/bootstrap/2.3.0/css/bootstrap.min.css" rel="stylesheet" media="screen"> <link href="${ct}/static/jquery-validation/1.11.0/validate.css" type="text/css" rel="stylesheet" /> <style type="text/css"> body { padding-top: 40px; padding-bottom: 40px; background-color: #f5f5f5; } .form-signin { max-width: 300px; padding: 19px 29px 29px; margin: 0 auto 20px; background-color: #fff; border: 1px solid #e5e5e5; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.05); -moz-box-shadow: 0 1px 2px rgba(0,0,0,.05); box-shadow: 0 1px 2px rgba(0,0,0,.05); } .form-signin .form-signin-heading, .form-signin .checkbox { margin-bottom: 10px; } .form-signin input[type="text"], .form-signin input[type="password"] { font-size: 16px; height: auto; margin-bottom: 15px; padding: 7px 9px; } </style> </head> <body> <div class="container"> <form class="form-signin" id="loginForm" action="reg" method="post"> <h2 class="form-signin-heading">请填写注册信息</h2> <@spring.bind "user.loginName" /> ----------------------2 <#list spring.status.errorMessages as error> <font style="color:red;"><b>${error}</b></font> <br> </#list>----------------3 用户名:<input type="text" class="input-block-level " placeholder="" name="loginName"> 邮箱:<input type="text" class="input-block-level " placeholder="Email address" name="email"> <@spring.bind "user.password" /> ---------------------4 <#list spring.status.errorMessages as error> <font style="color:red;"><b>${error}</b></font> <br> </#list> ------------5 密码:<input type="password" class="input-block-level " placeholder="Password" name="password" > <button class="btn btn-large btn-primary" type="submit">提交</button> </form> </div> <script src="${ct}/static/jquery/jquery-1.9.1.min.js" type="text/javascript"></script> <script src="${ct}/static/bootstrap/2.3.0/js/bootstrap.min.js"></script> <script src="${ct}/static/jquery-validation/1.11.0/jquery.validate.min.js" type="text/javascript"></script> <script src="${ct}/static/jquery-validation/1.11.0/messages_bs_zh.js" type="text/javascript"></script> <script> $(document).ready(function() { $("#loginForm").validate(); }); </script> </body> </html>
在1处,引用freemarker的宏,官方建议引用为spring
在2处,绑定实体类对象的loginName属性,使得spring.status中的信息是和loginName相关,包括(errorMessages,value,expression),我是这样理解的,有不对的地方请不吝指教。
在3处,提取loginName的验证信息,显示出来。
4和5重复2,3动作。不过是针对password属性。
结果图
这是 不填写任何数据提交后返回的页面。用户名显示的默认错误信息,密码显示的是自定义的信息提示。
成功页面就不贴了,只是一个显示页面。
3. 参考手册
hibernate validator:http://docs.jboss.org/hibernate/validator/4.2/reference/en-US/html/validator-usingvalidator.html#validator-defineconstraints-builtin\spring 模板的form相关宏操作:http://static.springsource.org/spring/docs/2.5.x/reference/view.html#view-velocity-forms
相关文章推荐
- spring mvc 通过bean获取form的参数和并且进行服务器验证 ,而且支持多个文件上传的用法。html使用form_data
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。
- 服务器控件使用js进行验证(选择地调用后台事件)
- 调用WCF的问题:调用方未由服务器进行身份验证
- WCF:调用方未由服务器进行身份验证
- 在PC上安装虚拟机进行网络实验。如何规划,进行安装DHCP服务实验。还有dns服务器的验证
- 【爬虫】WebMagic结合Spring mvc爬取数据进行存储
- android利用get提交数据到服务器进行验证
- RADIUS 服务器进行 MAC 验证
- javascript结合正则进行表单验证1
- c#使用pop3服务器进行邮箱验证
- 手机客户端和服务器通信时如何安全高效的进行身份验证
- ASP.NET MVC结合jQuery插件进行数据验证
- javascript结合正则进行表单验证2
- ASP.NET MVC结合jQuery插件进行数据验证
- Spring mvc + Spring Security 拦截 Restful格式的URL并进行验证,支持Remember me token数据库存储
- IIS7服务器中如何配置FTP7和IIS管理凭据方式进行验证
- 交叉验证结合二次多维非线性无约束寻优法对LSSVM进行参数选取
- 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用 ClientScriptManager.RegisterForEventValidation 方法来注册回发或回调数据以进行验证。