輸入驗證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: