经验总结

  • git合并问题

    • 使用git, 采用主干开发模式.
    • dev_1 分支开发(有多个feature同时在该分支开发), 测试完成, 合并到master分支(master由revision_1变为revision_2), 同时dev_1分支被删除.
    • master分支部署验证发现dev_1合并过来的feature_1引发严重问题, 执行回滚master操作(master由revision_2变为revision_3).
    • 现在如何将master上由dev_1上的feature_1回滚, 同时保留dev_1上其他feature?
      • 遵循原则: git上的revert操作不是将当前master从revision_2退回到revision_1, 而是增量地变为revision_3, 其中revision_3是由revision_2执行revision_1->revision_2的逆向操作而来. 即revert不会改变当前的baseline.
      • 方案1:
        1. 由master(revision_3)创建新分支dev_2;
        1. 在dev_2上执行revert操作(此时dev_2分支代码应该跟master@revision_3的代码相同, 但revision不同);
        1. 在dev_2上执行revert feature_1操作
        1. 合并dev_2代码到master@revision_3.
      • 方案2: (svn思路, 更麻烦, 不推荐)
        1. 由master@revision_2创建新分支: dev_2; (为什么能从revision_2创建新分支? 是因为在master@revision_3的发布过程中发现feature_1有问题, 此时master@revision_2尚未被删除, 当时害怕master@revision_2如果被revert到master@revision_3, 所有dev_1新增的feature代码都会消失)
        1. 此时提交dev_2合并到master@revision_3的请求会产生冲突, 因为两者的基线不同.因为: master@revision_2--revert-->master@revision_3, master@revision_2--create-->dev_2;
        1. 将master@revision_3合并到dev_2. 此时dev_2上会删除掉所有dev_1提交的代码;
        1. 在dev_2上执行revert操作, revert刚才由于master@revison_3与之合并而删除掉的dev_1的增量代码. (此时虽然dev_2的代码跟刚从master@revision_2上创建出来的相同, 但由于已经与master@revision_3进行过一次合并, 因而dev_2与master@revision_3两者的基线baseline相同)
        1. 在dev_2上执行revert feature_1操作.
        1. 合并dev_2代码到master@revision_3.
  • URLEncode/URLDecode问题

    • URLEncode不是幂等的, 而且不能是幂等的.
    • URLDecode不是幂等的.
    • MD5值是URLSafe的.

    • JS里encodeURL有两种. encodeURI和encodeURIComponent

  • cookie问题

    • 种在同一域名下不同子路径的cookie是不能共享的.
    • 如果需要在不同域名下共享登陆态, 则需要一个互信的跳转机制.
  • httprequest中locale问题

    • 请求头里会有Accept-Language. 格式: "locale;q=${value}", value越大表示语言的权值越大, 越可能是该语言.

Accept-Language: zh,en;q=0.8,en-US;q=0.6,zh-CN;q=0.4,nl;q=0.2,zh-TW;q=0.2
```

* 在Java代码里

```

public static final Map<String, Locale> localeMap = new HashMap<String, Locale>();
static{
localeMap.put("zh_cn", new Locale("zh","CN"));
localeMap.put("zh-cn", new Locale("zh","CN"));

localeMap.put("zh_tw", new Locale("zh","TW"));
localeMap.put("zh-tw", new Locale("zh","TW"));

localeMap.put("en_us", new Locale("en","US"));
localeMap.put("en-us", new Locale("en","US"));

}
private Locale getLocaleFromHeader(){
@SuppressWarnings("unchecked")
Enumeration locales = (Enumeration)request.getLocales();
if(locales == null){
return null;
}
while(locales.hasMoreElements()){
Locale locale = locales.nextElement();
if(locale != null ){
return localeMap.get(locale.toString().toLowerCase());
}
}
return null;
}
```
* 对locale的通用解决方案:
* http请求行里带上lang参数, 如果非空, 则在该根域名种下locale的cookie.
* cookie里拿到locale值. 如果非空, 则使用该值;
* http请求头里拿到locale.
* 三者优先顺序从高到低.

posted @ 2016-09-10 00:23  davyjones  阅读(160)  评论(0编辑  收藏  举报