Rumah >Java >javaTutorial >jsp/servlet会话是什么
客户端打开与服务器的连接,发出请求直到服务器响应客户端请求的全过程称之为会话 。
推荐课程:Java教程。
浏览器与服务器之间的通信是通过HTTP协议进行通信的,而HTTP协议是”无状态”的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟踪技术就可以实现这种要求 。
Cookie
服务器在响应请求时可以将一些数据以"键-值"对的形式通过响应信息保存在客户端。当浏览器再次访问相同的应用时,会将原先的存有session ID的Cookie通过请求信息带到服务器端,网络服务器通过识别唯一的session ID来代表每个客户端,从而识别这个客户端接下来的请求。
Cookie不是内置对象,需要自己创建Cookie的实例。是服务器往客户端写的一段文本信息,该信息是可以修改的,所以一般情况cookie会存储一些非敏感信息,当客户端再次请求服务器的时候,会将Cookie以请求头的方式发送到服务器,这个时候服务器就能区分是谁在访问了。
用于会话跟踪的Cookie叫做会话Cookie。Servlet规范中会话跟踪的cookie名字必须是JSESSIONID,保存在浏览器的内存中。
Cookie可以用于保持用户的会话状态,但Cookie信息保存在客户端,存在较大的安全隐患,且一般浏览器对Cookie的数目及数据大小有严格的限制。在Web应用中,一般情况下通过HttpSession对象保持会话状态
Cookie cookie = new Cookie("键", "值"); //创建cookie cookie.setMaxAge(60*60*24); //设置cookie的有效期 cookie.setPath("/"); //设置cookie的有效范围(路径) response.addCookie(cookie); //将cookie写入到客户端
Session
Session 是存放在服务器端的,更加安全。每一个用户都有一个不同的session,各个用户之间是不能共享的。
Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效 。
Session技术则是服务端的解决方案,它是通过服务器来保持状态的。在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。
session.setAttribute(String name,Object obj); //往session中存放内容(通过键和值的形式) session.getAtrribute(String name); //通过键从session中获取内容 session.removeAttribute(String name); //把存储在session中的对象移除 session.invalidate(); //销毁session
隐藏表单域
隐藏表单域是将会话ID添加到HTML的隐藏表单中(类型为hidden的input)。重定向和转发
通过进行信息的传递 。通过表单形式提交到服务器,但是本身不显示。
比如第二个表单中获取第一个表单中的内容,并以隐藏域( 文本框type为 hidden) 的方式接受第一个表单中的内容,再次传递到第三个表单中。通俗点说请求的顺序是这样的:表单一 - - > 表单二 - - >表单三,但是表单三需要用到表单一提交的内容,所以就会需要表单二作为过渡,把表单一的内容以隐藏域的形式保存,然后再传递到表单三中。
重写URL
把会话ID编码在URL中。 例:counter.jjsp;jsessionnid=be8d697876787876befdbde898789098980这样,即使浏览器不支持cookie,也能够实现会话跟踪。
对于URL复写,服务器从请求的URI中提取出会话ID,并把该请求与相应的会话关联起来,然后在访问会话数据的时候,JSP页面所进行的处理方式就和使用cookie跟踪会话id时所使用的方式完全相同。所以sesssion的实现要依靠cookie或URL复写技术。
String sessionId = request.getRequestedSessionId(); //获得sessionId
通过response对象的encodeURL(StringURL)实现URL地值重写:
<a href="<%=response.encodeURL("index.jsp") %>"> index页面</a>
该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会调用encodeURL()方法之后会自动将用户Session的id重写到URL中。重写后的输出可能是这样的:
a href="index.jsp?jsessionid=0E0C61100AEB06DE6A95EB1CD1DA8158">index页面</a>
HttpServletResponse接口定义了两个用于URL重写的方法:
encodeURL方法,用于超链接和form表单的action属性中设置的URL进行重写
encodeRedirectURL 方法 用于对传递给HttpServletResponse.sendRedirect()方法的URL进行重写
他们根据请求消息中是否含有Cookie头字段来决定是否进行url重写。把URL作为参数传递给这两个方法,他们就能完成url重写,在url后面添加 jsessionid参数及其值。可以关闭浏览器的Cookie,然后,进行实验,在网页源文件中查看URL后面是否有jsessionid参数及其值。
Atas ialah kandungan terperinci jsp/servlet会话是什么. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!