Talk is Cheap, Show me the Code! <<网站首页文章列表

  • Docker学习——创建一个JDK+Tomcat的Solr服务镜像

    前言这里没有前言,我发现网上关于Docker的介绍文章一大堆,我写的肯定没他们好。本想去官网翻一下相关重点内容,看了文档,发现自己4.5级的英文实在难以准确翻译,大伙还是直接去[Docker官网](https://www.docker.com/)吧。 Docker安装以下是Mac版本Docker安装,完全按照[官网](https://www.docker.com/get-started)指示行事。 创建Docker账号![图片](https://oomabc.com/staticsrc/img/201905/06/1557146057796cb47a1da2da6449e8eac420fa04ad2bb.jpg)它会让你创建一个Docker账号,如果有就点击“Sign In”直接登录。![图片](https://oomabc.com/staticsrc/img/201905/06/155714614472691abe3c0ffa44bfea656932230b61072.jpg) 下载Docker.dmg登录之后点击"Get started with Docker Desktop"去下载dmg文件即可安装。![图片](https://oomabc.com/staticsrc/img/201905/06/1557146634809daaf31bd3c6942b38eeb522b02d07fc6.jpg)![图片](https://oomabc.com/staticsrc/img/201905/06/1557146681391b33ae0b1104d4c1782e4657da4bc27e4.jpg)下载页面已经告诉你后续步骤了:1. 下载并安装Docker2. 克隆一个样例git3. build自己第一个镜像4. 运行这个镜像5. 推送镜像到远程仓库---- 样例测试安装好Docker之后,我们从第2个步骤开始 克隆doodle.gitbash% git clone https://github.com/docker/doodle.git正克隆到 'doodle'...remote: Enumerating objects: 36, done.remote: Counting objects: 100% (36/36), done.remote: Compressing objects: 100% (27/27), done.remote: Total 36 (delta 13), reused 27 (delta 7), pack-reused 0展开对象中: 100% (36/36), 完成.20:49 wjyuian@wjyuianMacBookPro /Users/wjyuia

    Docker   Solr   Dubbo   2019-05-10 浏览(663) 阅读原文>>
  • 搜索引擎进阶——关键字预处理模块

    前言在搜索引擎的两个阶段会用到分词功能,分别是索引和查询。先说一下个人在垂直搜索引擎常用的索引分词设置(针对IK分词器)。无论采用何种分词设置,都会有一定的局限性或者说缺陷。因此在合适的阶段选择适合业务场景的分词方式才是最重要的。 索引阶段IK分词器提供了两种分词模式,通过布尔变量useSmart来设置。我在索引阶段设置useSmartfalse,其含义就是采用最小粒度分词,即会分出最多的可能的词汇(包括分词歧义词汇)。比如短语“中华人民共和国”的分词结果就是:中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、共和、国。可以看出来,这个模式下分词器会将词库中有的词全部分出来。其中“华人”这个词在短语中属于歧义词,在这个语境中是不合适的。之所以选择这个模式,是因为在索引的时候尽可能的建立更多分词的倒排索引关系链,这与全文检索的“一次索引,多次查询”的特点有关。对于这个短语来说,除了“华人”之外的其它分词能搜索到这个短语,都是合理的场景。 查询阶段我在查询阶段(也就是用户输入关键字查询结果中的分词阶段),设置了useSmarttrue。其含义是IK分词器会用其智能分词功能给你最合适的分词结果,一般来说是词语最少的结果,但是它能最大程度保留原短语的语境含义。比如短语“中华人民共和国”的分词结果就是:中华、人民共和国。这两个词就最大程度保留了语境含义,而且其输入能完美映射到索引阶段。对于,索引中出现“中华”和“人民共和国”两个词语相距很远的情况,可以通过设置查询跨度来过滤。"中华人民共和国"~2,这里的2是指两个双引号之间的短语,各个分词的起始位置之间的最大允许间隔。 在Solr的schema.xml的配置xml

    Solr   Java   分词   字典树   搜索引擎   2019-07-24 浏览(305) 阅读原文>>
  • 搜索引擎入门——solr筛选器facet的应用

    前言 搜索引擎的出现,整合了众多网站信息,恰恰起到了信息导航的作用。通用搜索引擎就如同互联网第一次出现的门户网站一样,大量的信息整合导航,极快的查询,将所有网站上的信息整理在一个平台上供网民使用,于是信息的价值第一次普遍的被众多商家认可,迅速成为互联网中最有价值的领域。互联网的低谷由此演变为第二次高峰。大家熟知的搜索引擎Google、百度、雅虎等是通用搜索引擎现如今的杰出代表,他们为互联网的发展做出了重要的贡献。然而,搜索引擎行业也不是一家公司就可以独撑天下的,从百度的上市、yahoo中国的并购一系列动作表明,如今的搜索引擎大战如同门户网站初期的竞争一样激烈。相信,通用搜索引擎在经历过一段时间的角逐后,也将会继续维持几大服务商各自分控一部分市场的局面。通用搜索引擎的性质,决定了其不能满足特殊领域、特殊人群的精准化信息需求服务。市场需求多元化决定了搜索引擎的服务模式必将出现细分,针对不同行业提供更加精确的行业服务模式。可以说通用搜索引擎的发展为垂直搜索引擎的出现提供了良好的市场空间,势必将出现垂直搜索引擎在互联网中占据部分市场的趋势,也是搜索引擎行业细分化的必然趋势。 垂直搜索引擎是针对某一个行业的专业搜索引擎,是搜索引擎的细分和延伸,是对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行处理后再以某种形式返回给用户。垂直搜索是相对通用搜索引擎的信息量大、查询不准确、深度不够等提出来的新的搜索引擎服务模式,通过针对某一特定领域、某一特定人群或某一特定需求提供的有一定价值的信息和相关服务。其特点就是“专、精、深”,且具有行业色彩,相比较通用搜索引擎的海量信息无序化,垂直搜索引

    Solr   Facet   Java   搜索引擎   2019-05-06 浏览(442) 阅读原文>>
  • SpringBoot2(四)Docker+Consul+Cloud+Feign

    前言距离上一篇SpringBoot2的文章,已经过去很久了,今天终于有时间继续写一篇基于SpringBoot2+SpringCloud+consul+feign的入门文章。 Spring Cloud Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。[SpringCloud](https://springcloud.cc/) Spring Cloud Feign Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。通过Feign,Java项目可以轻松实现跨语言的基于Http的服务接口。[Fegin](https://github.com/OpenFeign/feign) Consul Consul是一个服务发现与配置工具,与Docker容器可以无缝集成,同时它自身也是分布式的、高可用的、可扩展的。+ 服务发现:通过Consul,服务提供方可以轻而易举的将自己的服务进行注册,同时可以通过DNS或者HTTP接口来发现其他服务。SaaS等其他服务同样可以注册上来。+ 健康检查:当Consul集群发生任何异常时,健康检查功能可以迅速将异常信息通知给其它节点。它可以防止请求被路由到非健康节点,同时可以提供服务级别的熔断。+ 基于键值的存储:类似Zookeeper,Consul也可

    SpringCloud   Consul   Feign   Docker   SpringBoot   2019-09-22 浏览(917) 阅读原文>>
  • JVM——Java内存模型

    前言大部分Java程序员(包括我自己)大部分时间接触的都还是单线程代码,虽然JVM本身是支持多线程并发执行的。在JVM中,多个线程在执行代码(操作变量或对象)的时候,都是通过操作共享的主内存来实现的。多线程并发可能通过多个硬件处理器实现,也可能是在单处理器上通过切换CPU时钟实现,或者是在多个处理器上切换CPU时钟实现。对于程序员来说,只能通过创建一个Thread类的实例对象来创建一个线程;每个线程都会存在一个与之对于的实例对象。通过实例对象的start()方法来启动对应的线程:java//每个线程都是通过创建Thread的实例对象来定义的Thread firstThread new Thread();//只有调用的线程的start方法,才能启动线程(不管是这里的主动调用或者其他组件的隐式调用)firstThread.start();如果没有对多线程操作进行合理的同步(synchronized、volatile等)控制,就会出现一些匪夷所思的问题。本章会介绍Java多线程编码相关的语义,比如共享内存中多线程对变量进行更新之后的可见性。许多硬件体系结构中也存在类似内存模型的概念,而我们本章讨论的是Java语言中的内存模型,称为Java programming language memory model(JMM),下文简称内存模型。---- 同步(Synchronization)Java为多线程通信提供了不同级别的同步机制,最常用的就是同步原语(synchronized)了,它是通过监视器(准确的说是monitors,下文都称为监视器)实现的。每个Java对象(包括常见的类实例对象和Class对象)都有一个对应的监视器,同一个时刻只能有一个线程进获得某一个对象的监视器锁。此时,其它在尝试获得该监视器锁的线程都会堵塞,直到该锁被释放。特别注意的是,这种方式实现的锁是非公平锁:同一个线程可以多次重复获得同

    内存模型   JVM   2019-03-29 浏览(363) 阅读原文>>
  • JVM——初探内存结构(基于JDK8)

    Java是一门通用的、支持并发的面向对象的编程语言。它借鉴了C和C++的语法,但是舍弃了一些令它们变得复杂的、不安全的容易使人产生迷惑的特性。而JVM(Java Virtual Machine)则是Java平台的基石。正因为它,Java平台才能使用少量的编译代码就能实现跨硬件、跨操作系统特性,而且让用户免受恶意程序的攻击。虽然是一个虚拟的计算机器,但JVM与真实的物理计算机一样,也有自己的指令集,也会在运行时操作不同的内存区域。通过虚拟机来实现编程语言是很常见的,比如UCSD Pascal语言就是通过P-Code虚拟机实现的。第一个JVM原型是由Sun公司实现的。----- JVM内存结构——运行时数据区(Run-Time Data Areas)JVM规范定义了在程序运行期间的若干个不同的运行时数据区(内存)。有些区域的生命周期与JVM一致,随着JVM的启动而创建,又随着JVM的退出而销毁。有些区域是线程私有的,线程私有的数据区生命周期与线程的生命周期一致。+ 程序计数器(Program Counter Register)+ Java虚拟机栈(Java Virtual Machine Stacks)+ Java堆(Java Heap)+ 方法区(Method Area) + 运行时常量池(Runtime Constant Pool)+ 本地方法栈(Native Method Stacks)![图片](https://oomabc.com/staticsrc/img/201903/22/1553244569400192ca2a5a24840d6948c14e4137ac2d1.jpg)--- 程序计数器(Program Counter Register)JVM的能支持多线程并发,就是通过线程轮流切换并分配CPU时间来实现的。每个JVM线程都有各自独立的程序计数器,只有这样才能在多线程轮流切换之后恢复到正确的执行位置。同一时刻,只有一个线程可以执行当前方法对应的机器指令。如果当前执行的不是native方法,则程序计数器的值就是当前正在执行的JVM指令的内

    JVM   Java   内存结构   JDK8   2019-03-28 浏览(408) 阅读原文>>
  • 乡村风味——KMP算法通俗解释

    题目给出两个字符串main和sub,要求查找sub在main中第一次出现的位置(从0开始)。未出现过,则返回-1。 样例 例子 1 : 输入:main "1235J235J234", sub "235J234" 输出:5 例子 2 : 输入:main "12345Q2345", sub "2345J" 输出:-1 解题这个题目其实比较简单,我们直接定义两个指针,一次进行字符比较。如果相同者指针一起后移,否则重置指针(sub指针大于0的时候,main的指针不需用动;否则只要main的指针后移即可),再次比较。其实main的指针是没有回头路的,只能后移或者不动。而sub的指针就很浪了,前前后后的移动。 程序员版1. 定义i为main的下标,j为sub的下标。current为main字符串在i处的字符,同样search是sub在j位置的字符;start是主串在一轮匹配中的开始位置。2. 如果两个下标都未超出各自字符串范围(下标小于字符串长度),则跳到步骤 3 ;否则跳到步骤 5 。3. 如果current与search相同,则表示当前位置一致。此时i和j下标都加一,然后跳到步骤 2;否则跳到 4 。4. 需要对i或者j下标进行重置:如果j本身就指向sub的第一个字符,则需要将start进行加一,i从start开始;否则,j下标重置为0,i下标不动;然后回到步骤 2 。5. 如果此时j的大小与sub子串长度一致,表示匹配成功,返回i减去sub长度即可(或者说i减去j)。 大爷大妈版1. 大爷有10张麻将牌,乱序排列好,依次在每张牌后面贴上序号,从0开始,递增。2. 大妈有4张麻将牌,乱序排列好,依次在每张牌后面贴上序号,从0开始,递增。3. 如果两个人手里都有牌,则大爷大妈分别打出序号最小的牌,然后跳到步骤 4;否则跳到步骤6 。4. 如果是相同的牌,则跳到步骤 3;否则跳到步骤 5 。5. 此时如果大妈只打出一张牌

    KMP   字符串比较   优化   2019-05-05 浏览(258) 阅读原文>>
  • 搜索引擎进阶——Lucene链表操作解析

    说到搜索引擎,大家都不会陌生,尤其是互联网从业者更是如此。而大部分程序员都能对其基本原理说个七七八八,比如分词、倒排链表、空间向量模型、余弦定理、Top-N......。而且对于全文检索的两个过程索引和查询也都知道个大概。+ 索引:对数据进行分词,然后按照分词结果生成倒排链表(包含词频、位置等信息),最后生成索引文件。+ 查询:对查询语句进行分词,综合其他查询条件生成查询树并优化;对查询树进行倒排链表匹配,将匹配到的链表按照查询语义进行操作(交集、并集、差集等);最后按照打分规则进行排序并分页返回结果。当然真正的实现细节会复杂许多,比如数据结构、数据类型定义、索引存储、数据压缩、相关链表操作算法、跳跃表、打分模型、内存索引切换等等,都是需要考虑的地方。 链表操作前面介绍的那些内容中,有一个是非常重要而且相对来说比较容易看懂和说明白的就是链表操作。何为链表操作?每个Term后面都挂有一个链表,链表的元素主要包含的内容有元素的DocId(这是Lucene给每个文档的自增编号)、Frequency(这是分词在对应文档中出现的频率)。实际上,每个链表元素就对应一篇当初索引的文档,所以链表操作就是对这些文档进行交集、差集、并集的操作。例,有如下几篇文档: A:机器学习最通俗的解释就是让机器学会决策。 B:支持向量机(SVM)是90年代中期发展起来的基于统计学习理论的一种机器学习方法。 C:随机森林的基本单元是决策树。 D:分类和回归是机器学习解决的两大主要问题。 E:古典决策理论盛行于20世纪初到50年代期间。 F:分类树(决策树)是一种十分常用的分类方法,是一种有监督的机器学习方法。现在我们只考虑其中几个分词,而且暂时忽略分词的歧义性,那么简易

    链表   交集   并集   差集   Lucene   Java   搜索引擎   2019-08-13 浏览(728) 阅读原文>>
  • JVM——Java类的加载机制以及生命周期

    一、什么是类的加载类的加载,就是将.class文件中的二进制数据读取到内存中,其实是存放于运行时的方法区。然后在堆中创建一个java.lang.Class对象(该对象封装了符合方法区定义的数据结构),同时向用户提供访问方法区内的数据结构的接口。JVM允许类加载器对某个类进行预加载。预加载过程发生错误(.class文件缺失或者有错误),类加载器需要在程序首次主动使用该类时报告错误(LinkageError),如果程序一直没有主动使用这个类,则类加载器不会报告这个错误。类加载器的加载方式:本地文件系统、网络.class文件、压缩包中的.class文件、Java源文件动态编译的.class文件。 二、类的生命周期类的生命周期包括加载、验证、准备、解析、初始化五个阶段。其中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的。而解析可以在初始化阶段之后开始,这是为了支持Java语言的运行时绑定。另外注意这里的几个阶段是按顺序开始,而不是按顺序进行或完成,因为这些阶段通常都是互相交叉地混合进行的,通常在一个阶段执行的过程中调用或激活另一个阶段。 加载(Loading):查找对应目录中的类,并加载二进制字节流 1. 通过classpath和类的完整签名来读取对应的二进制字节流。 2. 将二进制字节流所代表的存储结构转化为方法区的数据结构。 3. 在堆中生成一个代表这个类的java.lang.Class对象,作为访问方法区数据结构的入口。此阶段结束之后,JVM外部的二进制字节流文件就按照规范存储在方法区了,而且堆中存在一个可以访问这些方法区中的数据的对象。 -------- 连接-验证(Linking-Verification):确保被加载的类的正确性(符合当前虚拟机版本规范,且不会造成危害) 1. 文件格式验证:验证字节流是

    JVM   类加载   ClassLoader   Java   2019-03-15 浏览(754) 阅读原文>>
  • 机器学习算法相关基础概念整理

    机器学习机器学习最通俗的解释就是让机器学会决策。对于我们人来说,比如去菜市场里挑选芒果,从一堆芒果中拿出一个,根据果皮颜色、大小、软硬等属性或叫做特征,我们就会知道它甜还是不甜。类似的,机器学习就是把这些属性信息量化后输入计算机模型,从而让机器自动判断一个芒果是甜是酸,这实际上就是一个分类问题。 机器学习本质上就是一种对问题真实模型的逼近(我们选择一个我们认为比较好的近似模型,这个近似模型就叫做一个假设),但毫无疑问,真实模型一定是不知道的,既然真实模型不知道,那么我们选择的假设与问题真实解之间究竟有多大差距,我们就没法得知。比如说我们认为宇宙诞生于150亿年前的一场大爆炸,这个假设能够描述很多我们观察到的现象,但它与真实的宇宙模型之间还相差多少?谁也说不清,因为我们压根就不知道真实的宇宙模型到底是什么。 这个与问题真实解之间的误差,就叫做风险(更严格的说,误差的累积叫做风险)。我们选择了一个假设之后(更直观点说,我们得到了一个分类器以后),真实误差无从得知,但我们可以用某些可以掌握的量来逼近它。最直观的想法就是使用分类器在样本数据上的分类的结果与真实结果(因为样本是已经标注过的数据,是准确的数据)之间的差值来表示。这个差值叫做经验风险Remp(w)。以前的机器学习方法都把经验风险最小化作为努力的目标,但后来发现很多分类函数能够在样本集上轻易达到100%的正确率,在真实分类时却一塌糊涂(即所谓的推广能力差,或泛化能力差)。此时的情况便是选择了一个足够复杂的分类函数(它的VC维很高),能够精确的记住每一个样本,但对样本之外的数据一律分类错误。回头看看经验风险最小化原则我们就会发现,此原则适用的大

    RNN   CNN   分类   回归   2019-03-10 浏览(263) 阅读原文>>
  • J2EE开发技术栈相关整理——基础版

    AI基础进行中... Zookeeper简介 Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination. ZooKeeper is a high-performance coordination service for distributed applications. It exposes common services - such as naming, configuration management, synchronization, and group services - in a simple interface so you don't have to write them from scratch. You can use it off-the-shelf to implement consensus, group management, leader election, and presence protocols. And you can build on it for your own, specific needs.Apache ZooKeeper致力于提供一个高可用、高性能、开源的分布式应用协调服务。它为分布式应用提供一致性保障,常用的服务包括:命名系统、配置管理、分布式同步、组服务等。你通过一些简单的接口就可以轻而易举的获得一些功能,例如一致性维护、组管理、leader选举;同样的,你可以基于它来实现自己想要的其它功能。 ZooKeeper是以Fast Paxos算法为基础的,Paxos算法存在活锁的问题,即当有多个proposer交错提交时,有可能互相排斥导致没有一个proposer能提交成功,而Fast Paxos作了一些优化,通过选举产生一个leader (领导者),只有leader才能提交proposer,具体算法可见Fast Paxos。因此,要想弄懂ZooKeeper首先得对Fast Paxos有所了解。 设计目的+ 易用性 ZooKeeper提供一种简单的层级式命名设计,就像我们PC标准的文件系统一样(文件和目录)。通过共享同一个命名目录,ZooKeeper实现多个分布式处理过程之间可以相互通信、协调。 命名空间由数据目录组成,我们称之为zn

    Java   Zookeeper   Curator   2019-05-06 浏览(361) 阅读原文>>
  • 微信小程序深入踩坑总结

    一、小程序页面栈 wx.navigateTo(Object object)这是小程序中最常用的页面跳转方法,功能有点类似于HTML中的link,在参数url中可以跟参数,其方式也与href类似。官方是这样描述的: 保留当前页面,跳转到应用内的某个页面。但是不能跳到tabbar页面。使用wx.navigateBack可以返回到原页面,小程序中页面栈最多十层。这个方法实际上会在页面栈保留当前页,然后新页面也会入栈,所以一直使用wx.navigateTo进行页面跳转,页面栈很容易就达到十层的限制,然后就再也无法进行页面跳转了。![图片](https://oomabc.com/staticsrc/img/201901/31/1548927005955fb2a3f87642749788f78b7bd869edce5.jpg) wx.redirectTo(Object object)这时候,我们可以使用wx.redirectTo进行页面跳转,它会将当前页面弹出页面栈,然后新的页面入栈。官方文档: 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到tabbar页面。如果页面跳转都是通过这个方法实现,页面栈就不会满,也就不会出现无法跳转的情况。但是问题来了,使用这个方法是无法回到上一页的,因为你根本就没有在页面栈保存上一页的信息,显然这不是我们想要的。 wx.reLaunch(Object object)先来看官方的描述: 关闭所有页面,打开到应用内的某个页面。显然,这个方法先重置页面栈,然后将新页面入栈。不过,如果一直使用这个方法进行页面跳转,跟一直用wx.redirectTo带来的问题是一样的:无法返回上一页。 取长补短上面提到的几种页面跳转方式各有所长,不过好在他们的参数传递方式以及回调函数都是一致的。因此,我们根据实际的业务逻辑和页面跳转关系进行分类,然后将流程递进式跳转使用wx.redirectTo,流程重置式跳转使用wx.reLaunch。这样一来既保证了页面跳

    小程序   分享   小程序拉起   登录   2019-01-31 浏览(2531) 阅读原文>>
  • 搜索引擎进阶——solr自定义function

    本章要介绍的内容是solr中的自定义排序规则,或者说自定义得分函数。看懂本章内容,最好了解过以下知识点:1. solr的基本查询功能2. solr的edismax高级复合查询3. edismax中bf的作用关于solr内置function的用法可以参考官方文档《[Function Queries][solrLink]》,后续如果有机会,我会另出一篇文章加以阐述。---- 需求背景本来搜索服务提供的是一个职位搜索功能,面向的用户是猎头。所以,有一个需求就是按照猎头对每个职位的一个偏好预测值(记为V)进行职位综合排序。每个猎头对于不同的职位都有一个偏好预测值,记为H1V1。这个值由AI团队根据猎头所有行为记录进行统计计算,然后搜索团队要在猎头某一次搜索的结果内进行偏好预测值排序。几万猎头和几万职位的预测值是一个非常庞大的数据集。功能实现方式:1. 在职位索引增加一个动态字段,然后在建索引的时候猎头ID命名动态字段,对应的值就是这个猎头对当前职位的偏好预测值。dmdouble10002100,表示猎头10002对当前职位的偏好预测值为100。然后在搜索的时候,通过猎头id指定字段进行sort即可。2. 自定义一个function,通过solr提供的功能,在搜索时进行实时预测值查询,然后内置排序。方法1确实是一个最简单的方式,非常好理解,就是增加一个动态排序字段,然后sort即可。但是问题是数据量会非常大,而且意义不大。如果有10000个职位,30000个猎头,那么笛卡尔积就是3亿的偏好预测值,平均每个职位上要大约增加30000个动态字段,一个document会变得非常臃肿。当然,可以进行无效数据的预处理等方式进行优化,但是最后的数据依旧会庞大无比,关键是大部分都是无效数据。所以,我采用的是方法2。![图片](https://oomabc.com/staticsrc/img/201812/18/15

    ValueSource   排序   Solr   Java   搜索引擎   2019-07-23 浏览(1384) 阅读原文>>
  • springMVC中controller参数拦截问题处理

    在一个安静的清晨,我正看着自己的代码思考人生。突然,下方的通讯工具一阵抖动。这么早,谁会找我?点开消息框一看,一种“不翔”的预感用上心头——来活了。原来是网安发来的一份网站漏洞扫描报告,大意就是我们主站存在高等风险弱点若干个,主要就是XSS漏洞和Http未加密传输,以及列出了相关解决方案。Http未加密的解决方式是通过代理重定向到Https,这个我知道,但是,这XSS是什么东东?之前听过这个词,但不太清楚实际意思,于是Google了一下: 跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。关于XSS的详细介绍我这里就不进行阐述了,因为本人也不是很清楚,可以参考美团技术团队的一篇文章:[前端安全系列(一):如何防止XSS攻击?] [outLink]。接下来,我主要阐述如果在springMVC中进行请求参数拦截和XSS转义处理的。---考虑到,我们需要在参数传到controller之前就要处理参数,因此需要在某个拦截器中将HttpServletRequest对象进行处理。拦截器处理有两种比较常用的:1. mvc:interceptors配置MVC拦截器:继承org.springframework.web.servlet.handler.HandlerI

    springMVC   ModelAttribute   拦截器   2018-12-14 浏览(2849) 阅读原文>>
  • Java网络编程之Netty学习(三)—— RPC的服务注册、发现、降级

    前言上一篇[《Java网络编程之Netty学习(二)—— 简单RPC实现 》][prevLink] 简单介绍了如何使用netty实现远程过程调用。不过在很多方面都存在着问题,包括并发性、内存使用、负债均衡、服务发现、服务注册、服务降级。本章以及后续将会出现的章节,旨在逐步解决这些问题,当然解决这些问题的方式、方法都会是自己思考并结合dubbo相关源码。主要是通过这一系列的实践来学习Netty、dubbo等技术框架的应用。本章主要介绍如何通过zookeeper来实现Provider的注册、Counsumer订阅、本地降级。代码都是在本系列前置文章的源码的基础之上修改的,后续会逐步进行代码重构。经整理,本章内容的主要信息点如下:1. 获得provider服务器ip2. Zookeeper客户端curator的使用3. Zookeeper节点监听以及回调4. mock接口本地简单判断![图片](https://oomabc.com/staticsrc/img/201811/25/15430775764853961c5b74bae4b7a999a84a4d9ff7cec.jpg)--- 知识点介绍 如何获得本机的IP地址这里指的是获得服务器的IP地址,而不是获得请求客户端的IP地址。一般情况下,我们如果想获得客户端的IP地址,通常会从HttpServletRequest对象中获取,比如:java private static final String NGINXIPHEADER "X-Real-IP"; private static final String NGINXXForwardedFor "X-Forwarded-For"; / 功能描述: 获取ip(兼容nginx转发) @param request @return / public static String getIpAddr(HttpServletRequest request) { String ips request.getHeader(NGINXXForwardedFor); String[] ipArray org.apache.commons.lang3.StringUtils.split(ips, ","); if (ArrayUtils.isNotEm

    Netty   Java   Dubbo   RPC   2019-05-06 浏览(1963) 阅读原文>>
  • 1  2  3  4 
    blogTest
    分享文章
     
    使用APP的"扫一扫"功能,扫描左边的二维码,即可将网页分享给别人。
    你也可以扫描右边本博客的小程序二维码,实时关注最新文章。