zoukankan      html  css  js  c++  java
  • 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 
    

    谢谢您的观看!!!


  • 相关阅读:
    docker相关资源监控采集方法整理
    三节课MINI计划第四周
    三节课MINI计划第五周
    三节课MINI计划第四周
    三节课MINI计划第三周
    三节课MINI计划第二周
    Bilibili用户需求分析报告
    三节课MINI计划第一周
    《产品思维30讲 》学习笔记
    PHP-FPM未授权访问漏洞
  • 原文地址:https://www.cnblogs.com/yjltx/p/13071775.html
Copyright © 2011-2022 走看看