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


20200609120455267.png


输出的日志为:


20200609120508681.png


成功success.jsp界面显示, 基本环境搭建好.


二. 进行过滤敏感词


二.一 在与ReplyAction同级目录下创建验证文件


这个验证文件只是针对ReplyAction下的reply()方法,


在struts.xml 中配置进入此方法的name 为: Reply_reply


故.xml文件命名为:ReplyAction-Reply_reply-validation.xml


20200609120455267.png


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文件


20200609120527936.png


将其复制放在在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"/>


最好放在最后:


20200609120548968.png


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


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

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


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


20200420082325187.png


控制台打印输出:


20200420082330602.png


success 界面也可以正常显示


20200420082335329.png


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


20200420082340153.png


被拦截了。


控制台打印输出:


20200420082344697.png


本章节代码链接为:


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


谢谢您的观看!!!

相关文章
|
6月前
|
安全 前端开发 测试技术
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
安全开发-PHP应用&模版引用&Smarty渲染&MVC模型&数据联动&RCE安全&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞
|
数据安全/隐私保护
fastadmin中写接口是时Validate规则验证自定义如何用
fastadmin中写接口是时Validate规则验证自定义如何用
264 0
|
XML Java API
网站是怎么屏蔽脏话的呢:简单学会SpringBoot项目敏感词、违规词过滤方案
一个社区最重要的就是交流氛围与审查违规,而这两者都少不了对于敏感词进行过滤的自动维护措施。基于这样的措施,我们才能基本保证用户在使用社区的过程中,不至于被敏感违规词汇包围,才能够正常的进行发布帖子和评论,享受美好的社区氛围。目前,对于 springboot 项目也有较为成熟的敏感词过滤方案。
547 0
网站是怎么屏蔽脏话的呢:简单学会SpringBoot项目敏感词、违规词过滤方案
|
消息中间件 人工智能 算法
很全的敏感词匹配系统的设计与实践(1)
很全的敏感词匹配系统的设计与实践(1)
|
存储 机器人 API
typecho博客增加评论过滤插件/违禁词拦截
typecho博客增加评论过滤插件/违禁词拦截
415 0
|
存储 算法
很全的敏感词匹配系统的设计与实践(2)
很全的敏感词匹配系统的设计与实践(2)
|
前端开发
#yyds干货盘点 【React工作记录十八】常见的正则校验
#yyds干货盘点 【React工作记录十八】常见的正则校验
145 0
|
监控 安全 搜索推荐
网址被QQ拦截后应该怎么做才可能尽快解除拦截
作为一个多元化的应用平台,QQ拥有着庞大的基础用户群,腾讯旗下任何一个新兴的网络应用都会受到QQ用户的广泛认可,因此,QQ应用平台一直是网站推广的理想选择。
772 0
网址被QQ拦截后应该怎么做才可能尽快解除拦截
|
前端开发 JavaScript 数据安全/隐私保护
Struts2利用验证框架实现数据验证(十一)上
Struts2利用验证框架实现数据验证(十一)
196 0
Struts2利用验证框架实现数据验证(十一)上
|
XML 前端开发 数据安全/隐私保护
Struts2利用验证框架实现数据验证(十一)中
Struts2利用验证框架实现数据验证(十一)
173 0
Struts2利用验证框架实现数据验证(十一)中