您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐