分类目录归档:IT生活

SpringBoot 配置内置Tomcat 解决 RFC 7230 与 RFC 3986 请求字符限制问题

感谢 大专栏 提供教程,本文转自 大专栏

如需要了解更详细信息请移步 大专栏

问题引出:

容器模块引用公司统一要求的父pom以后,springboot版本升级为1.5.14,其内置tomcat变更为8.5.31,启动不报错,发送特殊字符(中括号)Get请求报错:

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

原因:

所有主要版本的Tomcat(7.0.738.0.398.5.7)都加入了对请求头字符的限制。

stackoverflow相关问题

解决方案:

1. 妥协:前端对参数进行uriencode或springboot换容器。

2. 任何初始化代码中配置系统变量(有限制):

System.setProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow", "{}");

原理是在org.apache.tomcat.util.http.parser.HttpParser类,125行静态初始化方法中:

String prop = System.getProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow");
if (prop != null) {
    for (int i = 0; i < prop.length(); i++) {
        char c = prop.charAt(i);
        if (c == '{' || c == '}' || c == '|') {
            REQUEST_TARGET_ALLOW[c] = true;
        } else {
            log.warn(sm.getString("http.invalidRequestTargetCharacter",
                    Character.valueOf(c)));
        }
    }
}

REQUEST_TARGET_ALLOW静态数组保存了请求字符是否被允许的状态,从代码中看出,这种方法只允许{}|三个字符过审。

3. 更优雅的定制化配置:

public class  implements EmbeddedServletContainerCustomizer {

    @Override
    public void customize(ConfigurableEmbeddedServletContainer container) {
        TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory) container;
        factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
            @Override
            public void customize(Connector connector) {
                connector.setAttribute("relaxedQueryChars", "[]");
            }
        });
    }
}

原理是在同类的147 行代码构造方法里:

public HttpParser(String relaxedPathChars, String relaxedQueryChars) {
    for (int i = 0; i < ARRAY_SIZE; i++) {
        
        // Combination of multiple rules from RFC7230 and RFC 3986. Must be
        // ASCII, no controls plus a few additional characters excluded
        if (IS_CONTROL[i] || i > 127 ||
                i == ' ' || i == '"' || i == '#' || i == '<' || i == '>' || i == '\' ||
                i == '^' || i == '`'  || i == '{' || i == '|' || i == '}') {
            if (!REQUEST_TARGET_ALLOW[i]) {
                IS_NOT_REQUEST_TARGET[i] = true;
            }
        }

        /*
         * absolute-path  = 1*( "/" segment )
         * segment        = *pchar
         * pchar          = unreserved / pct-encoded / sub-delims / ":" / "@"
         *
         * Note pchar allows everything userinfo allows plus "@"
         */
        if (IS_USERINFO[i] || i == '@' || i == '/' || REQUEST_TARGET_ALLOW[i]) {
            IS_ABSOLUTEPATH_RELAXED[i] = true;
        }

        /*
         * query          = *( pchar / "/" / "?" )
         *
         * Note query allows everything absolute-path allows plus "?"
         */
        if (IS_ABSOLUTEPATH_RELAXED[i] || i == '?' || REQUEST_TARGET_ALLOW[i]) {
            IS_QUERY_RELAXED[i] = true;
        }
    }

    relax(IS_ABSOLUTEPATH_RELAXED, relaxedPathChars);
    relax(IS_QUERY_RELAXED, relaxedQueryChars);
}

connector的配置参数会交给Http11Processor,其创建HttpParser时又传入到构造方法中,最后记录下来。IS_QUERY_RELAXED是判断传参字符是否合法的直接依据,从代码中可以看出REQUEST_TARGET_ALLOW是它的子集。

java多线程——并发测试

感谢:大码侯

cool_wier

关注个人成长和游戏研发,致力于推进国内游戏技术社区的进步。

来源: java多线程——并发测试

编写并发程序时候,可以采取和串行程序相同的编程方式。

唯一的难点在于,并发程序存在不确定性,这种不确定性会令程序出错的地方远比串行程序多,出现的方式也没有固定规则。那么如何在测试中,尽可能的暴露出这些问题,并且了解其性能瓶颈,本篇针对这些问题来做个简要总结。

海量数据相似度计算之simhash和海明距离

 

本文来自:Web开发者-《海量数据相似度计算之simhash和海明距离》

通过 采集系统 我们采集了大量文本数据,但是文本中有很多重复数据影响我们对于结果的分析。分析前我们需要对这些数据去除重复,如何选择和设计文本的去重算法?常见的有余弦夹角算法、欧式距离、Jaccard相似度、最长公共子串、编辑距离等。这些算法对于待比较的文本数据不多时还比较好用,如果我们的爬虫每天采集的数据以千万计算,我们如何对于这些海量千万级的数据进行高效的合并去重。最简单的做法是拿着待比较的文本和数据库中所有的文本比较一遍如果是重复的数据就标示为重复。看起来很简单,我们来做个测试,就拿最简单的两个数据使用Apache提供的 Levenshtein for 循环100w次计算这两个数据的相似度。代码结果如下:

继续阅读

基于webkit的浏览器的滚动条

 

感谢作者:超毛【前端开发

 

因为最近公司做的项目需要用到滚动条(项目在webkit平台下运行),所以研究下滚动条的CSS。

浏览器默认的滚动条样子太过屌丝了,得自己动手整整。记得IE浏览器有几个设置滚条的样式,不过比较鸡肋,只能设置颜色之类的,而且webkit下面也不支持。无意间看到网易邮箱的滚动条样子很好看,一开始以为是用div模拟的,结果一看,吼吼,正合我意,利用的CSS来设置的,而且是webkit浏览器的。

11111

得好好研究这几个属性下,才能自己动手改造。

webkit浏览器css设置滚动条

主要有下面7个属性

  1. ::-webkit-scrollbar 滚动条整体部分,可以设置宽度啥的
  2. ::-webkit-scrollbar-button 滚动条两端的按钮
  3. ::-webkit-scrollbar-track  外层轨道
  4. ::-webkit-scrollbar-track-piece  内层滚动槽
  5. ::-webkit-scrollbar-thumb 滚动的滑块
  6. ::-webkit-scrollbar-corner 边角
  7. ::-webkit-resizer 定义右下角拖动块的样式

继续阅读

Diskpart,轻松实现MBR转GPT – 有所思 – SOTHINK

 

来自:Diskpart,轻松实现MBR转GPT – 有所思 – SOTHINK

 

如何将硬盘的磁盘分区形式由MBR转换成GPT?想在PC机上装Mac OS X的朋友肯定会遇到这个问题。今天我就来说说,我是怎么使用Microsoft Windows自带的Diskpart工具实现MBR转GPT的。

重要:操作前,请备份移动硬盘上的数据。

简单介绍一下要用到的命令,很简单,也很容易理解:


描述

list volume

显示所有磁盘上基本卷和动态卷的列表。

select volume

选择指定的卷并向其转移焦点,其中 n 是卷号。如果未指定卷,则 select 命令将列出当前具有焦点的卷。可以按编号、驱动器号或装入点路径指定卷。在基本盘上,选择卷同时会给予相应分区焦点。

delete volume

删除所选卷。不能删除系统卷、启动卷或任何包含活动页面文件或故障转储(内存转储)的卷。

list disk

显示磁盘以及磁盘相关信息的列表,如大小、可用空间量、磁盘是基本磁盘还是动态磁盘,以及该磁盘是使用主引导记录 (MBR) 还是 GUID 分区表 (GPT) 分区形式。标有星号 (*) 的磁盘具有焦点。

select diskn

选择指定的磁盘并向其转移焦点,其中 n 是磁盘号。

convert gpt

将具有主启动记录 (MBR) 分区形式的空白基本磁盘转换为具有 GUID 分区表 (GPT) 分区形式的基本磁盘。

打开命令提示符,输入 diskpart 进入diskpart提示符。Vista用户可以直接在开始菜单的搜索框中输入diskpart回车即可打开diskpart提示符。

在diskpart提示符下输入 list volume 列出所有卷,使用 select volume 将焦点移动到移动硬盘上对应的卷,如: select volume G (G为移动硬盘上的一个盘符),然后执行delete volume  即可将当前选中的卷删除,重复选择卷与删除卷的操作,直至删除移动硬盘上的所有卷。

移动硬盘上的所有卷都删除之后使用 list disk 列出计算机中的所有磁盘,然后使用select disk 命令选中移动硬盘,最后执行 convert gpt 即可。

Update:
用完了移动硬盘,有的朋友可能还需要将其从GPT转换成MBR,方法和上面相同,只是最后一步的命令为convert mbr

【软件应用】易宝典: 如何调节 Windows 7任务栏缩略图预览的大小?_QQ电脑管家官方吧

 

【软件应用】易宝典: 如何调节 Windows 7任务栏缩略图预览的大小?_QQ电脑管家官方吧

 

任务栏缩略图预览是 Win 7 特有的 Aero Peek 的一大应用。当鼠标悬停在任务栏图标之上时,便会打开缩略图预览窗口,帮助用户快速找到想打开的内容。
操作界面本来就以“友好易用”为主旨,在此基础上,今天小易再和大家分享一个小技巧:根据需要调整预览窗口的大小。
注意:本文操作会涉及到注册表的修改,修改注册表具有一定的风险,不恰当的修改可能导致系统不稳定,请谨慎操作。
打开开始菜单,在开始搜索框中,输入“regedit.exe”,按回车键打开注册表编辑器。

 

继续阅读

V460在32位WIN7下使用8G内存说明

很久没有写日志了,今天来写一篇。年初买了一台V460的机子,最近考虑升级,但是纠结使用SSD,还是加内存。SSD关注了一很长一段时间,令自己满意的还找不出几个好的型号和牌子,要么贵,要么没保障。不过在XXB2C商城,看到南亚易胜的260多一条。于是心动了,到底是换内存还是SSD???那么从V460的32位WIN7(XP)下使用4G或超过4G的内存问题来选择。 当然最后选择了内存。最后有个总结值得大家看看和了解下。

本文为原作希望转载标明出处和作者!

经过再次的测试,证明,以下方不适合:双显卡,需要关掉显卡切换功能(V460在BIOS中可以关掉,具体可以BAIDU一下,还是就是V460最好在双切模式下把显卡切到独立显卡,再重启在BIOS中关掉切换功能);独立声卡;独立网卡。。。也就是电脑需要保证硬件独立性,不能有存在同时启用的情况。否则会蓝屏~~~~

     SSD,我看好Inter和OCZ的,不过它们都太贵。金士鈍的呢又不敢打保障,虽然它是做闪存的,但是固态硬盘的性能和优劣,主控芯片才是王道。

     现在大家都有一个关点就是。32位的操作系统只能识别3.2G的内存。这是按理论的算法计算的,是正确的。但是忽略了一个内存管理技术。PAE,百度一下它,你会知道它的功能的。如果懂内存地址算法,懂PAE技术就不难。在支持PAE的技术下,32位操作系统可以支持超过3.2G的内存。

     于是,大家都在想有没有办法让32位系统使用4G内存或超过4G内存。可以做个测试【前提,支持PAE,并开启PAE】。如果你有多的内存不可用。那么,你可以装下32位的server版的操作系统。你看看内存识别和使用情况。出现新状况了吧。以前在WIN7、XP等非server版操作系统下不能识别的内存,现在能识别了吧。这是什么情况呢?很简单,非server版和server版面对的用户群不同,当然,价格不同,功能支持也不同。微软肯定会把大内存支持在server 版中使用,做服务器操作系统需要的就是大内存。win7和XP用户群一般不会用那么大的,所以价格也低些。因此这也成了微软的卖点。那意味着如果win7也能像server版那样支持APE就好了。是win7和XP限制PAE,还是WIN7和XP不支持APE?我们继续往下看。。。

     ReadFor4G,这个可能是大多数想解决大内存的同学熟知的。它真正能解决WIN7和XP下大内存的需求吗?按ReadFor4G的说明来看,它修改了WIN7的内核限制,绕开限制,直接支持大内存。如果按这种说法来看,如果ReadFor4G是正确的,那么win7和XP是限制了PAE,那么我来验证下这个问题。

     该次验证选用的是V460,至于它具体什么型号,大家都一样的。

     首先,看V460是否开启APE,使用everest软件来看,这个软件很强大的。懂硬件的应该都知道的,如图一,证明V460是支持PAE的,并且已经启用的,这里说明一问题,460在WIN7下,PAE是开启的,但为什么内存读不全呢,似乎证明了ReadFor4G说的。

 

PAE截图

 

(图一)

继续阅读

为自己5年的华硕A3H升级(内存/CPU)

今天心血来潮了,想为自己的华硕A3H。已经成功升级了内存和CPU。

 

原始配置:

       内存:1024(Kinston) + 512(三星)

       硬盘:60G 富士通

       CPU:1.5GHz 赛扬

现配置:

      内存:1024(Kinston) + 1024 (三星)

      硬盘:未变,考虑中

      CPU:2.13GHz PM770

===========================  下面还有  ================================

            

继续阅读