大家都知道,在开发一个互联网应用的时候,为了达到一种服务端和客户端有状态的效果,需要有一个sessionid 来对客户端进行标志。很多时候,这是通过在客户端防止session cookie实现的。但是如果客户端禁用了cookie呢?这就需要通过urlrewrite或者其他方式来实现。于是我们可能就在应用里面不需要cookie了。既然不需要了当然是希望我们的应用不对cookie进行处理。很遗憾的是,tomcat默认的是处理cookie的。每次请求过来的时候,都会解析request head里面的cookie信息,试图从中发现sessionid的信息。于是我们就需要从应用服务器层面把这个"无用功"去掉。
tomcat(我读的是tomcat6的源码)可以通过设置来实现:
在conf/context.xml里面:<Context cookies = "false">。那么就禁用了cookie了。
在源码级别的实现则是在CoyoteAdapter里面:
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里面有这么一句:
if (request instanceof HttpServletRequest && needsSession)
this.session = ((HttpServletRequest) request).getSession();
这句的意思就是,有session获取session,没session新建一个。而通常,这个地方也是客户端与tomcat下面的应用交互时产生session的入口。
这句里面的needsSession就是之前提到的jsp页面上配置的值,默认是true.所以如果想在访问某个页面时不产生session,只需要设置成false就可以了。
分享到:
相关推荐
【标题】:“Tomcat Redis Session”指的是在Tomcat集群环境中,通过Redis来实现Session的共享与同步,以解决集群中的Session一致性问题。 【描述】:“Tomcat集群Nginx使用Redis保证Session同步”这一场景中,通常...
tomcat+httpservlet+session+cookie+jsp+filter
如果在Cookie中设置了"HttpOnly"属性,那么通过程序(JS脚本、Applet等)将无法读取到Cookie信息,这样能有效的防止XSS攻击。 对于以上两个属性, 首先,secure属性是防止信息在传递的过程中被监听捕获后信息泄漏,...
标题中的“Tomcat8亲测可用 tomcat-redis-session-manager的jar包”指的是一个专为Tomcat8设计的,用于管理session的扩展组件。这个组件实现了将Tomcat应用服务器中的用户session数据存储到Redis分布式缓存系统中,...
在IT行业中,尤其是在Web服务器领域,Tomcat是一个广泛使用的开源应用服务器,特别是对于Java Servlet和JavaServer Pages(JSP)的应用。在这个场景中,我们关注的是如何在Tomcat集群环境中实现Session共享,以便...
服务器在响应中设置Cookie,然后浏览器会在后续请求中携带这些Cookie回发给服务器。Cookie主要用途包括会话管理、个性化设置、跟踪用户行为等。每个Cookie通常包含键值对、过期时间、路径和域等信息。Cookie的最大...
- **解决方案**: 将SessionID信息在启动Applet时传递进去,并在发送URLConnection请求时重新设置SessionCookie信息。 - **现象2**: 在HTTPS环境下,不允许jsp页面使用URLConnection访问servlet。 - **解决方案**:...
1. **Cookie-Based**:将`session ID`存储在cookie中,每次请求时由客户端携带。这种方式简单但安全性较低,因为`session ID`可能被窃取。 2. ** Sticky Session**:`Nginx`配置中启用`sticky`,使用户请求始终定向...
Session是服务器端存储用户状态的一种方式,当用户在Web应用中登录后,服务器会为该用户创建一个唯一的Session ID,存储在客户端的Cookie中,每次请求时通过这个ID来识别用户状态。 在分布式环境中,不同的请求可能...
总结来说,Servlet是Web应用的基石,它结合HttpServletRequest和HttpServletResponse处理请求和响应,通过Cookie和Session管理会话,与JSP协同工作呈现动态内容。而Filter、文件上传和下载等特性则扩展了Servlet的...
在IT行业中,尤其是在Web应用程序开发领域,Tomcat8是一个广泛使用的开源Servlet容器,它遵循Java Servlet和JavaServer Pages(JSP)规范。Session共享是Web应用中的关键问题,特别是对于那些需要跨多个服务器或者...
【JSP简易购物车 源码 session储存对象】是一个基于Java Server Pages(JSP)技术的简单购物车实现,它展示了如何利用session对象在Web应用程序中存储用户购物车的数据。这个项目对于初学者理解JSP和session的概念,...
在IT行业中,Tomcat是一个广泛使用的Java应用服务器,特别是对于运行Servlet和JSP应用程序。Session共享是Web应用程序中一个关键的概念,它允许用户在不同页面间保持状态,这对于购物车、用户登录等应用场景至关重要...
在【标签】"jsp+tomcat开发的小论坛"中,我们可以推断出项目的重点在于JSP和Tomcat的整合应用。这包括但不限于如何配置Tomcat服务器以运行JSP页面,如何使用JSP动作元素(如<jsp:include>,<jsp:forward>等)和脚本...
每个Web应用程序在默认情况下都有自己的独立session空间,这意味着在一个项目中设置的session属性不会自动传递到其他项目。 要实现Tomcat上的session共享,我们可以采取以下几种方法: 1. **共享Cookie**:这是最...
Session有一个默认的超时时间,通常在服务器配置中设置,例如在Tomcat的`web.xml`中: ```xml <session-config> <session-timeout>30</session-timeout> </session-config> ``` 这表示Session将在30分钟后...
在Tomcat与Nginx结合的环境中,由于请求可能被Nginx分发到不同的Tomcat实例,所以需要一种机制来确保无论请求落在哪个实例上,都能访问到相同的session信息。 **知识点详解:** 1. **Tomcat**:Tomcat是一个开源的...
在多台Tomcat服务器中,session数据的共享是通过将session信息存储在外部存储系统(如redis)来实现的,而不是传统的基于cookie或者内存中的管理方式。 然后,`redis`是一个开源的、基于键值对的数据存储系统,常被...
在这个场景下,"复制/粘住session"策略是关键,它确保用户在与服务器交互时,其session数据能够在不同的Tomcat实例间正确同步或保持在特定实例上。 一、session复制 Session复制是指将一个用户的session数据在集群...