session
介绍
jsp利用servlet提供的HttpSession接口识别一个用户,存储这个用户的所有访问信息。默认情况下,jsp允许会话跟踪,一个新的HttpSession对象将会自动地为新的客户端实例化。禁止会话跟踪需要关掉它,通过将page指令中session属性值设为false来实现。
<%@ page session="false" %>
 
下表列出了session对象的一些重要方法:
| 方法 | 功能实现 | 
|---|---|
| Object getAttribute(String name) | 返回session对象中于指定名称绑定的对象,如果不存在则返回null | 
| Enumeration getAttributeNames() | 返回session对象中所有的对象名称 | 
| Long getCreationTime() | 返回session对象被创建的时间,以毫秒为单位,从1970年1月1号凌晨开始算起 | 
| String getId() | 返回session对象的ID | 
| Long getLastAccessedTime() | 返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起 | 
| int getMaxInactiveInterval() | 返回最大时间间隔,以秒为单位。servel容器将会在这段时间内保持会话打开 | 
| void invalidate() | 将session无效化,解绑任何与该session绑定的对象 | 
| boolean isNew() | 返回是否为一个新的客户端,或者客户端是否拒绝加入session | 
| void removeAttribute(String name) | 移除session中指定名称的对象 | 
| void setAttribute(String name, Object value) | 使用指定的名称和值来产生一个对象并绑定到session中 | 
| void setMaxInactiveInterval(int interval) | 用来指定时间,以秒为单位,servelt容器将会在这段时间内保持会话有效 | 
配置web.xml文件
 <session-config>
     #定时
    <session-timeout>15</session-timeout>
 </session-config>
 
Servlet
介绍
Java Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自web浏览器获其他HTTP客户端的请求和Http服务器上的数据库或应用程序之间的中间层。
优势
- 性能明显更好
 - servlet在web服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求
 - Servlet是独立于平台的,因为他们是Java编写的
 - 服务器上的Java安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet是可信的
 - Java类库的全部功能对Servlet来说都是可用的。它可以通过sockets和RMI机制与applets、数据库或其他软件进行交互。
 
任务
servlet主要执行一下主要任务:
- 读取客户端(浏览器)发送的显式的数据。包括网页上的Html表单,或者也可以是来自applet或自定义的http客户端程序的表单
 - 读取客户端(浏览器)发送的隐式的http请求数据。包括cookies、媒体类型和浏览器能理解的压缩格式等等
 - 处理数据并生成结果。这个过程可能需要访问数据库,执行RMI或CORBA调用,调用Web服务,或者直接计算得出对应的响应
 - 发送显示的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(Html或Xml、二进制文件(gif)、Excel等
 - 发送隐式的http响应到客户端(浏览器)。包括告诉浏览器或其他客户端被返回的文档类型,设置cookies和缓存参数,以及其他类似的任务。
 
部分读取HTTP头的方法
| 方法名称 | 功能描述 | 
|---|---|
| Cookie[] getCookies() | 返回一个数组,包含客户端发送该请求的所有的Cookie对象 | 
| Enumeration getAttributeNames() | 返回一个枚举,包含提供给该请求可用的属性名称 | 
| Enumeration getParameterNames() | 返回一个String对象的枚举,包含在该请求种包含参数的名称 | 
| HttpSession getSession() | 返回与该请求关联的当前session会话,或者如果请求没有session会话,则创建一个 | 
| Object getAttribute(String name) | 以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回null | 
| String getMethod() | 返回请求的http方法的名称,如:get、post、put | 
| String getRequestURI() | 从协议名称直到http请求的第一行的查询字符串中,返回该请求的url的一部分 | 
| String getRequestedSessionId() | 返回有客户端指定的session会话ID | 
| String getParameter(String name) | 以字符串形式返回请求参数的值,或者如果参数不存在则返回null | 
Filter
基本工作原理
- Filter程序是一个实现了特殊接口的Java类,与servelt类似。也是由Servlet容器进行调用和执行的。
 - 当在web.xml注册了一个Filter来对某个Servlet程序进行拦截处理时,它可以决定是否将请求继续传递给Servlet程序,以及对请求和响应消息是否进行修改。
 - 当Servlet容器开始调用某个Servlet程序时,如果发现已经注册了一个Filter程序来对该Servlet进行拦截,那么容器不再直接调用Servlet的service方法,而是调用Filter的doFilter方法,再由doFilter方法决定是否去激活service方法
 - 但在Filter.doFilter方法中不能直接调用Servlet的service方法,而是调用FilterChain.doFilter方法来激活目标Servlet的service方法,FilterChain对象是通过Filter.doFilter方法的参数传递进来的。
 - 只要在Filter.doFilter方法中调用FilterChain.doFilter方法的语句前后增加某些程序代码,这样就可以在Servlet进行响应前后实现某些特殊功能。
 - 如果在Filter.doFilter方法中没有调用FilterChain.doFilter方法,则目标Servlet的service方法不会被执行,这样通过Filter就可以阻止非法的访问请求。
 
doFilter方法
当一个Filter对象能够拦截访问请求时,Servlet容器将调用Filter对象的doFilter方法
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException.ServletException
 
其中,参数request和response为web容器或Filter链中上一个Filter传递过来的请求和响应对象;参数chain为代表当前Filter链的对象。
Filter的注册与映射
1、注册Filter
一个<filter>元素用于注册一个Filter。其中,<filter-name>元素是必需的,<filter-class>元素也是必需的,<init-param>元素是可选的,可以有多个<init-param>元素。
<filter>
    <filter-name>FirstFilter</filter-name>
    <filter-class>FirstFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>GB2312</param-value>
    </init-param>
</filter>
 
2、映射Filter
<filter-mapping>元素用于设置一个Filter所负责拦截的资源。一个Filter拦截的资源可以通过两种方式来指定:资源的访问路径和Servlet名称。
第一种:指定资源的访问路径
<filter-mapping>
    <filter-name>FirstFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
 
<url-pattern>元素中的访问路径的设置方式遵循Servlet的url映射规范
- /*:表示拦截所有的访问请求
 - /filter/*:表示拦截filter目录下的所有访问请求,如:http://localhost:8888/testFilter_001/filter/xxxxxx .
 - /test.html:表示拦截根目录下以test.html为资源名的访问请求,访问链接只会是:http://localhost:8888/test.html。
 
第二种:指定Servlet的名称
<filter-mapping>
    <filter-name>FirstFilter</filter-name>
    <servlet-name>default></servlet-name>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>REQUEST</dispatcher>
</filter-mapping>
 
- <servlet-name>元素与<url-pattern>元素是二选一的关系,其值是某一个Servlet在web.xml文件中的注册名称
 - <dispatcher>元素的设置值有4种:REQUEST、INCLUDE、FORWARD、ERROR,分别对应servlet容器调用的4种方式: 
  
- 通过正常的访问请求调用
 - 通过RequestDispatcher.include方法调用
 - 通过RequestDispatcher.forward方法调用
 - 作为错误响应资源调用
 
 
如果没有设置<dispatcher>子元素,则等效于REQUEST的情况。也可以设置多个<dispatcher>子元素,用于指定Filter对资源的多种调用方式都进行拦截。




















