会话跟踪技术
主要内容
- Cookie技术
- session技术
- URL重写技术
- 隐藏表单域技术
前情提要
? ? ? ?客户端与服务器进行通信的协议是HTTP协议,该协议本身是基于请求/响应模式的、无状态的协议,服务器不会记录客户端的任何信息,这样客户端每次发送的请求都是独立的,这样的方式在工程实践中是不可用的。而会话(session)正式一种能将客户端信息保存在服务器端的技术,它可以记录客户端到服务器的一系列请求。
? ? ? 会话跟踪技术作为在客户端与服务器之间保持HTTP状态的解决方案,主要包括Cookie技术、session技术、URL重写技术以及隐藏表单域技术。
Cookie技术
在客户端保持会话跟踪
? ? ? ?Cookie技术是一种在客户端保持会话跟踪的解决方案。通过Cookie,服务器在接收来自客户端浏览器的请求时,能够通过分析请求头的内容得到客户端特有的信息,从而动态生成与该客户端相对于的内容。例如,在登录页面中记住密码。另外一些商业网站根据用户的偏好,进行风格设置、广告投放等个性化推荐功能,这些功能都可以通过存储在客户端的Cookie实现。
? ? ? Cookie可以通过java.servlet.http.Cookie类的构造方法Cookie(String name,String value)创建,示例代码入下:
Cookie vistedCountC = new Cookie("vistedCount","1000");
其中第1个参数name用于指定Cookie的属性名;第2个参数的value用于指定属性值。
? ? ? ?创建完成的Cookie可以使用HttpServletResponse对象的addCookie()方法添加到响应对象中,进而让Cookie对象存储在客户端机器上。存储在客户端的Cookie可以通过HttpServletRequest对象的getCookies()方法获取。
? ? ? ?Cookie有一定的存货时间,不会在客户端一直保存。默认情况下,在浏览器关闭时失效。若要让其长时间保存,可以通过Cookie对象的setMaxAge(int time)方法设置其存活时间(以秒为单位)若为正整数表示其存活的秒数;若为负数,表示其为临时Cookie(在浏览器关闭时失效);若为0,表示通知浏览器删除响应的Cookie对象。
【例1】编写一个Servlet,在该Servlet中测试Cookie对象se常用方法。
CookieTest.java
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpeDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.Http.HttpServletResponse;
@WebServlet("/CookieTest") //注解部署Servlet
public class CookieTest extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequset request,HttpServletResponse response) throws ServletException,IOException {
response.setContentType("text/html;charset=UTF-8");//设置响应方式
printWriter out = response.getWriter();
SimpleDateFormat sdf = new SimpeDateFormat("yyyy年MM月dd日HH:mm:ss");
String nowTime = sdf.format(new Date());
String lastVisTime = "";//访问时间
int vistedCount = 0;//访问次数
//获取客户端浏览器保存的所有Cookie
Cookie[] myCookies = request.getCookies();
if(myCookies != null){
for(Cookie cookie : myCookies){
if( "lastVist".equals(cookie.getName())) ){
lastVistTime = cookie.getValue();
}
if( "vistedCount".equals(cookie.getName())) ){
vistedCount = Integer.valueOf(cookie.getValue());
}
}
}
//不是第一此访问,输出上次访问时间
if(!"".equals(lastVistTime)){
out.println("您上次访问时间为:"+lastVistTime);
}
//输出访问次数
out.println("您是第:"+(vistedCount+1)+“次访问该网站。”);
//以本次访问时间创建同名Cookie
Cookie lastVistTimeC = new Cookie("lastVist",nowTime);
//设置最大存活时间为1年
lastVistTimeC.setMaxAge"(365*24*60*60);
//以访问次数创建同名Cookie
Cookie vistedCountC = new Cookie("vistedCount",(vistedCount + 1)+"");
//设置最大存活时间为1年
vistedCountC.setMaxAge"(365*24*60*60);
//将两个Cookie对象响应到客户端
response.addCookie(lastVistTimeC);
response.addCookie(vistedCountC);
}
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
doGet(request,response);
}
}
启动服务器,第1次请求CookieTest后(http://localhost:8080/ch7/CookieTest)的显示结果为:
您是第: 1次访问该网站。
第2次请求CookieTest后(http://localhost:8080/ch7/CookieTest)的显示结果为:
您上次访问时间为:2018年10月16日11:33:35 您是第2次访问该网站。
session技术
? ? ? ?session技术是指使用HttpSession对象实现会话跟踪技术,是一种在服务器端保持会话跟踪的解决方案。HttpSession对象将在用户第1次访问服务器时由容器创建(只有访问JSP、Servlet等程序时才会创建,只访问HTML、image等静态资源并不会创建),当用户调用其失效方法invalidate()或超过其最大不活动时间时会失效。在会话有效期间,用户与服务器之间的多次请求都属于同一个会话。
? ? ? ?服务器在创建session对象时,会为其分配一个唯一的会话标识sessionId,以JSESSIONID的属性名保存在客户端的Cookie中。在用户后续的请求中,服务器通过读取Cookie中的JSESSIONID属性值来识别不同的用户,从而实现对每个用户的会话跟踪。
URL重写技术
? ? ? URL重写是指服务器程序对接收的URL请求重新写成网站可以处理的另外一个URL的过程。URL重写技术是实现动态网站会话跟踪的重要保障。使用URL重写技术可以对请求的URL地址追加会话标识,从而实现用户的会话跟踪功能。
//对重定向的URL进行重写
String encodeURL = response.encodeRedirectURL("toRedirectServlet");
response.sendRedirect(encodeURL);
隐藏表单域技术??
? ? ?利用HTML的hidden属性,将客户端的信息,在用户不察觉的情形下,随着请求一起发送给服务器处理。例如:
<input type="hidden" name="userID" vlaue="15">
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!