Tomcat从零开始(十五)session管理的代码
第十五节简介我之前好像很长时间没有把完整的代码贴上了,其实我觉得前14节都是一些基础性的东西。我们先来回忆一下,之前学了什么。 刚开始主要是想让大家先把tomcat理解成一个Connector 和 container的合体。之后我们知道connector是为了建立连接的,我们讲了tomcat4的默认连接器,虽然现在被替代了。Container是用来处理请求的,说了Container的四种类型。以及其中的pipeline, vavle。其实我觉得这些 不需要我做什么 代码来示范,而是 应该自己去读读tomcat的代码。所以,这节课 我不再写那么长的代码了,我们用tomcat已经写好的jar包。那么开始Bootstrap
package com.vic.core;import java.io.IOException;import javax.servlet.Servlet;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.catalina.Contained;import org.apache.catalina.Container;import org.apache.catalina.Context;import org.apache.catalina.Request;import org.apache.catalina.Response;import org.apache.catalina.Valve;import org.apache.catalina.ValveContext;public class SimpleWrapperValve implements Valve, Contained {protected Container container;public void invoke(Request request, Response response,ValveContext valveContext) throws IOException, ServletException {SimpleWrapper wrapper = (SimpleWrapper) getContainer();ServletRequest sreq = request.getRequest();ServletResponse sres = response.getResponse();Servlet servlet = null;HttpServletRequest hreq = null;if (sreq instanceof HttpServletRequest)hreq = (HttpServletRequest) sreq;HttpServletResponse hres = null;if (sres instanceof HttpServletResponse)hres = (HttpServletResponse) sres; Context context = (Context) wrapper.getParent(); request.setContext(context); try {servlet = wrapper.allocate();if (hres != null && hreq != null) {servlet.service(hreq, hres);} else {servlet.service(sreq, sres);}} catch (ServletException e) {}}public String getInfo() {return null;}public Container getContainer() {return container;}public void setContainer(Container container) {this.container = container;}}这个类是重点,我们能看到第38/39行,为什么要设置这个req的context,因为当我们从req想要得到一个session,我们会调用它的getSession的动作,但是getSession肯定是先去拿context,再拿context的manager,之后manager . 就完事了。 所以,我们要设置req的context,所以就在servlet生存的wrapper中设置。