二、会话 session
Session是基于Cookie来跟踪的,即:没有Cookies的支持,Session是不能运行起来的。
Session对象用来解决客户端发送多个请求时来用户请求信息的存储问题,但是他和ServletRequest对象是不同的,他会在有需要时创建,
但是他的生命周期会比请求对象要长。Session对象的生命周期也是有限制的,如果长时间的没有访问,就会销毁掉Session对象,可以通
过Session对象的
setAttribute(String name, Object o) 和getAttribute(String name)来存取数据信息。Session是用户级的对象。
Session是存在于服务器内存中的,用于存用户多个请求的信息的;同时也要求客户端发送个Session的标志:SessionID (地址栏或封装在
请求的Header中)。
getSession(true)就表示如果Session不存在就创建一个新的Session,并把Session的标识SessionID写到Cookie中,如果存在就是用这个
Session。getSession(false)就是在Session不存在时不会创建新Session而是返回null。如果使用getSession()方法,就等同于getSession(true)。
注意:ServletRequest对象适用于传输大量的数据,因为其生命周期比较短,可以有效的节省内存资源。
大数据量的传输或保存不适合使用Session空间。
用户身份认证
登录时,创建session
访问资源页面时,先判断session是否存在
退出时清除session:session. invalidate(),接着可以将用户引导到登录页面
IE中一个窗口代表一个会话,Mozilla firefox不一样
多个窗口可通过Cookies来识别Seesion。
Sssion第二种跟踪机制:URLRewriting
Response.sendRediret(Response.encodeRedirectURL(/serv-app/student/ctrl“))
把在地址栏后加上SessionID地址地址参数
out.println(”<a href=”+response.encodeURL(url)”
<form actioin=”response.encodeURL(url)”>
Forward也是encodeURL
特殊一个:Response.sendRedirect(response.encodeRedirectURL(url));
每一个URL都要加上sessionID,但它不能跨越静态页面。
所以一般默认针对Cookies可用编写程序。
1、session.invalidate() --- session被立即销毁
session.setMaxInactiveInterval(int interval) --- 设置最大的超时时间,以秒为单位
2、会话的空间不是系统自动创建的,是程序创建的
request.getSession(false); 判断请求中是否存在session,以确保服务中资源的保护
三、重定向
产生新的请求,其中不包含原请求的session信息,只包含cookie信息
四、Session跟踪机制
1、cookie机制
2、URL回写机制:把sessionid绑定在地址栏中
response.sendRedirect(response.encodeRedirectURL(url));
五、Servlet过滤器(Filter)
应用:Sessioin logging encoding
过滤器是用于过滤Servlet的请求和响应,过滤器是存在于请求和被请求资源之间的。
过滤器就像当于一个中间件,请求要经过过滤器,然后过滤器才去掉用Servlet,Servlet的响应也会被过滤器截获并作相应的处理。
Filter是一个接口,要写一个自己的Filter就只能实现Filter接口。
Filter也有自己的生命周期,他的生命周期和Servlet比较相似,也是会先调用init()方法,然后再调用核心的处理过滤的方法doFilter(),这个方法中可定义了过滤规则,然后是destory()方法销毁Filter对象。
dofilter(ServletRequest request,ServletResponse response,FilterChain chain)
这个是过滤的核心方法,FilterChain的方法doFilter(ServletRequest request, ServletResponse response)也就是用过滤后的请求调用资源的方法,如果不写这个方法,也就算不会去调用相应的资源。
Filter的配置
Filter的配置和Servlet相似。
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>alan.filter.SessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/protected/*</url-pattern>
<!--这里的url-pattern就是要过滤的Servlet的url-pattern-->
<dispatcher>request</dispatcher>
<dispatcher>forward</dispatcher>
<dispatcher>include</dispatcher>
<!--上面的三个是过滤的范围-->
</filter-mapping>
CharArrayWriter类,是一个将数据保存在字符数组中的输出流,我们可以使用它来构造一个PrintWriter对象,也就实现了向内存输出。
CharArrayWriter类的toString()和toCharArray()方法就可以取得写入内存中的数据。
注意:CharArrayWriter类是一个不会真正输出的类,他的write()方法只会将内容写入字符数组,而且这个字符数组是会自动增长的。
六、Servlet的url-pattern
url-pattern可以使用以下三种方式
1,确切路径匹配,也就是给出确定的路径 xxx/xxxx
2,模糊路径匹配,也就是指给出一部分路径,xxxx/*,他会匹配确定路径,也就是xxxx/a 或者是xxxx/b都是可以匹配的
3,扩展名匹配,也就是会匹配扩展名,只要是扩展名相同就匹配,xxx.xxx *.xx
注意:扩展名匹配和确切路径匹配不能放在一起使用,也就是不能写成 xxxx/xxxx/xxx.xx,但是可以用
*.xxx。
ServletRequest对象的三个返回路径的方法
getContextPath()获得应用的路径,用动态获取应用路径
getServletPath()获得Servlet路径,也就是form中的action,如果使用确切路径那么就会是这个Servlet配置的url-pattern。
getPathInfo()使用模糊路径匹配时会返回匹配模糊部分。
注意:在html的form表单的action中,如果使用了扩展名匹配,一定要写明/xxxxx/xxx.xx,不要写成/xxxx/*.xx,在form的action中要尽量使用绝对路径,也就是要用 应用名/xxx.xx或者应用名/xxx。
SingleThreadModel接口
1) 如果希望禁止多线程访问,可以让Servlet使用SingleThreadModel接口:
public class YourServlet extends HttpServlet implements SingleThreadModel{ ... }
2) 使用此接口,系统将保证不会存在多个请求线程同时访问Servlet的单个实例。但是仍然需要同步对存储在Servlet外部的类变量或共享字段的访问。
3) 如Servlet频繁被访问,则Servlet访问的同步将严重影响性能(延时)。
ServletRequest对象的生命周期就是在service()方法中,除了forward(...,...)方法将这个请求对象转发给其他的Servlet。
分享到:
相关推荐
它是Java Servlet和JavaServer Pages (JSP)技术的基础,提供了服务器端程序与Web客户端交互的能力。在这个压缩包中,包含的是对Servlet API的中文文档,可能是作者因为无法找到官方的源码和javadoc而自行整理的笔记...
AJAX 的应用使请求的出现变得频繁,而 Comet 则会长时间占用一个连接,上述的服务器模型在新的应用背景下会变得非常低效,线程池里有限的线程数甚至可能会阻塞新的连接。Jetty 6 Web 服务器针对 AJAX、Comet 应用的...
2_servlet4.zip
4. **Servlet实例**:Servlet容器根据需要创建Servlet的实例。每个请求可能由同一个Servlet实例处理,也可能由不同的实例处理,这取决于容器的线程模型。 5. **请求/响应对象**(HttpServletRequest/...
本篇文章将围绕jakarta-servletapi-4-src.zip这个源码包,深入剖析Servlet API 4.0的关键特性与实现原理。 一、Servlet接口与生命周期 Servlet接口是所有Servlet的基础,它定义了Servlet的主要方法,如`init()`, `...
在本资源中,“韩顺平servlet 第4、5讲 事例代码”是一个关于Servlet技术的实战教学内容,由知名讲师韩顺平提供。Servlet是Java Web开发中的一个重要组件,用于扩展服务器的功能,处理HTTP请求。以下是这些课程中...
4. **如何引入javax.servlet.jar** - 在传统的Java Web项目中,通常将`javax.servlet.jar`和`javax.servlet.jsp.jar`添加到项目的类路径中,这可以通过在`WEB-INF/lib`目录下放置这两个jar包实现。 - 使用Maven或...
4. **HttpServletRequest** 和 **HttpServletResponse**:这两个接口分别代表了HTTP请求和响应对象,它们提供了处理HTTP请求头、获取请求参数、设置响应状态码和输出数据的方法。 5. **Servlet生命周期**:包括加载...
Servlet API还提供了Filter的概念,允许开发者在请求到达Servlet之前和响应离开Servlet之后对其进行拦截和处理。`javax.servlet.Filter`接口定义了`doFilter()`方法,这使得我们可以实现如认证、日志记录、数据过滤...
Servlet的生命周期包括加载、初始化、服务、销毁四个阶段。在Web应用启动时,Servlet容器(如Tomcat)会根据配置加载Servlet,并调用`init()`进行初始化。当收到请求时,容器会调用`service()`,根据请求类型分发到...
实验四的目的是让学生深入理解JavaBean和Servlet的开发流程,这二者是Java Web开发中的重要组成部分。JavaBean是一种符合特定规范的Java类,通常用于封装业务逻辑和数据,而Servlet则是在服务器端运行的Java程序,...
赠送jar包:guice-servlet-4.0.jar; 赠送原API文档:guice-servlet-4.0-javadoc.jar; 赠送源代码:guice-servlet-4.0-sources.jar; 赠送Maven依赖信息文件:guice-servlet-4.0.pom; 包含翻译后的API文档:guice-...
4. **Servlet生命周期**:Servlet的生命周期包括加载和初始化、服务、销毁三个阶段。Servlet容器(如Tomcat)会在第一次请求时加载Servlet并调用init()方法,之后每次请求都会调用service()方法,最后在容器关闭或...
赠送jar包:guice-servlet-4.0.jar; 赠送原API文档:guice-servlet-4.0-javadoc.jar; 赠送源代码:guice-servlet-4.0-sources.jar; 赠送Maven依赖信息文件:guice-servlet-4.0.pom; 包含翻译后的API文档:guice-...
4. **销毁**:当Servlet容器决定卸载Servlet时,会调用destroy()方法来释放Servlet所占用的资源。 #### 三、Servlet生命周期 Servlet的生命周期主要包括三个阶段:初始化、服务和销毁。 - **初始化**:通过调用...
javax/servlet/resources/j2ee_1_4.xsd javax/servlet/resources/j2ee_web_services_client_1_1.xsd javax/servlet/resources/j2ee_web_services_1_1.xsd javax/servlet/resources/XMLSchema.dtd javax/servlet/...
4. `javax.servlet.ServletContext`:表示一个Web应用程序的上下文,提供对全局资源的访问,如静态资源、其他Servlet等。 5. `javax.servlet.http.HttpServletRequest`和`javax.servlet.http.HttpServletResponse`:...
4. **Servlet配置**: Servlet通常在`web.xml`部署描述符文件中配置,包括Servlet的映射路径、初始化参数等。例如: ```xml <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>...