有的时候,在论坛或者微博之类的项目中,常常需要对用户发表的评论或者回复进行相应的验证,
特别是在和谐社会的今天,要注意对一些敏感词汇的拦截校验。
以前认为需要用拦截器或者过滤器进行相应的验证,但是现在学到了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
谢谢您的观看!!!