Servlet_会话跟踪_过滤器

来源:互联网 发布:linux 进程退出日志 编辑:程序博客网 时间:2024/05/20 05:07

Servlet

Servlet 是一个用Java 编写的程序,此程序在服务器上运行以处理客户端请求.Servlet不是从命令行启动的,而是由包含Java虚拟机的Web服务器进行加载.Servlet技术是java动态web技术的基础,是与平台无关的服务器端构件.

Servlet体系结构
Servlet是创建Web应用程序的基本块。Servlet提供了一种通用的程序设计模块。
Servlet API是java API的扩展,包含两个包:javax.servlet和javax.servlet.http包。其中javax.servlet包有两个子包用于JSP
页面(javax.servlet.jsp)和JSP定制标记(javax.servlet.jsp.tagext)。
这两个包中,javax.servlet包中定义的类和接口是独立于协议的;而javax.servlet.http中包含了具体于HTTP协议的类和接口,某
些类或接口继承了javax.servlet包中的类或接口。
Servlet接口类是Servlet API的抽象,定义了servlet必须实现的方法。
Servlet 的生命周期就是指创建Servlet 实例之后其存在的时间以及何时消失.

Servlet与Applet的比较:
相似之处:
它们不是独立的应用程序,没有main()方法。
它们不是由用户调用,而是由另外一个应用程序(容器)调用。
它们都有一个生存周期,包含init()和destroy()方法。
不同之处:
Applet运行在客户端,具有丰富的图形界面。
Servlet运行在服务器端,没有图形界面。

init()方法只在Servlet第一次被请求加载的时候被调用一次,当有客户再请求Servlet服务时,Web服务器将启动一个新的线程,在该线程中,调用service方法响应客户的请求。必须注意线程的同步问题.

处理客户端输入doPut事件doDelete事件
doPut事件的作用接受上传的文件。
语法:
public void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException
doDelete事件的作用是删除服务器的文件。
语法:
public void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException
注意:doPut事件不可以通过form表单激活,因为form表单只能处理get和post方法,doPut事件需要由java代码激活。

初次运行或修改JSP文件后JSP引擎会自动编译,生成字节代码文件,常驻内存。以后再次刷新页面后反应很快。JSP本质上是servlet 。

Servlet 使用户可以在服务器上运行 Java 代码和生成动态内容
HTTP Servlet 发送 HTTP 请求和接受 HTTP 响应
Servlet 生命周期由三种方法组成,即 init()、service() 和 destroy()
Servlet API 包含于两个包中,分别为 javax.servlet 和 javax.servlet.http
Servlet 继承 GenericServlet 类或 HttpServlet 类。

 

 

 

会话跟踪

服务器将唯一的会话ID分配给客户端以跟踪用户.
HttpServletRequest 的 getSession() 方法用于创建会话,其语法如下:
public HttpSession getSession();
public HttpSession getSession(boolean value);
如果没有与当前请求关联的会话,则 getSession() 方法用于创建会话。如果布尔值为 true 且当前没有与请求关联的会话,则使用 getSession(boolean value) 创建会话。如果布尔值为 false,如果没有与当前请求关联的会话,返回null。

以下是各种会话跟踪技术:
用户授权:会话跟踪的用户授权方法在用户登录之后跟踪用户,用户授权技术不允许未经授权的用户访问网站上的某些资源.
隐藏表单域:将会话跟踪字段的隐藏表单域添加到HTML页面,但是不会显示在客户端浏览器中.
<form action = “//firsthtml.jsp” method=”POST”>
<input type = “hidden” name=“productid” value=“123”>
</form>

URL重写:URL(统一资源定位) 重写技术将一个唯一的会话ID添加到URL结尾,以标识该会话。例如,重写以下URL传递会话ID10
原始 URL:
http://server:post/servlet/Rewritten
用附加信息重写的 URL:
http://server:post/servlet/Rewritten/10
用添加的参数重写的 URL:
http://server:post/servlet/Rewritten?sessionid=10
用自定义修改重写的 URL:
http://server:post/servlet/Rewritten;$sessionid$10

Cookie:Cookie 用于存储 Web 服务器发送给客户端的信息。服务器通过设置响应标题中的 Set-Cookie 方法来发送 cookie。
javax.servlet.http.cookies 包提供由 Cookie 类实现的多种方法


过滤器
过滤器是向Web应用程序的请求和响应处理添加功能的Web服务组件.不是servlet,不创建请求,在请求到达servlet前预处理(截获 检查 修改),或响应离开servlet后的后处理(截获 修改)程序。
<filter-mapping>
    <filter-name> MyFilter </filter-name>
    <url-pattern> /servletname/* </url-   
    pattern>
</filter-mapping>
FilterChain 接口用于调用过滤器链中的一系列过滤器
在初始化过程中,容器使用FilterConfig将信息传递给过滤器
过滤器是 Web 服务组件
过滤器可以访问客户端输入的请求和 Web 资源输出的响应
过滤器定义用于将过滤器名称与特定的类关联在一起
过滤器映射用于将过滤器映射至 Web 资源
Filter 接口包含各种方法,如 init()、doFilter() 和 destroy()
每次用户发送请求或 Web 资源发送响应时都会调用 doFilter() 方法
FilterChain 接口用于调用过滤器链中的下一个过滤器
在初始化过程中,Servlet 使用 FilterConfig 将信息传递给过滤器

监听器
监听客户端请求,服务器端操作。激发操作获取统计信息和操作。
实现java.servlet.http.httpsessionlistener接口
实例:统计在线人数
在web.xml中配置监听器

<listener>
<listener-class>
   samples.servlet.OnlineCounterListener
</listener-class>
</listener>
package samples.servlet;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import samples.javabean.Counter;

public class OnlineCounterListener implements HttpSessionListener {
//创建session时响应
public void sessionCreated(HttpSessionEvent hse) {
   Counter.raise();   //增加在线人数
}
//销毁session时响应
public void sessionDestroyed(HttpSessionEvent hse) {
   Counter.reduce();   //减少在线人数
}
}
package samples.javabean;
public class Counter {

private static int count = 0;     //静态变量存储在线人数
    public static int getOnline(){ //获得在线人数
       return count;
     }
     public static void raise(){   //递增在线人数
     count++;
     }
     public static void reduce(){ //递减在线人数
     count--;
    }
}
测试:ex8_2.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
<title>使用Listener</title>
</head>
<body ><font size=2>
在线人数:
<%=Counter.getOnline()%>
<br>
退出会话:
<form name="form1" action="exit.jsp" method=post>
<input type=submit value="exit">
</form>
</font></body></html>

原创粉丝点击