勿以恶小而为之,勿以善小而不为--------------------------刘备
劝诸君,多行善事积福报,莫作恶
上一章简单介绍了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文件
/WEB-INF/content/selfValidate.jsp
/WEB-INF/content/selfValidate.jsp
/WEB-INF/content/success.jsp
一.三 编写前端的界面
一.三.一 编写 /content/selfValidate.jsp 页面
selfValidate.jsp页面
这是一个自定义验证的页面
一.三.二 编写 /content/success.jsp 页面
success.jsp页面
回复${comments}成功
一.四 重启服务器,进行基本的环境验证
输入网址: 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文件内容:
评论不能为空
评论中含有敏感词汇,请他妈的不要骂人
二.二 创建自定义验证器 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
这些类型实际上Struts2系统内部定义的验证数据类型。
在最后添加sensitive的验证:
最好放在最后:
二.四 重启服务器,验证自定义的验证类
输入网址: http://localhost:8080/Struts_Reply/Reply_toSelfUI.action
可以正常的跳转到回复的页面
输入回复内容: 两个蝴蝶飞,你好, 不在拦截词里面
控制台打印输出:
success 界面也可以正常显示
输入回复内容: 我操, 在拦截词里面
被拦截了。
控制台打印输出:
本章节代码链接为:
链接:https://pan.baidu.com/s/1Kc28OiDceeAUyHGSrl5yWw
提取码:g9g6
谢谢您的观看!!!