基于Web应用的会话跟踪技术的分析与应用

2020-03-20 21:22徐岸兰全祥
赤峰学院学报·自然科学版 2020年2期

徐岸 兰全祥

摘要:在Web应用中会话跟踪技术被用于保持客户端访问服务器时连续的状态的常用技术.正是由于会话跟踪技术的出现使得Web应用开发变得更加便利,并且提高了网站性能.本文将围绕JavaWeb中的会话跟踪技术展开及其域对象分析与讨论,探讨了会话跟踪技术的背景、工作机制、相关应用以及对它们的比较.

关键词:会话跟踪技术;Cookie Session Web应用

中图分类号:TP393.09   文献标识码:A  文章编号:1673-260X(2020)02-0057-03

1 引言

传统的HTTP(HyperText Transfer Protocol)协议本身是无状态[1],即在Web应用中多个客户端访问服务器端时,服务器端并不能区分各个客服端状态信息.这种无状态的缺陷阻碍了Web应用的发展.

为了解决HTTP无状态的缺陷,Netscape公司推出了一项HTTP的状态管理机制:Cookie[1].服务器使用Cookie就能跟踪每个客户端的访问.但每次客户端访问都会传回这些Cookie,当Cookie数量很多时,这样无疑地增加了服务器的压力.Session的出现就解决了这个问题.Session技术是基于Cookie技术的服务器端数据存储技术.JSP(Java Server Pages)为了存储客户端信息,也提出了Request Scope和Context Scope等技术.正是利用它们不同的特性,简化了服务器端的程序设计、增加了Web应用开发的便利性,并且提高了网站性能.

在一个客户端中打开浏览器访问某个网站开始,直到关闭这个浏览器的整个过程,称为一次会话.会话技术就是记录一次会话中客户端的状态与数据的技术.在Web应用开发中通常使用Cookie、Session、Request Scope、Context Scope等会话技术来存储客户端信息.

2 技术分析

2.1 Cookie-

当客户端第一次访问服务器时,服务器将用户相关信息以Cookie的形式传输给客户端[2].客户端浏览器一旦接收了服务器发出的Cookie信息,就会将它存储在浏览器缓冲区,即将数据存储在客户端中,当浏览器后续访问该服务器时,都会在请求消息中将用户相关信息以Cookie的形式发送给服务器,从而使得服务器可以分辨是哪个客户端发送的请求(如图1所示).

在Tomcat服务器中真正意义上创建Cookie是在org.apache.catalina.connector.Response类,通过调用generateCookieString方法将Cookie对象构造成一个遵循Cookie语法规则的字符串,并将这个字符串添加到MimeHears中,从而构建HTTP响应头返回至客户端.在Servlet中提供了setPath(String path)、setMaxAge(int expiry)等方法來设置HTTP响应头Set-Cookie字段的属性项.其中setPath(String path)是设置Cookie被允许访问的路径,如果不设置携带路径,那么该Cookie信息会在访问产生该Cookie的Web资源所在的路径都携带cookie信息.在Servlet中使用javax.servlet.http.HttpServletRequest类中的getCookies()方法获得一个Cookie的对象数组;使用javax.servlet.http.HttpServletResponse类中的addCookie(Cookie cookie)方法向客户端发送Cookie

2.2 Session

Session技术是基于Cookie技术的服务器端数据存储技术,即Session需要借助于Cookie所存储的客户唯一性标识JSESSIONID,即从客户端传输一个NAME为JSESSIONID的Cookie给服务器,而这个JSESSIONID是客户端第一次访问服务器时所生成.在一次会话中客户端只要传回JSESSIONID给服务器,Tomact服务器就会选择与之对应的Session对象为其服务[5].(如图2所示)

当JSESSIONID传入Tomact服务器中时,Tomact服务器中会将传入的JSESSIONID解析为Session ID.当使用request.getSession()获得HttpSession对象时,服务器就是利用Session ID判断在Session容器中是否存在与之对应的HttpSession对象.如果有就返回该HttpSession对象;如果没有,服务器就会创建一个新的HttpSession对象,并将这个对象添加到org.apache.catalina.Manager类的Session容器中.其中Manager类的功能是负责管理所有Session的生命周期、服务器关闭时Session将被序列化到磁盘、Session过期回收等.

2.2 Request Scope

Request是在Servlet方法调用前由Tomact服务器创建,Tomact服务器接到请求后,首先会创建org.apache.coyote.Request对象,Tomact服务器经过对此对象解析后会交给用户线程去处理这个请求,同时会创建org.apache.connector.Request对象,这个对象将贯穿Servlet容器直至传给Servlet.正是由于这样的特性,Requese中存储的数据可以在一次请求链中多次获取,直至请求结束.

2.4 Context Scope

Context Scope的数据在Tomact服务器中是存放在ServletContext中,而在Servlet中获得的ServletContext对象实际是ApplicationContextFacade对象,ApplicationContextFacade和ServletContext使用的是门面设计模式,它们可以在Context容器中获取属于他们的数据,并且对数据起到封装作用.在服务器中ServletContext是在Tomact服务器启动时就会被服务器创建,直至服务器关闭或该Web应用被移除.ServletContext中的数据被所有客户端共享.

3 应用

3.1 通过Cookie保存用户信息

当用户在其所信任的客户端登录Web应用时,在服务器端对该用户的登录信息进行处理.那么该用户在后续访问该网站可直接以登录状态直接访问.实现的方法是将用户登录信息保存在Cookie中,并控制Cookie的有效期,下次访问网站时服务器验证Cookie中的用户信息即可.

但是Cookie是可以在浏览器明文查看的,Web应用中通常情况下,不会把密码等重要的用户信息保存到Cookie中.在上述条件下的实现方式:在服务器中将用户的账号通过MD5算法进行加密,将加密后的账号和用户账号一起保存到Cookie中(Java实现代码如下).用户在后续登录时验证账号的加密规则是否正确即可.

String autoLogin = request.getParameter("autoLogin");

if ("true".equals(autoLogin)) {

String account = request.getParameter("account");

String ssid = MD5Utils.MD5(account);

Cookie accountCookie = new Cookie("userID", account);

accountCookie.setMaxAge(30*60);

Cookie ssidCookie = new Cookie("ssid", ssid);

ssidCookie.setMaxAge(30*60);

response.addCookie(accountCookie);

response.addCookie(ssidCookie);

response.sendRedirect(request.getRequestURI() + "?" +System.currentTimeMillis());

}

3.2 利用Session防止表单重复提交

在Web应用中很多时候存在用户重复提交表单的情况,如由于用户操作不当多次提交表单;用户网速过慢,不断重复刷新提交表单;恶意用户通过相关程序恶意重复提交表单等.上述非常规操作都会导致表单的重复提交.表单的重复提交可能会造成服务器端的数据重复,增加服务器的压力,影响服务器的性能,甚至严重的话,可能会对服务器造成宕机的情况,因此Web应用中防止表单重复提交的技术显得尤为重要.

利用Session防止表单重复提交,需要在该表单中增加一个隐藏表单项.如下面JSP代码所示:

這个隐藏表单项的值token是在服务器返回表单页面时在服务器中生成并保存于Session中的唯一确定的标识.当用户提交表单时,需要在服务器中对客户端传入的subToken与当前Session中保存的subToken进行判断.如果subToken的值一致,则说明用户没有重复提交了表单;否则说明用户多次提交表单.工作过程如图3所示:

3.3 通过request实现信息提示和跳转

大部分Web应用会涉及用户登录,用户登录实现中会应用request相关方法.在用户成功登录后应用sendRedirect(String location)方法重定向到其他页面.而在用户登录失败后,可以用setAttribute()方法设置提示语,并请求转发到登录页面,对用户进行友好提示.不难发现一次请求在多次请求转发中request中的数据可多次使用.具体代码如下所示:

request.setCharacterEncoding("UTF-8");

String username = request.getParameter("username");

String password = request.getParameter("password");

User login = null;

try {

login = login(username,password);

} catch (SQLException e) {

e.printStackTrace();

}

if(login!=null){

response.sendRedirect(request.getContextPath());

}else{

request.setAttribute("loginInfo", "用户名或密码错误");

request.getRequestDispatcher("/login.jsp").forward(request, response);

}

3.4 实现页面访问量统计的实例

在一些特定的业务中需要统计Web站点上的一个特定页面的访问次数,要完成统计功能,可以使用ServletContext对象来保存访问的次数.通过调用setAttribute()方法可以设置ServletContext对象中的共享信息,而调用getAttribute()方法可获得ServletContext对象中的共享信息.通过以上两个方法可实现对访问次数的统计,但也应该考虑到线程安全的问题,所以需要使用synchronized关键字对ServletContext对象进行同步.具体代码实现如下:

ServletContext context = getServletContext();

Integer count = null;

synchronized(context)

{

count = (Integer) context.getAttribute("counter");

if (null == count) {

count = new Integer(1);

} else {

count = new Integer(count.intValue() + 1); }

context.setAttribute("counter", count);

4 技术对比

本文介绍了Cookie、Session、Request Scope、Context Scope,以上四个技术均是用来存储客户端信息的.但是其存储的位置却有差别,Cookie将信息存储在客户端的浏览器缓存之中,而其余的Session、Request Scope、Context Scope将客户端相关信息存储在服务器中.其中Session、Request Scope、Context Scope在Servlet中拥有相同的对数据操作的API(如图1所示).

由于其在服务器内部创建过程不同,导致四种技术的作用范围不同.其中ServletContext中的数据可以被所有用户共用;而Cookie、Request,、Session是完全隔离,不同用户数据之间互不影响(如图5所示).

正是由于这些技术差异,使得Web应用开发显得生机勃勃,使得许多Web应用的实现变得更加方便.

5 总结

会话跟踪技术的出现是为了便于服务器端区分各个客户端状态,并保持用户访问的连续的状态.正是由于会话跟踪技术以及JavaWeb中域对象的出现,简化了服务器端的程序设计,使得许多Web应用中的业务实现变得更加方便.但是也带来了一些挑战,例如用户信息安全问题、多端Session的统一问题、分布式Session的同步、跨域问题等[6].這些问题需要开发人员在实际开发中进一步的完善和攻克.

参考文献:

〔1〕李馥娟.基于Cookies的Web应用分析及其安全研究[J].网络安全技术与应用,2009(08):63-67.

〔2〕柳丽娜.浅淡Session机制与Cookie机制[J].电脑编程技巧与维护,2008(16):28-29.

〔3〕张瑞兴,张翠梅.Cookie和Session机制的初步探讨[J].考试周刊,2008(36):170-171.

〔4〕汪美.基于Javaweb内置对象session的仿真[J].科技风,2019(10):74.

〔5〕杨浩,姬鹏华,朱剑英.Java Servlet会话跟踪技术的应用研究[J].计算机应用,2002(09):45-47.

〔6〕曹海涛,胡牧,蒋厚明.基于集群节点间即时拷贝的会话同步技术研究[J].计算机系统应用,2017,26(03):268-270.

〔7〕曹海涛,胡牧,蒋厚明.基于集群节点间即时拷贝的会话同步技术研究[J].计算机系统应用,2017,26(03):268-270.

〔8〕易威环.Session与Cookie在系统登录中的综合应用[J].计算机光盘软件与应用,2013,16(18):51-52.