怎么在spring mvc 框架中 写登录验证的验证码

怎么在spring mvc 框架中 写登录验证的验证码,第1张

<form id="loginInputForm" method="post">

<hr/>

用户名:<input type="text" id="accountNumber" name="accountNumber" value="" />

<hr/>

密 码:<input type="password" id="password" name="password" value=""/>

<hr/>

验证码:<input type="text" size="10px" name="VerificationCode" placeholder="请输入验证码" id="VerificationCode"/>

<span style="padding: 0px">

<a href="javascript:void(0)" onclick="VerificationCode()"><img id="randCodeImage" src="VerificationCode/generate.action"/></a>

</span>

</form>

解释:

首先验证码图片是一个img,而它的src肯定是一个动态生成图片的路径,我们可以固定一个专门只为做验证码的方法,这里以VerificationCode/generate.action方法为例,这个方法是生成图片的方法,这样进入这个页面就会有一个初始的图片,当我们点击这个图片的时候就会不停的更换不一样的图片,就是利用异步提交的方式进行,下面是js代码

/**

*验证码刷新

*/

function VerificationCode(){

var rad = Math.floor(Math.random() * Math.pow(10, 8))

//uuuy是随便写的一个参数名称,后端不会做处理,作用是避免浏览器读取缓存的链接

$("#randCodeImage").attr("src", "VerificationCode/generate.action?uuuy="+rad)

}

为什么要在后面加一个随机数?因为如果不加一个随机数,每次不停的访问同一个一模一样的方法的时候,实际上不会去执行这个方法,因为它取得是缓存,所以有时候点击验证码图片刷新图片却不动,就是这个原因,加上验证就会让系统知道你的访问地址发生了变化,就不会取缓存了。

在SpringMVC中提供了一个Validator接口,我们可以通过该接口来定义我们自己对实体对象的验证。接下来看一个示例。

假设我们现在有一个需要进行验证的实体类User,其代码如下所示:

Java代码

public class User {

private String username

private String password

public String getUsername() {

return username

}

1. 环境准备

springmvc中我们使用hibernate的校验框架validation(注:和hibernate没有任何关系),使用这个校验框架的话,需要导入jar包如下:

2. 配置校验器

在springmvc.xml配置文件中配置一下校验器,如下:

<!-- 配置校验器 -->

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">

<!-- 校验器,使用hibernate校验器 -->

<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>

<!-- 指定校验使用的资源文件,在文件中配置校验错误信息,如果不指定则默认使用classpath下面的ValidationMessages.properties文件 -->

<property name="validationMessageSource" ref="messageSource"/>

</bean>

<!-- 校验错误信息配置文件 -->

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">

<!-- 资源文件名 -->

<property name="basenames">

<list>

<value>classpath:CustomValidationMessage</value>

</list>

</property>

<!-- 资源文件编码格式 -->

<property name="fileEncodings" value="utf-8"/>

<!-- 对资源文件内容缓存时间,单位秒 -->

<property name="cacheSeconds" value="120"/>

</bean>

配置规则就是bean和property属性,别把class和文件名写错了就行,这里有个配置是资源文件名,这个文件中我们将会配置一些错误信息。配置好了校验器后,需要将校验器注入到处理器适配器中,还是在springmvc.xml文件中,将我们配好的validator注入进去,如下:

这样校验器就配置好了。

3. 在pojo中添加校验

注解

运行时检查

@AssertFalse被注解元素必须为false

@AssertTrue被注解的元素必须为true

@DecimalMax(value)被注解的元素必须为一个数字,其值必须小于等于指定的最小值

@DecimalMin(Value)被注解的元素必须为一个数字,其值必须大于等于指定的最小值

@Digits(integer=, fraction=)被注解的元素必须为一个数字,其值必须在可接受的范围内

@Future被注解的元素必须是日期,检查给定的日期是否比现在晚

@Max(value)被注解的元素必须为一个数字,其值必须小于等于指定的最大值(百度上好多传阅复制写错了 最小值)

@Min(value)被注解的元素必须为一个数字,其值必须大于等于指定的最小值

@NotNull被注解的元素必须不为null

@Null被注解的元素必须为null

@Past(java.util.Date/Calendar)被注解的元素必须过去的日期,检查标注对象中的值表示的日期比当前早

@Pattern(regex=, flag=)被注解的元素必须符合正则表达式,检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配

@Size(min=, max=)被注解的元素必须在制定的范围(数据类型:String, Collection, Map and arrays)

@Valid递归的对关联对象进行校验, 如果关联对象是个集合或者数组, 那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验

@CreditCardNumber对xyk号进行一个大致的验证

@Email被注释的元素必须是电子邮箱地址

@Length(min=, max=)被注解的对象必须是字符串的大小必须在制定的范围内

@NotBlank被注解的对象必须为字符串,不能为空,检查时会将空格忽略

@NotEmpty被注释的对象必须为空(数据:String,Collection,Map,arrays)

@Range(min=, max=)被注释的元素必须在合适的范围内 (数据:BigDecimal, BigInteger, String, byte, short, int, long and 原始类型的包装类 )

@URL(protocol=, host=, port=, regexp=, flags=)被注解的对象必须是字符串,检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件

hibernate校验框架提供了很多注解校验,我先简单罗列一下:

上面我简单罗列了一些校验的注解,不同的注解的具体使用方法可以参考官方文档或者网上资料,这里我选择两个注解来说明如何使用这个hibernate验证框架。首先在自己的pojo中需要验证的属性上添加相应的验证注解:

我们看到注解中可以指定message,那么这个message中的内容是错误消息配置文件中对应的key,取出来的就是对应的错误消息,所以针对这两个错误消息,我们写一下配置文件:

4. 捕获校验错误信息

上面已经将校验相关的配置都配好了,接下来就需要在controller的方法中捕获校验结果中的错误信息,然后将这些错误信息传到前台去显示。那么controller的方法中该如何去捕获呢?如下:

可以看出,在需要校验的pojo前边添加@Validated,在需要校验的pojo后边添加BindingResult bindingResult来接收校验出错信息。值得注意的是:@Validated和BindingResult bindingResult是配对出现,并且形参顺序是固定的(一前一后)。这样就可以顺利接收到错误信息了。关于前台的东西,我就不写了。

5. 分组校验

上面已经能完成springmvc的校验功能了,但是有个问题:刚刚是在pojo中定义了校验规则,但是pojo是被多个controller使用的,现在假如两个不同的controller使用的校验规则是不一样的,简单来说,一个controller不需要去校验生产日期,只要校验一下商品名称即可,另一个controller两个都要校验,这样就没法做了,因为两个controller都使用同一个pojo。

为了解决这个问题,我们可以定义多个校验分组(其实是一个Java接口),分组中定义有哪些规则,每个controller方法使用不同的校验分组即可。看一下下面的例子就明白了:

首先定义一个校验分组:

public interface ValidGroup1 {

//接口中不需要定义任何方法,仅仅是对不同的校验规则进行分组

//此分组只校验商品名称的长度

}

然后我们在刚刚的pojo中,添加这个分组,如下:

再看一下想要校验这个name字段的controller中是如何配置的:

这样该controller就不会去校验生产日期的字段了,通过这种方式可以解决不同的controller校验不同字段的问题。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11614230.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存