输入验证java
ValueStack/OGNLexpress
三个拦截器apache
验证用户名是否输入,验证密码是否符合要求...服务器
验证的方式:jsp
1:脚本验证 - JS验证,这种验证很容易就能够让黑客跳过。ide
2:服务器验证工具
在Struts2里面服务器验证post
@Overrideui
public String execute() throws Exception {url
// 保存一个信息
boolean boo = true;
if (name == null || name.trim().equals("")) {
ActionContext.getContext().put("name", "姓名不能为空");
boo = false;
}
if (age == null || age <= 0) {
ActionContext.getContext().put("age", "年龄不能为空");
boo = false;
}
if (boo) {
return SUCCESS;
} else {
return INPUT;
}
}
若是要在validate方法中进行验证,必需要实现一个接口: Validatable,ValidateAware两个接口:
public interface Validateable {
/**
* Performs validation.
*/
void validate();
}
能够经过重写validate方法形式,在vvalidate方法 中进行验证:
好处:业务逻辑代码与验证的代码分离。
@Override
public String execute() throws Exception {
System.err.println("验证成功了:");
return SUCCESS;
}
/**
* 若是在FieldError里面没有数据,则叫验证成功<br>
* 若是在FieldError-Map里面有任意的数据,就叫验证不成功
* 只有验证成功之后,才会进入execute方法
*/
@Override
public void validate() {
if(name==null || name.trim().equals("")){
//添加错误的信息到ActionErrors中去
addFieldError("name", "姓名不能为空");
}
if(age==null || age<=0){
addFieldError("age", "年龄不能为空");
}
}
<package name="one-package" extends="struts-default">
<action name="one" class="cn.demo.OneAction">
<result>/WEB-INF/views/show.jsp</result>
<!-- 若是验证不成功,默认返回名称叫input的result上去 -->
<result name="input">/index.jsp</result>
</action>
</package>
淙:
开发页面,用 struts的标签能够显示错误:
<!-- 用s标签来显示错误 -->
<s:fielderror></s:fielderror>
<form action="<s:url value='one.action'/>" method="post">
Name:<input type="text" name="name"><br>
Age:<input type="text" name="age"><br>
<input type="submit" value="提交">
</form>
验证扩展:
public String reg(){
System.err.println("验证成功了,去注册 ...");
return SUCCESS;
}
//若是只对reg方法进行验证,能够使用validateXxx
//示例,即若是对reg进行验证则能够开发validateReg方法
/**
* 若是在FieldError里面没有数据,则叫验证成功<br>
* 若是在FieldError-Map里面有任意的数据,就叫验证不成功
* 只有验证成功之后,才会进入execute方法
*/
public void validateReg() {
if(name==null || name.trim().equals("")){
//添加错误的信息到ActionErrors中去
addFieldError("name", "姓名不能为空");
}
if(age==null || age<=0){
addFieldError("age", "年龄不能为空");
}
if(pwd==null || pwd.trim().equals("")){
addFieldError("pwd", "密码不能为空");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.dtd">
<validators>
<field name="name">
<!-- 不能为null,不能为"" -->
<field-validator type="requiredstring">
<message>你必需要输入姓名</message>
</field-validator>
</field>
<field name="pwd">
<field-validator type="requiredstring">
<message>密码必须输入</message>
</field-validator>
</field>
<field name="age">
<field-validator type="required">
<message>年龄必须输入</message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="max">100</param>
<param name="min">10</param>
<message>你的年龄必需要在10~${max}之间</message>
</field-validator>
</field>
</validators>
基于xml的验证,分为两种:
1:字段级别的验证。
<field name="name">
<!-- 不能为null,不能为"" -->
<field-validator type="requiredstring">
<message>你必需要输入姓名</message>
</field-validator>
</field>
2:非字段级别的验证
<validator type="requiredstring">
<param name="fileName">name</param>
<message>你的名称名称必需要必需要输入</message>
</validator>
全部验证规则:xwork给提供的:
<validator name="required"
class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator" />
<!-- Plain Validator Syntax -->
<validator type="required">
<param name="fieldName">username</param>
<message>username must not be null</message>
</validator>
<!-- Field Validator Syntax -->
<field name="username">
<field-validator type="required">
<message>username must not be null</message>
</field-validator>
</field>
<validator name="requiredstring"
class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator" />
<validator name="expression"
class="com.opensymphony.xwork2.validator.validators.ExpressionValidator" />
只有非字段的级别的验证:
<validator type="expression">
<param name="expression">pwd.equals(pwd2)</param>
<message>两次密码输入不一致!!</message>
</validator>
public void test1() throws Exception{
ClassPool cp = new ClassPool(true);
CtClass cls = cp.get("cn.demo02.Person");
//获取里面方法
CtMethod m = cls.getDeclaredMethod("say");
m.insertBefore("System.err.println(\"begin...\");");
m.insertAfter("System.err.println(\"代码执行完成了\");");
//保存这个字节码到文件中去
//将修改之后的类,实例化一下
Object obj = cls.toClass().newInstance();
Person p =(Person) obj;
p.say();
}
public void test2() throws Exception {
ClassPool cp = new ClassPool(true);
CtClass cls = cp.get("cn.demo02.Person");
CtMethod m = cls.getDeclaredMethod("hi");
CtClass ps = m.getParameterTypes()[0];
String name = ps.getName();
System.err.println(name);
Method m2 = Person.class.getMethod("hi",Class.forName(name));
m2.invoke(new Person(), "JJJJJJKK");
}
OGNL - > 获取数据的工具。
OGNL获取数据的对象,分为两部分:root(Object/Bean), Map(上下文对象)
# 获取非根对象的值或是设置
% 将字符串转成OGNL表达式
@ 调用静态的方法
获取数据,
String nm = (String) Ognl.getValue("name", obj);
System.err.println(nm);
设置数据
Object obj = new Student();
//设置根对象的值
Ognl.setValue("name", obj, "Jack");
System.err.println(obj);
Ognl.setValue("age",obj, 90);
System.err.println(obj);
调用静态的方法:
long time = System.currentTimeMillis();
System.err.println(time);
long tt = (long) Ognl.getValue("@java.lang.System@currentTimeMillis()", null);
System.err.println(tt);
OGNL的功能,让全部不能出现Java代码的地方使用Java代码:
在页面:<s:property value=”@java.lang.System@currentTimeMillis()”/>
ValueStack: