已剪辑自: https://www.cnblogs.com/xrq730/p/6662232.html

问题描述

业务有一个需求,我把问题描述一下:

通过代理IP访问国外某网站N,每个IP对应一个固定的网站NCOOKIECOOKIE有失效时间。
并发下,取IP是有一定策略的,取到IP之后拿IP对应的COOKIE,发现COOKIE超过失效时间,则调用脚本访问网站N获取一次数据。
为了防止多线程取到同一个IP,同时发现该IP对应的COOKIE失效,同时去调用脚本更新COOKIE,针对IP加了锁。为了保证锁的全局唯一性,在锁前面加了标识业务的前缀,使用synchronized(lock){…}的方式,锁住锁前缀+IP”,这样保证多线程取到同一个IP,也只有一个IP会更新COOKIE

不知道这个问题有没有说清楚,没说清楚没关系,写一段测试代码:

public class StringThread implements Runnable {

private static final String LOCK_PREFIX = “XXX—“;


privat[……]

阅读全文

Json-lib的方式:

功能较为简单
对集合类的属性的映射需要手动配置
不支持注解配置

Double/Integer等包装对象,如果值为:null,序列化结果为:0

BigDecimal序列化会出现精度丢失的情况,如:19.90,转为json字符串,会变成19.9丢失后面的0

Jackson的方式:

支持注解配置
支持对jsonkey与属性名绑定

参考:

http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html

http://www.cnblogs.com/hoojo/archive/2011/04/21/2023805.html

 [……]

阅读全文

使用jsonObj.put(“key”, null);在json对象中存入一个空值,最后在结果串里是会出现”key”:null,还是不出现”key”?

Json-Lib

在json-lib中行为如下:

public JSONObject put(String key, Object value) throws JSONException {
if (key == null) {
throw new JSONException("Null key.");
}
if (value != null) {
testValidity(value);
this.map.put(key, value);
} else {
this.remove(key);
}
return this;
}

代码表明,如果为null,Json-lib会将该key值移除,即不会出现在结果JSON里不会出现此key,也就是若name=null;id=1;则生成的JSON为{“id”,1},不会出现name的KEY,要想将null值的KEY也放进去需要使用JSONObject.NULL:obj.put(“n[……]

阅读全文

会话追踪的4种方式:

1)使用持续CookiesPersistent Cookies

2)重写包含额外参数的URLURL Rewriting

3)建立含有数据的隐藏表单字段(Hidden Form Field

4)使用内建session对象

1.使用Cookie。例如:

String sessionID=makeUniqueString();

HashMap seesionInfo=new HashMap();

HashMap globalTable= findTableStringSession();

globalTable.put(sessionID,sessionInfo);

Cookie sessionCookies =new Cookie(“JSESSIONID”,sessionID);

sessionCookie.setPath(“/”);

reponse.addCookie(sessionCookie);

上面这段代码先将会话信息记录在HashMap中,保存在服务器端,并用sessionID标识,然后把session[……]

阅读全文

  • JSP中引入文件的两种方式:
    • <%@ include file=”relativeURI”%> 可以叫作静态include(静态包含),是jsp指令中的一种,(JSP指令控制JSP编译器如何去生成servlet(servlet是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类别,一般情况下,人们将Servlet理解为后者。-维基百科)
    • <jsp:include page=”relativeURI” flush=”true” />叫作动态include(动态包含),是jsp动作的一种,(JSP动作是一系列可以调用内建于网络服务器中的功能的XML标签)
  • JSP中两种include的区别:
    • 执行时间上:

      <%@ include file=”relativeURI”%> 是在翻译阶段执行

      <jsp:include page=”relativeURI” flush=”true” />[……]

      阅读全文

WIN10/WIN8下的IE11发送的请求头中接受的语言参数

简体改为了zh-HANS-CN

繁体改为了zh-HANT-CN

导致request的locale变化

//解决方法:覆写相应的Locale

public class MyRequestWrapper extends HttpServletRequestWrapper{

    @Override  
    public Locale getLocale() {  
        if (locale != null) {  
            return locale;  
        }  
        
        Locale locale = super.getLocale();
        if ("HANS".equals(locale.getCountry())) {
            return Locale.SIMPLIFIED_CHINESE;
        } else if ("HANT".equals(locale.getCountry()[......]

阅读全文

根据《重构》第9章中可知,1.条件表达式通常有两种表现形式。第一种是所有分支都属于正常行为;第二种是条件表达式提供的答案只有一种是正常行为,其他都不是常见的情况。所以这两种表达式有不同用途,对于第一种代码可以用if-then-else的条件表达式;对于第二种某个条件极其罕见,就应该单独检查该条件,这种单独检查就被称为卫语句guard clauses)。书中举例说明:

public double getPayAmount() {
       if (isDead()) return deadPayAmount();
       if (isSeparated()) return separatedPayAmount();
       if (isRetired()) return retiredPayAmount();
       return normalPayAmount();
   }
任何人都看的懂以上代码(只要理解英文单词即可),因为条件判断与结果产生一种映射关系,大脑里不用堆砌任何代码栈,傻瓜式看代码就行。
 

[……]

阅读全文

现象

存在下面两则示例:

示例一:该不该记录日志?

catch (SocketException e)
{
LOG.error(“server error”, e);
throw new ConnectionException(e.getMessage(), e);
}

示例二:记什么级别日志?

在用户登录系统中,每次失败登录:

LOG.warn(“Failed to login by “+username+”);

解决

  1. 移除日志记录:
    1. 在遇到需要re-throw的异常时,如果每个人都按照先记录后throw的方式去处理,那么对一个错误会记录太多的日志,所以不推荐如此做;
    2. 但是如果re-throw出去的exception没有带完整的trace( cause),那么最好还是记录下。
  2. 如果恶意登录,那系统内部会出现太多WARN,从而让管理员误以为是代码错误。可以反馈用户以错误,但是不要记录用户错误的行为,除非想达到控制的目的。

启示

日志改不改[……]

阅读全文

Timed out after 30000 ms while waiting for a server that matches WritableServerSelector. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING}]
 at com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches WritableServerSelector. Client view of cluster state is{type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING}]
 at         at com.mongodb.connection.BaseCluster.cr[......]

阅读全文