tomcat 知识点

  • 在许多webapps中,最重要的cookie是会话标识符,由容器自动设置为JSESSIONID cookie。

  • 一种常用的不创建session的方法是在jsp页面头上加一句:
    <%@ page session=”false”>
    这样在请求这个页面的时候就不产生session了。
    这个在tomcat内部是怎么实现的呢?
    首先明确一点,jsp在本质上是httpservlet,在/tomcat/work目录下面你会发现有跟自己的应用相同目录结构的一些文件,其中的jsp文件都变成了class文件,这实际是被jspcompiler编译过的。上面提到了WrapperValue会最终调用servlet处理request。有兴趣的同学可以跟踪一下,会发现到了调用jsp对应的servlet(JspServlet)(这个是在tomcat/conf/web.xml里面配置的,对于.jsp,对应的servlet是jspservlet)时,最终会着落在tomcat下面实现了PageContext接口的特定于jsp specification的实现类:PageContextImpl。
    在这个类的initialize里面有这么一句:

if (request instanceof HttpServletRequest && needsSession)
    this.session = ((HttpServletRequest) request).getSession();

这句的意思就是,有session获取session,没session新建一个。而通常,这个地方也是客户端与tomcat下面的应用交互时产生session的入口。
这句里面的needsSession就是之前提到的jsp页面上配置的值,默认是true.所以如果想在访问某个页面时不产生session,只需要设置成false就可以了。

  • 在默认情况下session是依靠客户端的cookie来实现的。但如果客户端浏览器不支持cookie或将cookie功能关闭,那就就意味着无法通过cookie来实现session了。在这种情况下,我们还可以有另一种选择,就是通过url来传递session id。
    对于Tomcat来说,需要使用jsessionid作为key来传递session id。
    但具体如何传呢?可能有很多人认为会是如下的格式:
http://localhost:8080/test/MyJSP.jsp?jsessionid= D5A5C79F3C8E8653BC8B4F0860BFDBCD

看源码得出,MyJSP.jsp后跟的是";",并不是"?",因此,正确的url如下:

http://localhost:8080/test/MyJSP.jsp;jsessionid= D5A5C79F3C8E8653BC8B4F0860BFDBCD

通过使用上述方法甚至可以在不同的机器上获得同一个session对象。

  • 将tomcat的cookie支持关闭
    tomcat默认的是处理cookie的。每次请求过来的时候,都会解析request head里面的cookie信息,试图从中发现sessionid的信息。
    如果我们只想使用url来支持session,可以直接将tomcat的cookie功能关闭。
    我们可以修改conf中的context.xml文件,加入一个cookies="false"即可,内容如下:
<!-- The contents of this file will be loaded for each web application -->
<Context cookies = "false">
... ...
... ...
</Context>

重启tomcat后,就算客户端支持cookie,tomcat也不会考虑HTTP请求头的cookie字段。

posted on 2017-07-27 10:38  cag2050  阅读(167)  评论(0编辑  收藏  举报

导航