tomcat中cookie的设置与jsp中session的设置
来源:百度文库 编辑:神马文学网 时间:2024/04/28 05:00:14
大家都知道,在开发一个互联网应用的时候,为了达到一种服务端和客户端有状态的效果,需要有一个sessionid 来对客户端进行标志。很多时候,这是通过在客户端防止session cookie实现的。但是如果客户端禁用了cookie呢?这就需要通过urlrewrite或者其他方式来实现。于是我们可能就在应用里面不需要cookie了。既然不需要了当然是希望我们的应用不对cookie进行处理。很遗憾的是,tomcat默认的是处理cookie的。每次请求过来的时候,都会解析request head里面的cookie信息,试图从中发现sessionid的信息。于是我们就需要从应用服务器层面把这个"无用功"去掉。
tomcat(我读的是tomcat6的源码)可以通过设置来实现:
在conf/context.xml里面:。那么就禁用了cookie了。
在源码级别的实现则是在CoyoteAdapter里面:
Java代码 ',1)">
protected void parseSessionCookiesId(org.apache.coyote.Request req, Request request) { // If session tracking via cookies has been disabled for the current // context, don't go looking for a session ID in a cookie as a cookie // from a parent context with a session ID may be present which would // overwrite the valid session ID encoded in the URL Context context = (Context) request.getMappingData().context; if (context != null && !context.getCookies()) return;
在这里面做了一个判断,如果context禁用了cookie,那么就不做解析。如果使用cookie,那么试着从cookie里面解析
sessionid,并且如果存在的话覆盖request里面已有的(从url里面解析出来的)或者还没有的sesssionid.
这个方法的入口是在CoyoteAdapter的service方法里面,这个方法沿着tomcat6的component 链传递处理request 和response,结构图如下:
service--------->EngineValue
|
HostValue
|
ContextValue
|
WrapperValue
这实际就是一个chain of resposibility模式,负责对request和response进行各自职责范围内的包装和处理。
最后的WrapperValue执行调用servlet处理请求的步骤。
好了,上面简单解释了cookie的处理,那么下面就是session了。
不管通过什么方式,通过cookie也好,通过urlrewrite也好,session在需要的时候是肯定要产生的.
但是如果我们不需要呢?比如恰好我们要展现给客户的首页就是jsp的,客户不需要登录就能浏览这个页面的内容。
那么这个时候对于客户的请求创建session就是没有必要的了。
一种常用的不创建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里面有这么一句:
Java代码 ',2)">
if (request instanceof HttpServletRequest && needsSession) this.session = ((HttpServletRequest) request).getSession();
这句的意思就是,有session获取session,没session新建一个。而通常,这个地方也是客户端与tomcat下面的应用交互时产生session的入口。
这句里面的needsSession就是之前提到的jsp页面上配置的值,默认是true.所以如果想在访问某个页面时不产生session,只需要设置成false就可以了。
tomcat(我读的是tomcat6的源码)可以通过设置来实现:
在conf/context.xml里面:
在源码级别的实现则是在CoyoteAdapter里面:
Java代码 ',1)">
protected void parseSessionCookiesId(org.apache.coyote.Request req, Request request) { // If session tracking via cookies has been disabled for the current // context, don't go looking for a session ID in a cookie as a cookie // from a parent context with a session ID may be present which would // overwrite the valid session ID encoded in the URL Context context = (Context) request.getMappingData().context; if (context != null && !context.getCookies()) return;
在这里面做了一个判断,如果context禁用了cookie,那么就不做解析。如果使用cookie,那么试着从cookie里面解析
sessionid,并且如果存在的话覆盖request里面已有的(从url里面解析出来的)或者还没有的sesssionid.
这个方法的入口是在CoyoteAdapter的service方法里面,这个方法沿着tomcat6的component 链传递处理request 和response,结构图如下:
service--------->EngineValue
|
HostValue
|
ContextValue
|
WrapperValue
这实际就是一个chain of resposibility模式,负责对request和response进行各自职责范围内的包装和处理。
最后的WrapperValue执行调用servlet处理请求的步骤。
好了,上面简单解释了cookie的处理,那么下面就是session了。
不管通过什么方式,通过cookie也好,通过urlrewrite也好,session在需要的时候是肯定要产生的.
但是如果我们不需要呢?比如恰好我们要展现给客户的首页就是jsp的,客户不需要登录就能浏览这个页面的内容。
那么这个时候对于客户的请求创建session就是没有必要的了。
一种常用的不创建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里面有这么一句:
Java代码 ',2)">
if (request instanceof HttpServletRequest && needsSession) this.session = ((HttpServletRequest) request).getSession();
这句的意思就是,有session获取session,没session新建一个。而通常,这个地方也是客户端与tomcat下面的应用交互时产生session的入口。
这句里面的needsSession就是之前提到的jsp页面上配置的值,默认是true.所以如果想在访问某个页面时不产生session,只需要设置成false就可以了。
tomcat中cookie的设置与jsp中session的设置
PHP中设置Session过期的方法 ? gry's blog
cookie与session的关系
Tomcat 的数据库连接池设置与应用
Tomcat 的数据库连接池设置与应用
Tomcat 的数据库连接池设置与应用
JSP中tomcat的SQL Server2000数据库连接池的配置
JSP中tomcat的SQL Server2000数据库连接池的配置
电脑中服务的设置
设置Session过期时间的问题
jsp的session详解
对Session和Cookie的区分与理解
session与cookie
如何设置Tomcat的JVM虚拟机内存大小
BIOS中E文對照表+BIOS的设置
设置笔记本中无线局域网的问题
对话框属性中设置的窗口风格
jsp的session详解 (下
jsp的session详解 (上)
jsp的session详解 (下)
JSP的环境引擎--Tomcat
配置eclpise+tomcat并实现jsp的编写与部署
配置Eclpise tomcat并实现JSP的编写与部署
配置Eclpise tomcat并实现JSP的编写与部署