spring mvc 结合Hibernate Validator进行服务器验证

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值