Struts2編寫自定義驗證攔截敏感詞彙(十二)
“兩個蝴蝶飛”特別喜歡"java1234知識分享網"小峰的實用主義,所以本文及其系列文章均是採用實用主義,從專案和程式碼的角度去分析。由於本人經驗有限,嘴皮子不溜,所以學術性,概念性,底層性的知識點暫時不做介紹。文章中有錯誤之處,歡迎拍磚和指點。特別感謝"java1234知識分享網 "和"黑馬程式設計師官網",所有的資料大部分是兩者提供,為了方便書寫,故不一一指名出處,請諒解,非常抱歉。本次文章重點鳴謝森林森前輩寫的Struts2驗證
上一章簡單介紹了Struts2利用驗證框架實現資料驗證(十一),如果沒有看過,請觀看上一章
有的時候,在論壇或者微博之類的專案中,常常需要對使用者發表的評論或者回復進行相應的驗證,特別是在和諧社會的今天,要特別注意敏感詞彙的驗證。 以前認為需要用攔截器或者過濾器進行相應的驗證,但是現在學到了Struts2的驗證框架之後,可以利用驗證框架自己編寫一個簡單的攔截器。(這個例子要特別鳴謝java1234知識分享網的鋒哥前輩,就是改編自他的例子
一 搭建一個簡單的自定義驗證環境(有web.xml等基本的環境)
一 . 一 在action包下建立一個ReplyAction
package com.yjl.web.action; import org.apache.log4j.Logger; import com.opensymphony.xwork2.ActionSupport; /** * @author 兩個蝴蝶飛 * @version 建立時間:2018年9月13日 下午7:59:02 * 一個簡單的回覆的Action */ public class ReplyAction extends ActionSupport{ private static final long serialVersionUID = -5000603998871975005L; private static Logger logger=Logger.getLogger(ReplyAction.class); //接收前端的輸入,回覆的語句 private String comments; public String getComments() { return comments; } public void setComments(String comments) { this.comments = comments; } public String toSelfUI(){ return "toSelfUI"; } /** * 進行回覆的動作 */ public String reply(){ logger.info("可以進行回覆"+comments); return "reply"; } }
一.二 配置Struts.xml檔案
<package name="user" extends="struts-default" namespace="/"> <action name="Reply_*" class="com.yjl.web.action.ReplyAction" method="{1}"> <!--不要忘記配置input.如果出錯了,就還跳轉到原來的介面--> <result name="input">/selfValidate.jsp</result> <result name="toSelfUI">/selfValidate.jsp</result> <result name="reply">/success.jsp</result> </action> </package>
一.三 編寫前端的介面
selfValidate.jsp頁面
<body>
<h3>這是一個自定義驗證的頁面</h3>
<s:form action="Reply_reply.action" method="post" namespace="/">
<s:textarea name="comments" label="請輸入你的回覆"></s:textarea>
<s:submit value="提交"/>
</s:form>
</body>
不要忘記引入標籤庫:
<%@ taglib uri="/struts-tags" prefix="s"%>
success.jsp頁面
<body>
回覆${comments}成功
</body>
一.四 重啟伺服器,進行基本的環境驗證
輸出的日誌為:
成功success.jsp介面顯示:
二 在與ReplyAction同級目錄下建立驗證檔案
這個驗證檔案只是針對ReplyAction下的reply()方法,故.xml檔案命名為:ReplyAction-reply-validation.xml
ReplyAction-reply-validation.xml檔案內容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="comments">
<field-validator type="requiredstring">
<message>評論不能為空</message>
</field-validator>
<!-- 下面是自定義的評論,注意type的寫法
沒有sensitive,需要建立一個-->
<field-validator type="sensitive">
<message>評論中含有敏感詞彙,請他媽的不要罵人</message>
</field-validator>
</field>
</validators>
三 建立自定義驗證 sensitive
在com.yjl.web.validators新建一個驗證的類 SensitiveWordValidator
新建SensitiveWordValidator類:
package com.yjl.web.validators;
import org.apache.log4j.Logger;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
/**
* @author 兩個蝴蝶飛
* @version 建立時間:2018年9月13日 下午8:25:29
* 敏感詞彙驗證的驗證器
*/
public class SensitiveWordValidator extends FieldValidatorSupport{
private static Logger logger=Logger.getLogger(SensitiveWordValidator.class);
private static String []senWords={"我操","操","你媽的","你大爺","日"};
@Override
public void validate(Object object) throws ValidationException {
logger.info("進入到敏感詞彙的驗證器裡面了");
String filedName=super.getFieldName();
logger.info("得到了值filedName(哪個前端name):"+filedName);
String value=this.getFieldValue(filedName, object).toString();
logger.info("得到了值value(輸入的值):"+value);
logger.info("得到值object(哪個類的toString):"+object);
//如果發現值在裡面,則是錯誤的,是敏感詞彙。 檢測敏感詞彙也是一個複雜的過程,這裡將其簡化一下
//只用整體來判斷
if(checkWord(value)){
this.addFieldError(filedName,object);
}
}
//判斷單詞是否在已經定義好的數組裡面
public boolean checkWord(String value){
for (String word : senWords) {
//如果包含,返回true
if(!value.equalsIgnoreCase("")&&word.indexOf(value)>-1){
return true;
}
}
return false;
}
}
這個時候,需要將ReplyAction-reply-validator.xml中的sensitive型別與這個類進行關聯.
四 關聯型別和相對應的類
在struts的下載目錄下找到相對應validators.xml檔案
將其複製放在在src目錄下
validators.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator Config 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-config-1.0.dtd">
<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
這些型別實際上Struts2系統內部定義的型別。 千萬不要寫錯。
在最後新增sensitive的類:
<validator name="sensitive" class="com.yjl.web.validators.SensitiveWordValidator"/>
最好放在最後:
五 重啟伺服器,驗證自定義的驗證類
他媽的,並沒有達到想像中的效果。各種百度改問題,得有一個半點,終於,他媽的,改好了。
就是將驗證檔案改成全域性方法驗證即可。 即將ReplyAction-reply-validation.xml改成ReplyAction-validation.xml即可。
六 一個半小時後重啟伺服器,驗證自定義的驗證類
改成其他值,
表示自定義驗證成功。
很傷心,先哭一會。為什麼自定義就不能用到一個特定的業務呢? 一定是某個方法寫錯了,希望告知。
謝謝!!