Struts 2(五):输入校验 & 校验框架
第一节 Struts2输入校验
1.1 输入校验的重要性
输入校验分为客户端校验和服务器端校验。客户端校验用来过滤用户的错误操作,一般使用JavaScript代码实现。服务器端校验用来防止非法用户的恶意输入,使用Java代码实现。
仅有客户端验证还是不够的,攻击者可以直接将整个输入页面下载下来,然后通过删除相应的JavaScript代码,然后再提交表单。这样的话,就算是输入不合法的信息,客户端校验也起不了作用。通过一种如此简单的方法就可以绕过这些JavaScript校验代码。那些侵入者很可能使用更加高级的手段来绕过这些JavaScript代码,从而直接提交非法的数据。要避免这种情况就必须添加服务器端校验。
服务端校验是整个Web应用中最重要的一道防线。用户是无法直接接触到服务器端代码的,这样的话就算是客户端校验被人绕过,仍然能够通过服务器端校验来阻止用户的非法输入。服务器端校验对于系统的安全性、完整性、健壮性起到了至关重要的作用。
1.2 通过实现validate方法完成输入校验
ActionSupport类中定义了一个validate方法,通过实现该方法可以用来完成输入校验。下面来看一个简单的范例,通过判断用户输入的年龄是否在0到100之间,如果不是则提示错误信息,如果是则跳转到显示页面显示用户年龄信息。
(1)AgeInput.jsp
<%@page language="java" pageEncoding="gb2312"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>输入年龄信息</title>
</head>
<body>
<form action="age.action" method="post"><!--表单,提交到age.action -->
<s:actionerror/><!--输出ActionError错误信息 -->
年龄:<input type="text" name="age"value="${param.age}"><br>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>
(2)AgeOutput.jsp
<%@page language="java" pageEncoding="gb2312"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>输出年龄信息</title>
</head>
<body>
<s:property value="age"/>
</body>
</html>
(3)AgeAction.java
package com.sanqing.action; import com.opensymphony.xwork2.ActionSupport; public class AgeAction extends ActionSupport {
private int age; //年龄属性
public int getAge() { //获得年龄属性值
return age;
}
public void setAge(int age) {//设置年龄属性值
this.age = age;
}
public void validate() {
if(age < 0 || age > 100) {//判断年龄是否合法
this.addActionError("请输入正确的年龄");//校验错误信息
}
}
public String execute() throws Exception {
return this.SUCCESS;
}
}
1.3 保存表单提交信息
如果输入了非法信息,在页面跳转回表单输入页面时以前提交的数据不存在了。下面两种方法可以保存表单提交信息:
A、通过在表单的每个字段中添加value属性,并设置值
B、通过使用Struts 2的表单标签来实现
<%@page language="java" pageEncoding="gb2312"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>输入年龄信息</title>
</head>
<body>
<form action="age.action" method="post"><!--表单,提交到age.action -->
<s:actionerror/><!--输出ActionError错误信息 -->
<s:textfield name="age" label="年龄"></s:textfield><br>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>
1.4 使用addFieldError添加错误信息
前面介绍的都是通过addActionError方法添加错误信息,Struts 2还提供了另一种添加错误信息的方式,那就是addFieldError方法。
ActionError本身是一个ArrayList实例对象,将错误信息保存在ActionError中,其实就是保存在一个ArrayList中。FieldError和actionError不同,其采用Map结构来存储的,所以都是以键值对来保存信息,其中键用来保存发生错误的字段名称,值用来保存具体的错误信息。
package com.sanqing.action; import java.util.Calendar;
import java.util.Date;
import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport; public class RegisterAction extends ActionSupport{
private String username; //用户名信息
private String upassword; //密码信息
private String repassword; //确认密码
private String name; //姓名
private int age; //年龄
private Date birth; //出生日期
private String email; //email地址
public String getUsername() { //获得用户名
return username;
}
public void setUsername(String username) {//设置用户名
this.username = username;
}
public String getUpassword() {//获得密码
return upassword;
}
public void setUpassword(String upassword) {//设置密码
this.upassword = upassword;
}
public String getRepassword() {//获得重复密码
return repassword;
}
public void setRepassword(String repassword) {//设置重复密码
this.repassword = repassword;
}
public String getName() {//获得姓名
return name;
}
public void setName(String name) {//设置姓名
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public String getEmail() {//获得email地址
return email;
}
public void setEmail(String email) {//设置email地址
this.email = email;
}
public void validate() {
//判断用户名是否输入,如果输入了再判断格式是否正确
if(username == null || "".equals(username.trim())){
this.addFieldError("username", "用户名必须输入");
} else if ( !Pattern.matches("\\w{6,20}", username.trim())) {
this.addFieldError("username", "用户名必须是字母和数字,长度为6到20之间");
}
//判断密码是否输入,如果输入了再判断格式是否正确
if( upassword == null || "".equals(upassword.trim())){
this.addFieldError("upassword", "密码必须输入");
}else if( !Pattern.matches("\\w{6,20}", upassword.trim())) {
this.addFieldError("upassword", "密码必须是字母和数字,长度为6到20之间");
}
//判断确认密码是否输入,如果输入了再判断格式是否正确
if(repassword == null || "".equals(repassword.trim())){
this.addFieldError("repassword", "确认密码必须输入");
}else if( !Pattern.matches("\\w{6,20}", repassword.trim())) {
this.addFieldError("repassword", "确认密码必须是字母和数字,长度为6到20之间");
}
//判断确认密码和密码是否相同
if(upassword != null && repassword != null && ! repassword.equals(upassword)){
this.addFieldError("repassword","确认密码和密码必须相同");
}
if(name!=null && (name.length() < 2 || name.length() > 5)) {
this.addFieldError("name","姓名长度必须在2到5之间");
}
//判断年龄是否合法
if(age < 0 || age >100) {
this.addFieldError("age","请输入有效的年龄");
}
//判断出生日期是否合法
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
start.set(1900, 1,1);
end.set(2010, 1,1);
if(birth != null && ( birth.after(end.getTime()) || birth.before(start.getTime()))) {
this.addFieldError("birth", "请输入有效的出生日期");
}
//判断邮箱地址是否合法
if(email != null && !"".equals(email) && email != "" && !Pattern.matches("[a-zA-Z][a-zA-Z0-9._-]*@([a-zA-Z0-9-_]+\\.)+(com|gov|net|com\\.cn|edu\\.cn)", email)){
this.addFieldError("email", "请输入正确的邮箱地址");
} }
public String execute() throws Exception {//执行方法
return "success";
}
}
测试:
<%@page language="java" pageEncoding="gb2312"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>用户注册页面</title>
</head>
<body>
<form action="register.action" method="post">
<table>
<tr><td colspan="2"><s:fielderror><s:param>username</s:param></s:fielderror></td></tr>
<tr><td>用户名:</td>
<td><input type="text" name="username" value="${param.username }"></td></tr> <tr><td colspan="2"><s:fielderror><s:param>upassword</s:param></s:fielderror></td></tr>
<tr><td>密码:</td>
<td><input type="password" name="upassword" value="${param.upassword }"></td></tr> <tr><td colspan="2"><s:fielderror><s:param>repassword</s:param></s:fielderror></td></tr>
<tr><td>确认密码:</td>
<td> <input type="password" name="repassword" value="${param.repassword}"></td></tr> <tr><td colspan="2"><s:fielderror><s:param>name</s:param></s:fielderror></td></tr>
<tr><td>姓名:</td>
<td><input type="text" name="name" value="${param.name}"></td></tr> <tr><td colspan="2"><s:fielderror><s:param>age</s:param></s:fielderror></td></tr>
<tr><td>年龄:</td>
<td><input type="text" name="age" value="${param.age}"></td></tr> <tr><td colspan="2"><s:fielderror><s:param>birth</s:param></s:fielderror></td></tr>
<tr><td>出生日期:</td>
<td><input type="text" name="birth" value="${param.birth}"></td></tr> <tr><td colspan="2"><s:fielderror><s:param>email</s:param></s:fielderror></td></tr>
<tr><td>邮箱地址:</td>
<td><input type="text" name="email" value="${param.email }"></td></tr>
<tr><td><input type="submit" value="提交"></td>
<td><input type="reset" value="重置"></td></tr>
</table>
</form>
</body>
</html>
注意:如果使用Struts 2的表单标签则可以不用自行添加<s:fielderror>标签,表单标签会自动地将FieldError中的错误信息进行输出。
到底是使用FieldError来保存错误提示信息还是使用ActionError,这个要依据项目具体要求而定,如果只是希望在页面中单纯地显示错误提示信息,可以使用ActionError来保存错误提示信息;如果希望在相应的表单字段上显示错误提示信息,则需要使用FieldError来保存错误提示信息。
1.5 Struts 2输入校验流程
第二节 Struts 2校验框架
2.1 使用校验框架的好处
4.2 编写校验规则文件
4.3 校验器配置风格
2.4 内建校验器注册文件
2.5 常用的内建校验器
Struts 2(五):输入校验 & 校验框架的更多相关文章
- 使用validateXxx()方法进行输入校验 --Struts2框架
1.本例是在使用validate()方法进行输入校验 --Struts2框架的基础上接着做的,上一篇使用validate()方法进行输入校验时会对当前Action中的所有方法有效,由于Struts2框 ...
- Solon详解(六)- Solon的校验扩展框架使用与扩展
Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...
- Struts(五)Action的访问
在struts开发中,Action作为框架的核心类,实现对用户的请求的处理,Action被称为业务逻辑控制器.一个Action类代表一次请求或调用.Action就是用来处理一次用户请求的对象 Acti ...
- Struts和SpringMVC两种MVC框架比较
基于Web的MVC framework在J2EE的世界内已是空前繁荣.TTS网站上几乎每隔一两个星期就会有新的MVC框架发布.目前比较好的MVC,老牌的有Struts.Webwork.新兴的MVC框架 ...
- 第三百一十五节,Django框架,CSRF跨站请求伪造
第三百一十五节,Django框架,CSRF跨站请求伪造 全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.midd ...
- 使用validate()方法进行输入校验 --Struts2框架
服务器端的输入校验包含两种方式:硬编码方式和配置文件方式.本文演示硬编码方式中使用validate()方法进行输入校验. 1.项目目录结构: 2.项目核心代码: BookAction.java: pu ...
- JavaScript input框输入实时校验
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- JavaScript控制输入框只能输入中文,英文和数字的组合,其他字符不能输入的校验
if(!/^[A-Za-z0-9\u4e00-\u9fa5]+/.test(value)){ alert('不能输入非法字符') }
- element ui只输入数字校验
注意:圈起来的两个地方,刚开始忘记写type='number'了,导致可以输入'123abc'这样的,之后加上了就OK了
随机推荐
- Linux常用监控服务器性能命令
列举比较常用的几种监控服务器性能的Linux命令.其实,在我看来,目前针对Linux系统内存.硬盘.TCP/IP等等相关的指标,Linux本身自带的或者是一些开源项目等基本上都能达到这个获取服务器性能 ...
- 如何求出数组中最小(或者最大)的k个数(least k问题)
输入n个整数,如何求出其中最小的k个数? 解法1. 当然最直观的思路是将数组排序,然后就可以找出其中最小的k个数了,时间复杂度以快速排序为例,是O(nlogn): 解法2. 借助划分(Partitio ...
- linux内存管理---物理地址、线性地址、虚拟地址、逻辑地址之间的转换
linux内存管理---虚拟地址.逻辑地址.线性地址.物理地址的区别(一) 这篇文章中介绍了四个名词的概念,下面针对四个地址的转换进行分析 CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步 ...
- JAVA类加载和初始化
JAVA类的加载和初始化 一.类的加载和初始化过程 JVM将类的加载分为3个步骤: 1.加载(Load):class文件创建Class对象. 2.链接(Link) 3.初始化(Initialize) ...
- css让不同大小的图片适应div的大小,且不变形。
做成背景图片 单个 .imgdiv { width: 100px; // 你要的正方形 height: 100px; // 你要的正方形 background-image: url(/your/ima ...
- MySQL5.7.19 免安装配置 + Navicat for MySQL安装和破解(附全部资源)
近段时间因为工作原因安装了好多次本地MySQL,安装过程也是时有曲折,索性记录一下. 环境: Win10 家庭版 MySQL5.7.19 (链接:https://pan.baidu.com/s/1 ...
- ionic3 返回多个页面的写法
直接上代码 ionic3 返回2步 3步 或者多部 this.navCtrl.popTo(this.navCtrl.getByIndex(this.navCtrl.length()-3)); ...
- PHP-----PHP程序设计基础教程----第一章PHP开篇
本章内容知识体系如下所示: 一.PHP基础知识 1.1 Web技术 服务器与客户端 服务器:能够提供某种服务的电脑 客户端:想使用服务器所提供服务的电脑 服务器也是一台电脑,必须安装操作系统.否则就是 ...
- mysql secure_file_priv 文件读写问题
secure_file_priv特性 使用 show global variables like '%secure%'; 查询显示 secure_file_priv的值为null,那么secure_f ...
- [Golang学习笔记] 08 链表
链表(Linked list)是一种常见数据结构,但并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针. 由于不必须按顺序存储,链表在插入的时候可以达到O(1),比顺序表快得多,但是查 ...