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={"我操","操","你妈的","你大爷","日"};
	@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"/>

最好放在最后:

在这里插入图片描述

二.四 重启服务器,验证自定义的验证类

输入网址: http://localhost:8080/Struts_Reply/Reply_toSelfUI.action

可以正常的跳转到回复的页面

输入回复内容: 两个蝴蝶飞,你好, 不在拦截词里面

有图片

控制台打印输出:

有图片

success 界面也可以正常显示

有图片

输入回复内容: 我操, 在拦截词里面

有图片

被拦截了。

控制台打印输出:

有图片

本章节代码链接为:

链接:https://pan.baidu.com/s/1Kc28OiDceeAUyHGSrl5yWw 
提取码:g9g6 

谢谢您的观看!!!


原文地址:https://www.cnblogs.com/yjltx/p/13071775.html