1. 程式人生 > >Struts2編寫自定義驗證攔截敏感詞彙(十二)

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即可。

六   一個半小時後重啟伺服器,驗證自定義的驗證類

 

 改成其他值,

 

 

 表示自定義驗證成功。

很傷心,先哭一會。為什麼自定義就不能用到一個特定的業務呢?  一定是某個方法寫錯了,希望告知。

謝謝!!