感觉原书英文版也有错误的地方,不知道读的朋友发现没有
2013-01-09
在第三章,连接器那里
中文版43页“若存在参数jsessionid,则表明回话标识符在查询字符串中,而不在Cookie中。因此,需要调用该请求的setRequestSessionURL()方法并传入true值。否则,调用setRequestSessionURL()方法并传入false值,同时调用setRequestedSessionURL()方法并传入null……”
我开始看的时候就被搞糊涂了.setRequestedSessionURL()和setRequestSessionURL()有什么区别,为什么一个传入boolean值一个传入对象呢?
是不是中文译者笔误?我就跑到作者官网下了一份英文版试读,发现原版就这么写的。既然不是译者的错误,那作者要表达什么?我又通过作者提供的Tomcat源码发现HttpRequest接口里并没有setRequestSessionURL()方法,只有setRequestedSessionURL()方法。再看一下接口的定义“Set a flag indicating whether or not the requested session ID for this request came in through a URL. This is normally called by the HTTP Connector, when it parses the request headers”
翻译过来就是“设置一个标记用来指示本次请求所请求到的session id是否是来自URL,这通常由HTTPConnector来调用,当它解析request头的时候”(大概是这个意思)。也就是说true或者false是用来指示session id是否源自cookie。
故而上面的setRequestSessionURL()应该改为setRequestedSessionURL()。那么既然这个方法要求传入boolean值,那么显然后面的传入null是不对的(1.4)。另外也没必要在传入false的时候再传一次null,所以可想而知,setRequestedSessionURL(null)这个代码也是作者的笔误。那么应该改成什么呢?
通过上下文不难看出这段代码大概是要往request里设置一个值。设置什么样的值?跟session有关的。再查一下tomcat接口的源码只发现了一个这样的接口
/**
* Set the requested session ID for this request. This is normally called
* by the HTTP Connector, when it parses the request headers.
*
* @param id The new session id
*/
public void setRequestedSessionId(String id);
翻译一下上面的解释就是。“为本次请求设置请求到session id”。再来结合作者语境:“若存在参数jsessionid,则表明回话标识符在查询字符串中,而不在Cookie中。因此,需要调用该请求的setRequestSessionURL()方法并传入true值。否则,调用setRequestSessionURL()方法并传入false值,同时调用setRequestedSessionURL()方法并传入null……”
作者想要说这个session id不是来自 URL,也就是说是来自cookie。
所以调用了setRequestedSessionURL(false);注意,是更正后的Requested。那么再调用request.setRequestedSessionId(null);的意思就是,这次请求到的session id不是来自URL,所以不往requestedSessionId这个属性设值。。。