X.d 笔记

小Web,大世界

0%

使用 Tomcat 服务器,在conf/context.xml里面加上useHttpOnly后,也只能能给 JSESSIONID 加入 httpOnly 属性,并不能给应用程序里面的Cookie加上。

如在context.xml上加

<Context useHttpOnly="true">

而javax.servlet.http.Cookie本身也没有HTTPONLY属性。所以加的时候也不会有什么Cookie.setHttpOnly之类的方法。其它可以通过设置响应头实现。

比如之前若是写了一个addCookie方法如下

public static void addCookie(HttpServletResponse res, String cookieName,
        String cookieValue) {
    String v = "";
    try {
        v = URLEncoder.encode(cookieValue, "UTF-8");
    }
    catch (Exception e) {
    }
    Cookie c = new Cookie(cookieName, v);
    c.setPath("/");
    res.addCookie(c);
}

其实Cookie也只是服务器给浏览器设置了一个set-Cookie响应头,我们可以利用response.setHeader来自己拼这个头开实现带httpOnly属性的的响应头。

阅读全文 »

小小说下Java里面的异常处理,貌似国内的程序员都很牛逼啊,个人参与的好多项目,根本没有异常处理,程序牛B到不会出异常还确实不异,当然我比不上他们,我的程序还是有异常的,所以这里谈下我的处理方式。

Java里面的异常处理有两种,捕获(try cacth)与抛出(throw),之所以看到没有异常处理不是没有在代码里没有看到这些关键字,而是只要是try cacth 就是清一色的那么一行 e.printStackTrace();要么就一个try cacth都看不到,不管到哪都是throws Exception,反正老子的程序不会有异常,这个代码多简洁省事啊~。

根据个人的总结,最好将就以下几点:

  1. 如果是业务逻辑层面,比如用户操作的顶层,直接操作包装好的数据的时候,必须用try cacth,因为你throws也没有地处理了,当然,你有神一般的底层的话,你会发现 “你的程序根本不会出错,至少eclipse上都没红点,cacth个毛啊”

  2. 如果是写的一些底层(并不说很牛的东西,就是很多地方都会用到的,比如Util什么的),必须用throws,如果你用try cacth了,就会发现上面说的“程序不会出错的情况”

  3. 如果是写的一些底层,且有流等类型的不稳定元素需要代码执行完后关,理所应该用 try+cacth+finally的组合了,怎么throws呢,很少在程序里见到的throw关键字就起作用了,先在cacth里面加入throw,再在方法上加上throws

阅读全文 »

以前使用Firefox的时候,除了必装的插件 Firebug 外,还喜欢装个 Yslow,堪称 Web 开发必备神级插件。

现在 Chrome 虽然比 FF 性能上来看快出不少,但插件还是不尽人意,特别是自带的开发者工具什么玩也没有 FireBug 好用。
不过目前看到一个插件还是相当爽的,而且是 Google 官方提供的插件

PageSpeed Insights

下载地址:
用Google Chrome打开https://chrome.google.com/webstore/detail/pagespeed-insights-by-goo/gplegfbjlmmehdoakndmohflojccocli

基于Chrome官方开发者工具的网站分析工具,功能和YSLOW类似,可以分析网站为什么慢,更强的是,可以直接解决某些问题,省去自己动手,比如JS,CSS,工具会直接进行压缩,图像可以直接无损压缩,初次尝试就觉得比 Yslow 给力了。

来张试用图

PageSpeed Insights](chromeplugin)

现在貌似很多网站都喜欢搞书签版应用,比如有道翻译,QQ输入法什么的,只要把一个按钮拖到书签,每次点书签的时候就会在当前页面上启动书签里面的应用。很有趣也很简单,其实就把这么几行代码写成一行,放在a村签的href属性里面就行了

var element = document.createElement('script');
element.charset = 'utf-8';
element.setAttribute('src', 'http://xxx.com/tool.js');
document.body.appendChild(element);

写成这样

<a href="javascript: void((function() {var element = document.createElement('script');element.charset = 'utf-8';element.setAttribute('src', 'http://xxx.com/tool.js');document.body.appendChild(element);})())" >把我拉到书签吧</a>

然后在自己的网站上写个tool.js就行了,用法相当广泛,而且还跨浏览器,随便写个测试

阅读全文 »

安装Tomcat后,默认已经不错了,围绕配置的优化一般也就两个方面:

  1. 调优 JVM 启动的内存大小
  2. 优化连接方式

Tomcat 的连接方式

  • JIO:普通的Java io 处理。tomcat默认的 IO 连接方式。
  • NIO:java new io正理,有非阻塞 IO 特性。使用nio修改下
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol">
  • Apr: 使用C语言写的一种连接器。需要安装 APR 和 Native,然后修改 Connector 的 protocol
<Connector protocol="org.apache.coyote.http11.Http11AprProtocol">

这三种方式,看网上所有人都如是说说 Apr > nio & jio,甚 至把 jio 鄙视的一文不值,当初我也以为是这样,毕竟C更贴近底层一些,而 nio 名字听起来也比 io 吓人,所以就把这些都装上去尝试了一下,结果发现这些不相上下,特别是处理小文件方面比 apr, nio 要快的多。忽然有种被忽悠的感觉,听说快的原因如下:

  1. apr 虽然是更接近底层的c写的,但每次都要执行很多,jio 编译成码流后,可以省很多性能。
  2. nio 处理文件由于有非阻塞 io 的特性,会额外增加不少开销,并不是万能的快。
阅读全文 »

开发的时候使用 Tomcat 大都使用的默认配置,很少性能调优,主要由于:

  1. 懒:如果是开发环境确实没什么必要,仅仅是大量压力的时候需要调下,而且默认的设置也是调过很多次的。虽然来是最优也能兼容很大情况。
  2. 不知道怎么去调试内存。

如果是在生产环境,也很难搞,因为生生环境有真实用户,不太好进行压测。所以要知道生产环境需要启动分配多少heap,多少stack多少prem都是不好说的。

最近研究下,能否通过本地开发环境启动时的配置数据加测试数据,和生产环境的用户数和并发量简单算出一个合适的启动参数呢?但也是不准确的,所以可以慢慢观察。

JVM 的启动参数

  • -Xms 限制Java堆的大小最小
  • -Xmx 限制Java堆的大小最大 当程序中请求一分配一个内存时、空间不够就会报Out Of Memory错误
    如果设置成一样大,则不会去扩展,这点很重要
  • -XX:+HeapDumpOnOutOfMemoryError 出现内存错误时dump出一个heap的快照以便分析
    这个文件通过Eclipse插件:MAT打开分析
  • -Xss : 栈容量 一般不会用到,如果设的小的话,会经常报StackOverflowError,栈桢超出
  • -XX: PermSize 给方法堆分配的空间
  • -XX:MaxPermSize 给方法堆分配的空间
    PermSize一般来说不必太在意,GC时一般不会去回收这部分空间,(当然各JVM版本不同,处理时也不不相同)
阅读全文 »

整理一下HTTP的基础知识:(四):URL,Cookie

最后说下URL和Cookie可能你说还有session,但标准上来说是没有定义session,只不过服务器软件形成了共识,都做了Session机制。

简单点说就是基于一个Cookie,做为KEY,然后存放一些数据到里面。这样也方便去取。

URL

URL的
格式为:protocol :// hostname[:port] / path / [;parameters][?query][#fragment]

  • Protocol 协议
  • Hostname 主机名
  • Port 端口
  • Path 路径
  • Parameters 选项
  • ?query 查询
  • #fragment 片段(书签)

这里简单写个javaScript表达式方法测试是不是HTML的URL(没太多验证,COPY需谨慎)

function execUrl(url){
    var rtn = false;
    var strRegex = "^(https://|http://)"
        + "([^:/]+)"
        + "(:[0-9]{1,4})?"
        + "([^?#]*)"
        + "([^#]*)"
        + "(.*)$";
    var regUrl = new RegExp();
    regUrl.compile(strRegex);
    if (regUrl.test(url)) {
        rtn={
            'protocol':RegExp.$1,
            'host':RegExp.$2,
            'Port':RegExp.$3,
            'Path':RegExp.$4,
            'query':RegExp.$5,
            'fragment':RegExp.$6
        }
    }
    return rtn;
}
//test
console.log(execUrl("http://www.xdnote.com:80/js5/main.php?sid=DDKQwEHHSYSSdxkkyYHHHAdmHFGOezJD#module=outlink"));
阅读全文 »

先说明一下语法符号

  • SP = 空格
  • GRLF = 结束+换行

HTTP请求语法

Request-Line 
*((general-header
|request-header
|entity-header) GRLF)
GRLF
[message-body]

第一行为Request-Line语法为:

Method SP Request-URI SP HTTP-Version CRLF

第二三四行有点正则味道,*说明是可选的,不一定有

首先是由general-header,request-header,entity-header组成,三个header。

关于这些header详细往下说明。

阅读全文 »