Struts2编写自定义验证拦截敏感词汇(十二)
勿以惡小而為之,勿以善小而不為--------------------------劉備
勸諸君,多行善事積福報,莫作惡
上一章簡單介紹了Struts2利用驗證框架實現數據驗證(十一),如果沒有看過,請觀看上一章
有的時候,在論壇或者微博之類的項目中,常常需要對用戶發表的評論或者回復進行相應的驗證,
特別是在和諧社會的今天,要注意對一些敏感詞匯的攔截校驗。
以前認為需要用攔截器或者過濾器進行相應的驗證,但是現在學到了Struts2的驗證框架之后,可以使用驗證框架,自己編寫一個簡單的攔截器。
(這個例子要特別鳴謝java1234知識分享網的鋒哥前輩,就是改編自他的例子)
一 搭建一個簡單的自定義驗證環境
一 . 一 在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">/WEB-INF/content/selfValidate.jsp</result><result name="toSelfUI">/WEB-INF/content/selfValidate.jsp</result><result name="reply">/WEB-INF/content/success.jsp</result></action> </package>一.三 編寫前端的界面
一.三.一 編寫 /content/selfValidate.jsp 頁面
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>一.三.二 編寫 /content/success.jsp 頁面
success.jsp頁面
<body>回復${comments}成功 </body>一.四 重啟服務器,進行基本的環境驗證
輸入網址: http://localhost:8090/Struts_validate/Reply_toSelfUI.action
輸出的日志為:
成功success.jsp界面顯示, 基本環境搭建好.
二. 進行過濾敏感詞
二.一 在與ReplyAction同級目錄下創建驗證文件
這個驗證文件只是針對ReplyAction下的reply()方法,
在struts.xml 中配置進入此方法的name 為: Reply_reply
故.xml文件命名為:ReplyAction-Reply_reply-validation.xml
ReplyAction-Reply_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={"我操","操","你媽的","你大爺","日"};@Overridepublic 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) {//如果包含,返回trueif(!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"/>最好放在最后:
二.四 重啟服務器,驗證自定義的驗證類
輸入網址: http://localhost:8080/Struts_Reply/Reply_toSelfUI.action
可以正常的跳轉到回復的頁面
輸入回復內容: 兩個蝴蝶飛,你好, 不在攔截詞里面
控制臺打印輸出:
success 界面也可以正常顯示
輸入回復內容: 我操, 在攔截詞里面
被攔截了。
控制臺打印輸出:
本章節代碼鏈接為:
鏈接:https://pan.baidu.com/s/1Kc28OiDceeAUyHGSrl5yWw 提取碼:g9g6謝謝您的觀看!!!
總結
以上是生活随笔為你收集整理的Struts2编写自定义验证拦截敏感词汇(十二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win+R命令之后的新世界
- 下一篇: 提高app用户粘性的方法简析