精华内容
下载资源
问答
  • 它添加了一个语法突出显示CSS编辑器,您可以在其中将其他CSS添加到您的Gutenberg块中,以根据需要对其进行样式设置。 屏幕截图 CSS编辑器 CSS编辑器 变更日志 (2021-02-10) 修正多余的删除。 重构inject-...
  • 单击一个类后,页面上将填充该类的部分,其中包含每个独特的动画及其可能的武器。 最初对武器图标进行排序,以遵循结构化顺序进行统一设计。 动画本身也经过排序,以女性全部排在第一,男性排在第二。 次级字母排序...
  • 如果从行首匹配,可以用“^”来实现,不过 EditPlus 有另一个功能可以很简单的删除行首的字符串 a. 选择要操作的行 b. 编辑-格式-删除行注释 c. 在弹出对话框里面输入要清除的行首字符,确定 【4】正则表达式应用...
  • 一、语言和环境 实现语言:HTML,CSS,JavaScript,JQuery。... 点击“全选”可以实现下列行全选,再次点击取消,当其中一个取消后全选复选框不被选中,当全部选中后全选复选框选中。 实现效果 2...

    一、语言和环境

    1. 实现语言:HTML,CSS,JavaScript,JQuery。
    2. 开发环境:HBuilder。

    二、题目(100分):

    1、使用Jquery和JavaScript实现二级分类菜单管理

    1. 点击“添加一级分类”能添加一行一级分类
    2. 点击“添加子分类”能添加一行二级分类
    3. 点击“删除”可以删除该级分类,并且删除一级分类的同时,相关二级分类也随之删除。
    4. 点击“全选”可以实现下列行全选,再次点击取消,当其中一个取消后全选复选框不被选中,当全部选中后全选复选框选中。
    实现效果

     

    2、推荐实现步骤

    1. 在HTML页面中,选择合适的插入方法插入相关节点。 
    2. 使用remove()方法实现分类的删除操作,可通过js方式或者jquery方式获取相关节点并删除。
    3. 提示:复选框的checked的属性值为false时说明未被选中,为true或者checked时状态为选中。
    4. 合理使用选择器,可以简化代码。

    三、评分标准

    题目:二级分类菜单管理

    该程序评分标准如下:

    10

    正确按照效果图编写出html代码

     

    5

    正确显示操作界面

     

    5

    将界面美化,适当添加动画,背景颜色

    40

    复选框操作

     

    10

    点击全选复选框,所有复选框被选中,再次点击取消选中状态

     

    15

    全选状态下,其中一个复选框状态为未被选中时,全选复选框也未被选中

     

    15

    选中所有复选框,全选复选框被选中

    40

    正确编写JS/JQuery代码实现分级分类菜单操作

     

    10

    实现添加一级目录功能

     

    5

    实现删除一级目录功能(一级目录删除相关二级目录可不删除)

     

    10

    实现添加二级目录功能

     

    5

    删除二级目录功能

     

    5

    删除一级目录,二级目录随之删除

    10

    整体效果美观以及代码编写规范

     

    5

    整体显示效果美观

     

    5

    命名规范,可读性好,编码书写有缩进

    总分

    100

    四、实现代码:

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<title></title>
    		<style type="text/css">
    			*{
    				margin: 0;
    				padding: 0;
    			}
    			td,th{
    				padding: 10px;
    			}
    			#content{
    				margin: 0 auto;
    				width: 800px;
    				height: 500px;
    			}
    		</style>
    		<script src="js/jquery-3.3.1.js" type="text/javascript" charset="utf-8"></script>
    		<script type="text/javascript">
    			// 添加一级菜单
    			function addChild(){
    				var th = $("tr:first-child");
    				th.after(
    				'<tr class="oneMenu">'+
    					'<td><input type="checkbox" /> </td>'+
    					'<td>一级菜单</td>'+
    					'<td><a href="#" onclick="addChilds(this)">添加子分类</a></td>'+
    					'<td><a href="#" onclick="delChild(this)">删除</a></td>'+
    				'</tr>'
    				);
    			};
    			// 添加二级菜单
    			function addChilds(item){
    				var th = item.parentNode.parentNode;
    				$(th).after(
    					'<tr class="twoMenu">'+
    						'<td></td>'+
    						'<td>二级菜单</td>'+
    						'<td></td>'+
    						'<td><a href="#" onclick="delChild(this)">删除</a></td>'+
    					'</tr>'
    				);
    			};
    			// 删除节点
    			function delChild(item){
    				var th = item.parentNode.parentNode;
    				if (th.className="oneMenu") {
    					$(th).remove();
    				} else{
    					var two = document.className("twoMenu")
    					console.log(two)
    					$(two).remove();
    				}
    			}
    			// 设置全选
    			function allCheck(){
    				var all = $("#all");
    				var che = $("input[type='checkbox']");
    				for (var i = 0;i<che.length;i++) {
    					che[i].checked = all[0].checked;
    				}
    			};
    
    		</script>
    	</head>
    	<body>
    		<div id="content">
    			<input type="button" value="添加一级菜单" onclick="addChild()"/>
    			<br />
    			<table>
    				<tr>
    					<th><input type="checkbox" id="all" onclick="allCheck()"/>  全选</th>
    					<th>分类</th>
    					<th>菜单</th>
    					<th>操作</th>
    				</tr>
    				<tr class="oneMenu">
    					<td><input type="checkbox" /> </td>
    					<td>一级菜单</td>
    					<td><a href="#" onclick="addChilds(this)">添加子分类</a></td>
    					<td><a href="#" onclick="delChild(this)">删除</a></td>
    				</tr>
    				<tr class="twoMenu">
    					<td></td>
    					<td>二级菜单</td>
    					<td></td>
    					<td><a href="#" onclick="delChild(this)">删除</a></td>
    				</tr>
    			</table>
    		</div>
    	</body>
    </html>
    

     

    展开全文
  • 一个最直接的方法就是为其“包裹上”一个带背景样式的元素。 具体的,我们可以给每个文本节点外加上一个 class 为 <code>highlight</code> 的 <code><span></code> 元素;而背景样式则通过 CSS ...
  • 相反,他们必须选择另一个可用的。例如,如果教程的容量是 最多 20 人,则一旦教程已满,学生将无法加入该教程。也 不同的实验室有不同的容量,在学生分配时将应用这些容量。 用户介绍: 1. 学位管理员: ...
  • -Button控件将不再自动拥有display:inline属性,如果希望两个按钮在一行显示,请为第一个按钮设置CssStyle="float:left;"属性。 -修正了弹出菜单的位置在Firefox下不正确的BUG(feedback:eroach)。 -为TriggerBox...
  • *@value 设置@param str的值为@value *@return this 用于链式调用 为DOM element 添加/删除一个className属性值,有则删除,无则添加 *@param str className的属性值也可以是一个回调函数,返回className的...
  • 在单击作者名字时,把文本改为粗体(通过添加一个标签,而不是操作css属性)。 挑战:在随后单击粗体作者名字时,删除之前添加的元素(也就是在粗体文本与正常文本之间切换)。 挑战:为正文中的每一个
    1. 修改添加back top链接的代码,以便这些链接只从第四段后面才开始出现。
    2. 在单击back to top链接时,为每个链接后面添加一个新段落,其中包含You were here字样。确保链接仍然有效。
    3. 在单击作者名字时,把文本改为粗体(通过添加一个标签,而不是操作类或css属性)。
    4. 挑战:在随后单击粗体作者名字时,删除之前添加的元素(也就是在粗体文本与正常文本之间切换)。
    5. 挑战:为正文中的每一个段落添加一个inhabitants类,但不能调用.addClass()方法。确保不影响现有的类。

      //1
      var $pAfterThree = $('div.chapter p').eq(2).nextAll();
      $('<a href="#top">back to top</a>').insertAfter($pAfterThree);
      $('<a id="top"></a>').prependTo('body');
      
      //2
      $('a[href $= "#top"]').on('click', function(){
      $('<p>You were here</p>').insertAfter(this);
      })
      //4第一种方法(第三题包含在4的方法中)
      var flag = 0;
      $('#f-author').on('click', function() {
      if (flag == '0') {
        $(this).wrap("<b></b>");
        flag = 1;
      }else {
        $(this).unwrap();
        flag = 0;
      }
      });
      
      //4第二种方法
      //$('<a href="#top">back to top</a>').insertAfter('div.chapter p');
      //$('a[href$="#top"]').on('click', function(){
      //  $('<p>You were here</p>').insertAfter(this);
      //});
      
      //5
      $('p').each(function(){
      var a = $(this).attr('class');
      if(a == null){
        $(this).attr('class','inhabitants');
      }else{
        $(this).attr('class',a + ' inhabitants');
      };
      });

      效果请点击

    展开全文
  • grapesjs-ryvet-plugin-源码

    2021-02-21 13:35:31
    提供插件的实时演示为了获得更好的用户参与度,请使用 的服务创建一个简单的实时演示,并将其链接到您的自述文件中(附加屏幕截图/ gif也将是一个加分)。 为了在下面的过程中为您提供帮助,您将找到必要...
  • gogogo!操作DOM的练习

    2017-06-03 15:20:00
    1、修改添加back to top的链接代码,一...3、在单击作者名字的时,把文本修改为粗体(通过添加一个标签,而不是操作或者css)。 4、在随后单击粗体作者名字时,删除之前添加的<b>元素,(也就是在粗体文本...

    1、修改添加back to top的链接代码,一遍这些链接只从第四段后面才开始出现。

    2、在单击back to top链接时,为每个链接后面添加一个新段落,其中包含(you were here)字样。确保链接仍然有效。

    3、在单击作者名字的时,把文本修改为粗体(通过添加一个标签,而不是操作类或者css)。

    4、在随后单击粗体作者名字时,删除之前添加的<b>元素,(也就是在粗体文本与正常文本之间切换)。

    5、为正文的每个段落添加一个inhab类,但不能调用。addClass()方法。确保不影响现有的类。

    // 比较简陋的一个练习,将四个问题的解决方法放到了一起,如果有耐心请继续往下看,下面会说一个比较有意思的东西。
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <script src="jquery-3.2.1.min.js"></script>
        <title></title>
    </head>
    <body><div id="f">作者名字</div>
        <div id="div">
    
            <p>第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段
                第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第
                一段</p>
            <p>第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段
                第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段</p>
            <p>第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段
                第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段</p>
            <p>第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段
                第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段</p>
            <p>第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段
                第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段</p>
            <p>第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段
                第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段第一段</p>
        </div>
    </body>
    <script>
       $('#div').children().each(function(index){
           if(index>2){
               $('#div').children().eq(index).css('color','red').append($('<br><a href="http://www.baidu.com" >back to top</a>'))
           }
       });
        $('a').click(function(){
            $(this).parent().after($('<span>(you were here)</span>'))
        });
        $('#f').click(function(){
    
            if($('#f').children().is('b')){
                $(this).html($(this).text());
            }else{
    //            $(this).html('<b>'+$(this).html()+'</b>');
    
                var ne=$('<b>'+$(this).text()+'</b>');
                $(this).html(ne);
            }
    
        });
        $('p').attr({class:'inhab'});
    
    </script>
    </html>

    ①对于第一个问题没什么要说的。

    ②第二个问题要注意的就是内部插入和外部插入,当涉及到样式的时候此种情况会更加复杂。需要留意

    ③第三个问题涉及到了.html() .text()

    ④同第三个问题类似,但是此处有一个比较有意思的地方:

    //            $(this).html('<b>'+$(this).html()+'</b>');
    这条语句并不报错,但是其实逻辑上是将<div>放在<b>里面了,而在开发者模式下回发现<b>在<div>中。这是一个很有意思的现象。原因未知,所以我对此进行了修改(因为较简单)
    第五个问题没啥好说的,就这样



    转载于:https://www.cnblogs.com/bengbengbengbengbeng/p/6937422.html

    展开全文
  • 该项目主要是完成校园二手物品网上交易系统的开发,该系统分为首页、用户管理、...其中业务层采用vue.js技术与视图层进行一个数据的双向绑定,并且封装业务流程,为适应业务的变更,每一业务模块均有专门的实现函数。
  • 该生成器的目标是拥有一个项目框架,其中已准备好一切,以便快速开始新项目,而不受任何限制,例如特定CMS的模板系统。 如果您不想使用诸如的功能,则可以轻松地添加,删除或替换它们。 免责声明:本项目并非...
  • 1. 实现一个图书管理系统。图书信息存放到一个数据库中。图书包含信息:图书号、图书名、作者、价格、备注字段。 2. 系统实现如下的基本管理功能: (1)用户分为两:系统管理员,一般用户。 (2)提供用户注册和...
  • 计算总的价格,提供全选和取消全选的按钮,从后台获取商品的单价,判断当前剩余的数量,当用户点击数量添加或者减少之后,对于总价要实时刷新,采用jQuery对数据进行修改,当用户取消选中其中的某一个商品,...
  • jQuery详细教程

    2013-04-25 14:16:42
    您也许已经注意到在我们的实例中的所有 jQuery 函数位于一个 document ready 函数中: $(document).ready(function(){ --- jQuery functions go here ---- }); 这是为了防止文档在完全加载(就绪)之前运行 jQuery...
  • 安卓上用于加载的Webview视图窗口只是作为浏览器而存在,在安卓上更是只能同时运行一个Webview。(2)跨域数据交互问题。不同的Webview之间无法共享数据。(3)页面自适应问题。页面难以兼容适应不同分辨率的设备...
  • 、先来简介# 什么是XSS? 百度百科的解释: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到...

    一、先来个简介#
    什么是XSS?

    百度百科的解释: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

    它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。

    二、XSS分类#
    xss攻击可以分成两种类型:

    1.非持久型攻击
    2.持久型攻击

    非持久型xss攻击:顾名思义,非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。

    持久型xss攻击:持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。

    也可以分成三类:

    反射型:经过后端,不经过数据库

    存储型:经过后端,经过数据库
    三、代码走起

    先加pom文件加上依赖

    <!-- xss过滤组件 -->
            <dependency>
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>1.9.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-text</artifactId>
                <version>1.4</version>
            </dependency>
            
    

    1.首先是要写个过滤器的包装类,这也是实现XSS攻击过滤的核心代码

    
    ```java
    package com.jgtl.smurfs.common.filter;
    
    
    import com.alibaba.fastjson.JSON;
    import com.jgtl.smurfs.common.util.IPUtils;
    import org.apache.commons.lang.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.servlet.ReadListener;
    import javax.servlet.ServletInputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import java.io.*;
    import java.nio.charset.Charset;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;
    
    
    /**
     * <code>{@link XssHttpServletRequestWrapper}</code>
     *
     * @author
     */
    
    public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
        private final Logger log = LoggerFactory.getLogger(getClass());
    
    
        private static String key = "and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|+|$|..";
        private static Set<String> notAllowedKeyWords = new HashSet<String>(0);
        private static String replacedString = "INVALID";
    
        static {
            String keyStr[] = key.split("\\|");
            for (String str : keyStr) {
                notAllowedKeyWords.add(str);
            }
        }
    
        private String currentUrl;
        private String currentIp;
    
    
        /**
         * @param request
         */
        public XssHttpServletRequestWrapper(HttpServletRequest request) {
            super(request);
            currentUrl = request.getRequestURI();
            currentIp = IPUtils.getIpAddr(request);
        }
    
        /**
         * 覆盖getParameter方法,将参数名和参数值都做xss过滤。
         * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取
         * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
         */
        @Override
        public String getParameter(String parameter) {
            String value = super.getParameter(parameter);
            if (value == null) {
                return null;
            }
            return cleanXSS(value);
        }
    
        @Override
        public String[] getParameterValues(String parameter) {
            String[] values = super.getParameterValues(parameter);
            if (values == null) {
                return null;
            }
            int count = values.length;
            String[] encodedValues = new String[count];
            for (int i = 0; i < count; i++) {
                encodedValues[i] = cleanXSS(values[i]);
            }
            return encodedValues;
        }
    
        @Override
        public Map<String, String[]> getParameterMap() {
            Map<String, String[]> values = super.getParameterMap();
            if (values == null) {
                return null;
            }
            Map<String, String[]> result = new HashMap<>();
            for (String key : values.keySet()) {
                String encodedKey = cleanXSS(key);
                int count = values.get(key).length;
                String[] encodedValues = new String[count];
                for (int i = 0; i < count; i++) {
                    encodedValues[i] = cleanXSS(values.get(key)[i]);
                }
                result.put(encodedKey, encodedValues);
            }
            return result;
        }
    
        /**
         * 覆盖getHeader方法,将参数名和参数值都做xss过滤。
         * 如果需要获得原始的值,则通过super.getHeaders(name)来获取
         * getHeaderNames 也可能需要覆盖
         */
        @Override
        public String getHeader(String name) {
            String value = super.getHeader(name);
            if (value == null) {
                return null;
            }
            return cleanXSS(value);
        }
    
        @Override
        public ServletInputStream getInputStream() throws IOException {
            String str = getRequestBody(super.getInputStream());
            try {
                Map<String, Object> map = JSON.parseObject(str, Map.class);
                Map<String, Object> resultMap = new HashMap<>(map.size());
                for (String key : map.keySet()) {
                    Object val = map.get(key);
                    if (map.get(key) instanceof String) {
                        resultMap.put(key, cleanXSS(val.toString()));
                    } else {
                        resultMap.put(key, val);
                    }
                }
                str = JSON.toJSONString(resultMap);
            } catch (Exception e) {
                //e.printStackTrace();
            }
            final ByteArrayInputStream bais = new ByteArrayInputStream(str.getBytes());
            return new ServletInputStream() {
                @Override
                public int read() throws IOException {
                    return bais.read();
                }
    
                @Override
                public boolean isFinished() {
                    return false;
                }
    
                @Override
                public boolean isReady() {
                    return false;
                }
    
                @Override
                public void setReadListener(ReadListener listener) {
                }
            };
        }
    
        private String getRequestBody(InputStream stream) {
            String line = "";
            StringBuilder body = new StringBuilder();
            int counter = 0;
            // 读取POST提交的数据内容
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream, Charset.forName("UTF-8")));
            try {
                while ((line = reader.readLine()) != null) {
                    body.append(line);
                    counter++;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return body.toString();
        }
    
        private String cleanXSS(String valueP) {
            // You'll need to remove the spaces from the html entities below
            String value = valueP.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
            value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
    //        value = value.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41;");
    //        value = value.replaceAll("'", "& #39;");
            value = value.replaceAll("eval\\((.*)\\)", "");
            value = value.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
            value = value.replaceAll("script", "");
            value = cleanSqlKeyWords(value);
            return value;
        }
    
        private String cleanSqlKeyWords(String value) {
            String paramValue = value;
            for (String keyword : notAllowedKeyWords) {
                if (paramValue.length() >= keyword.length()
    //                    && (paramValue.contains(" "+keyword)||paramValue.contains(keyword+" ")||paramValue.contains(" "+keyword+" "))) {
                        && (paramValue.trim().contains(keyword))) {
                    paramValue = StringUtils.replace(paramValue, keyword, replacedString);
                    log.error("IP【" + this.currentIp + "】" + this.currentUrl + "已被过滤,因为参数中包含不允许sql的关键词(" + keyword
                            + ")" + ";参数:" + value + ";过滤后的参数:" + paramValue);
                }
            }
            return paramValue;
        }
    }
    

    2.接下来的事情很简单写个过滤器

    
    ```java
    package com.jgtl.smurfs.common.filter;
    
    import org.apache.commons.lang.BooleanUtils;
    import org.apache.commons.lang.StringUtils;
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * 拦截防止xss注入
     * 通过Jsoup过滤请求参数内的特定字符
     *
     * @author yangwk
     */
    public class XssFilter implements Filter {
        private static final Logger logger = LogManager.getLogger();
    
        /**
         * 是否过滤富文本内容
         */
        private static boolean IS_INCLUDE_RICH_TEXT = false;
    
        public List<String> excludes = new ArrayList<>();
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
            if (logger.isDebugEnabled()) {
                logger.debug("xss filter is open");
            }
    
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse resp = (HttpServletResponse) response;
            if (handleExcludeURL(req, resp)) {
                filterChain.doFilter(request, response);
                return;
            }
    //        filterChain.doFilter(request, response);
    
            XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request);
            filterChain.doFilter(xssRequest, response);
        }
    
        private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) {
    
            if (excludes == null || excludes.isEmpty()) {
                return false;
            }
    
            String url = request.getServletPath();
            for (String pattern : excludes) {
                Pattern p = Pattern.compile("^" + pattern);
                Matcher m = p.matcher(url);
                if (m.find()) {
                    return true;
                }
            }
    
            return false;
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            if (logger.isDebugEnabled()) {
                logger.debug("xss filter init ====================");
            }
            String isIncludeRichText = filterConfig.getInitParameter("isIncludeRichText");
            if (StringUtils.isNotBlank(isIncludeRichText)) {
                IS_INCLUDE_RICH_TEXT = BooleanUtils.toBoolean(isIncludeRichText);
            }
    
            String temp = filterConfig.getInitParameter("excludes");
            if (temp != null) {
                String[] url = temp.split(",");
                for (int i = 0; url != null && i < url.length; i++) {
                    excludes.add(url[i]);
                }
            }
        }
    
        @Override
        public void destroy() {
        }
        }
    

    3注入Bean

    
    ```java
    package com.jgtl.smurfs.config;
    
    import com.google.common.collect.Maps;
    import com.jgtl.smurfs.common.filter.XssFilter;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.Map;
    
    @Configuration
    public class XssConfig {
    
        /**
         * xss过滤拦截器
         */
        @Bean
        public FilterRegistrationBean xssFilterRegistrationBean() {
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
            filterRegistrationBean.setFilter(new XssFilter());
            filterRegistrationBean.setOrder(1);
            filterRegistrationBean.setEnabled(true);
            filterRegistrationBean.addUrlPatterns("/*");
            Map<String, String> initParameters = Maps.newHashMap();
            initParameters.put("excludes", "/favicon.ico,/img/*,/js/*,/css/*");
            initParameters.put("isIncludeRichText", "true");
            filterRegistrationBean.setInitParameters(initParameters);
            return filterRegistrationBean;
        }
    }
    

    4.补工具类

    package com.jgtl.smurfs.common.util;
    
    import cn.hutool.core.util.StrUtil;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    
    /**
     * <br/>=================================<br/>
     * 功能描述:xss攻击字典数据工具类
     
     * <br/>=================================<br/>
     */
    public class XssDictUtils {
    
        // 防止xss攻击过滤字典map
        private static final Map<String, String> xssDicpMap = new HashMap<String, String>();
    
        /**
         *<br/>=================================<br/>
         *方法描述:防止xss攻击正则表达式字典收集
        
         *<br/>=================================<br/>
         *修改功能:添加对于null、NULL、0x0d、0x0a的替换规则
        
         *<br/>=================================<br/>
         *修改功能:null、NULL替换为"",打开<、>、&替换规则
         
         *<br/>=================================<br/>
         *修改功能:屏蔽&替换规则
         
         *<br/>=================================<br/>
         *修改功能:新增关键字过滤  load、create、union、rename
       
         *<br/>=================================<br/>
         *修改功能:新增关键字过滤  eval、and、or
       
         *<br/>=================================<br/>
         *修改功能:去掉关键字过滤  &
         *<br/>=================================<br/>
         */
        static {
            xssDicpMap.put("[s|S][c|C][r|R][i|I][p|P][t|T]", "");
            xssDicpMap.put("[\\\"\\\'][\\s]*[j|J][a|A][v|V][a|A][s|S][c|C][r|R][i|I][p|P][t|T]:(.*)[\\\"\\\']", "");
            xssDicpMap.put("[e|E][v|V][a|A][l|L]\\((.*)\\)", "");
            xssDicpMap.put("[v|V][b|B][s|S][c|C][r|R][i|I][p|P][t|T]", "");
            xssDicpMap.put("[s|S][o|O][u|U][r|R][c|C][e|E]", "");
    //        xssDicpMap.put("<(\"[^\"]*\"|\'[^\']*\'|[^\'\">])*>", "");
            xssDicpMap.put("[e|E][x|X][p|P][r|R][e|E][s|S][s|S][i|I][o|O][n|N]", "");
    //        xssDicpMap.put("[w|W][i|I][n|N][d|D][o|O][w|W]", "");
            xssDicpMap.put("[l|L][o|O][c|C][a|A][t|T][i|I][o|O][n|N]", "");
            xssDicpMap.put("[d|D][o|O][c|C][u|U][m|M][e|E][n|N][t|T]", "");
            xssDicpMap.put("[c|C][o|O][o|O][k|K][i|I][e|E]", "");
            xssDicpMap.put("[a|A][l|L][e|E][r|R][t|T]", "");
            xssDicpMap.put("[o|O][p|P][e|E][n|N]", "");
            xssDicpMap.put("[s|S][h|H][o|O][w|W][d|D][i|I][a|A][l|L][o|O][g|G]", "");
            xssDicpMap.put("[s|S][h|H][o|O][w|W][m|M][o|O][d|D][a|A][l|L][d|D][i|I][a|A][l|L][o|O][g|G]", "");
            xssDicpMap.put("[s|S][h|H][o|O][w|W][m|M][o|O][d|D][e|E][l|L][e|E][s|S][s|S][d|D][i|I][a|A][l|L][o|O][g|G]", "");
    //        xssDicpMap.put("(window\\.location|window\\.|\\.location|document\\.cookie|document\\.|alert\\(.*?\\)|window\\.open\\()*", "");
            xssDicpMap.put("<+\\s*\\w*\\s*(oncontrolselect|oncopy|oncut|ondataavailable|ondatasetchanged|ondatasetcomplete|ondblclick|ondeactivate|ondrag|ondragend|ondragenter|"
                    + "ondragleave|ondragover|ondragstart|ondrop|οnerrοr=|onerroupdate|onfilterchange|onfinish|onfocus|onfocusin|onfocusout|onhelp|onkeydown|onkeypress|"
                    + "onkeyup|onlayoutcomplete|onload|onlosecapture|onmousedown|onmouseenter|onmouseleave|onmousemove|onmousout|onmouseover|onmouseup|onmousewheel|onmove|"
                    + "onmoveend|onmovestart|onabort|onactivate|onafterprint|onafterupdate|onbefore|onbeforeactivate|onbeforecopy|onbeforecut|onbeforedeactivate|onbeforeeditocus|"
                    + "onbeforepaste|onbeforeprint|onbeforeunload|onbeforeupdate|onblur|onbounce|oncellchange|onchange|onclick|oncontextmenu|onpaste|onpropertychange|"
                    + "onreadystatechange|onreset|onresize|onresizend|onresizestart|onrowenter|onrowexit|onrowsdelete|onrowsinserted|onscroll|onselect|onselectionchange|"
                    + "onselectstart|onstart|onstop|onsubmit|onunload)+\\s*=+", "");
            xssDicpMap.put("<", "&lt;");
            xssDicpMap.put(">", "&gt;");
    //        xssDicpMap.put("&", "&amp;");
            xssDicpMap.put("[t|T][a|A][b|B][l|L][e|E]", "");
            xssDicpMap.put("[d|D][a|A][t|T][a|A][b|B][a|A][s|S][e|E]", "");
            xssDicpMap.put("[i|I][n|N][s|S][e|E][r|R][t|T]", "");
            xssDicpMap.put("[u|U][p|P][d|D][a|A][t|T][e|E]", "");
            xssDicpMap.put("[d|D][e|E][l|L][e|E][t|T][e|E]", "");
            xssDicpMap.put("[t|T][r|R][u|U][n|N][c|C][a|A][t|T][e|E]", "");
            xssDicpMap.put("[s|S][e|E][l|L][e|E][c|C][t|T]", "");
            xssDicpMap.put("[a|A][l|L][t|T][e|E][r|R]", "");
            xssDicpMap.put("[n|N][u|U][l|L][l|L]", "\"\"");
            xssDicpMap.put("[d|D][e|E][s|S][c|C]", "\"\"");
            xssDicpMap.put("0[x|X]0[d|D]", "");
            xssDicpMap.put("[l|L][o|O][a|A][d|D]", "\"\"");
            xssDicpMap.put("[r|R][e|E][n|N][a|A][m|M][e|E]", "");
            //xssDicpMap.put("[c|C][r|R][e|E][a|A][t|T][e|E]", "");
            xssDicpMap.put("[u|U][n|N][i|I][o|O][n|N]", "");
            xssDicpMap.put("[e|E][x|X][i|I][s|S][t|T][s|S]", "");
            xssDicpMap.put("[e|E][v|V][a|A][l|L]", "");
            xssDicpMap.put("[a|A][n|N][d|D]", "");
            xssDicpMap.put("[o|O][r|R] ", "");
        }
    
    
       
        public static String xssValid(String value) {
            if (StrUtil.isEmpty(value)) {
                return value;
            }
            for (String key : xssDicpMap.keySet()) {
                Pattern p = Pattern.compile(key);
                Matcher m = p.matcher(value);
                value = m.replaceAll(xssDicpMap.get(key));
            }
            return value;
        }
    
     
        public static void main(String[] args) {
            String temp = "asset_m_windows";
            System.out.println(XssDictUtils.xssValid(temp));
        }
    
    }
    
    
    展开全文
  • HTML:超文本标题语言

    2020-05-27 17:00:17
    样式标准:设置网页元素的一个版本,颜色大小以及外观,css 行为标准:行为是指网页模型的定义及交互的编写,dom,es 语义化标签: 1方便袋妈的阅读和维护 2同时让浏览器或网络爬虫很好的解析,从而更好地分析其中...
  • 一个参数表示要删除,插入或则替换的位置,第二个参数表示要删除的项数,第三个到第N个表示要插入或则替换的数据 <p><strong>Date</strong></p> 时间对象也是使用非常多的玩意,它是使用...
  • 十二、后台可在碎片模块添加QQ、MSN、淘宝旺旺、阿里旺旺、SKYPE、第三方客服交流软件等,支持强大的交互式营销工具,让您的网站不只是一个死板的摆设;网站后台登陆地址:http://你的网址/pinluo/系统初始默认管理...
  • 十二、后台可在碎片模块添加QQ、MSN、淘宝旺旺、阿里旺旺、SKYPE、第三方客服交流软件等,支持强大的交互式营销工具,让您的网站不只是一个死板的摆设; 网站后台登陆地址:http://你的网址/pinluo/ 系统初始默认...
  • ExtAspNet_v2.3.2_dll

    2010-09-29 14:37:08
    -Button控件将不再自动拥有display:inline属性,如果希望两个按钮在一行显示,请为第一个按钮设置CssStyle="float:left;"属性。 -修正了弹出菜单的位置在Firefox下不正确的BUG(feedback:eroach)。 -为TriggerBox...
  •  我们调研了多制造行业的公司网站,根据行业特色,开发了多该行业的网站模块,欢迎大家使用。 汇成制造行业企业网站cms系统为中小企业免费建立属于自己的网站; 拥有企业网站常用的模块功能:企业简介模块、...
  • 汇成装潢行业企业网站cms系统:我们调研了多装潢行业的公司网站,根据行业特色,开发了多该行业的网站模块,欢迎大家使用。 汇成装潢行业企业网站cms系统为中小企业免费建立属于自己的网站,拥有企业网站常用...
  • asp.net知识库

    2015-06-18 08:45:45
    一个.net发送HTTP数据实体的 按键跳转以及按Enter以不同参数提交,及其他感应事件 动态控制Page页的Head信息 SubmitOncePage:解决刷新页面造成的数据重复提交问题 SharpRewriter:javascript + xml技术利用#实现...
  • 因为日志是一行一行的,只要其中一行包含.js.css.jpg. 请求失败的为 404 成功的是 200,如果成功的就写入到一个新的文本文件里.只要包含.js.css.jpg.png之的就删掉,好像是404的话就把404给删除了 并且像这样的日期->...
  • 十二、后台可在碎片模块添加QQ、MSN、淘宝旺旺、阿里旺旺、SKYPE、第三方客服交流软件等,支持强大的交互式营销工具,让您的网站不只是一个死板的摆设; 更多的功能不再一一描述,其中的方便简单、可拓展性、人性化...
  • 实例128 获取数组中最后一个元素 158 实例129 去除数组中的重复元素 158 实例130 字符串与数组的转换 159 实例131 对数组元素进行随机排序 160 实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 ...
  • 实例128 获取数组中最后一个元素 158 实例129 去除数组中的重复元素 158 实例130 字符串与数组的转换 159 实例131 对数组元素进行随机排序 160 实例132 随机抽取数组中元素 161 实例133 二维数组的输出 162 实例134 ...

空空如也

空空如也

1 2 3
收藏数 54
精华内容 21
关键字:

删除css其中一个类