黑马day05 session&重新设置JSESSIONID的生命周期
时间:2015-06-20 09:16:47
收藏:0
阅读:1896
HttpSession:在服务器中,为浏览器创建独一无二的内存空间,在其中保存会话相关的信息。
4.1session作为域使用:他是j2ee中四大域对象之一,作用范围为整个会话。
4.2session的生命周期:在第一次调用reqeust.getSession()方法的时候,服务器会检查是已经有对应的session,如果没有就在内存中创建一个session并返回。
当一段时间内session没有被使用,一般为30分钟(此值可以在web.xml中配置<session-config>来配置,也可以使用TomcatManager进行配置),则服务器会销毁该session
当服务器强行关闭时,没有到期的session也会跟着销毁。
如果调用session提供的invalidate(),可以立即销毁session。
4.3session的原理:在服务器第一次调用request.getSession()方法的时候,会在内存中创建一个session对象,此对象具有一个独一无二的id值,此id值将会以cookie(JSESSIONID)的形式发送给浏览器,浏览器以后每次访问都会带着此cookie,服务器就利用此cookie区分浏览器找到对应的session空间。
4.4同一电脑内的不同浏览器使用同一session:JSESSIONID这个cookie默认是保存在浏览器内存中的,我们可以自己创建一个同名同path的Cookie,并设置maxage值,使其被保存在硬盘中,从而实现统一电脑中不同浏览器公用一个JSESSIONID从而使用同一个session。
4.5使禁用Cookie的浏览器也可以使用session:由于session是基于cookie运行的,如果禁用了cookie则会导致session不可用,我们可以将提供给这种浏览器的所有的URL进行重写,在所有的URL后跟上JSEESIONID,从而保证即使禁用了Cookie也能以URL的形式带回JSESSIONID,从而可以使用session。要重写所有的URL是一项成本很高的工作,一般我们不会这么做。
response. encodeRedirectURL(java.lang.String?url)如果此url是作为重定向操作的地址时使用此方法
response. encodeURL(java.lang.String?url)如果此url是普通连接则使用此方法
实验:利用session实现简单的购物功能,并提供对同一台电脑上的多个浏览器共享session的支持以及对禁用cookie浏览器的支持。
实验:使用Session完成用户登陆:当用户登录时在session中保存用户名,在其他页面就可以检查session中是否存在用户名,如果存在则认为已经登录过。注销的过程就是将session杀死的过程。
3.PayServlet实现付款功能
4.1session作为域使用:他是j2ee中四大域对象之一,作用范围为整个会话。
4.2session的生命周期:在第一次调用reqeust.getSession()方法的时候,服务器会检查是已经有对应的session,如果没有就在内存中创建一个session并返回。
当一段时间内session没有被使用,一般为30分钟(此值可以在web.xml中配置<session-config>来配置,也可以使用TomcatManager进行配置),则服务器会销毁该session
当服务器强行关闭时,没有到期的session也会跟着销毁。
如果调用session提供的invalidate(),可以立即销毁session。
4.3session的原理:在服务器第一次调用request.getSession()方法的时候,会在内存中创建一个session对象,此对象具有一个独一无二的id值,此id值将会以cookie(JSESSIONID)的形式发送给浏览器,浏览器以后每次访问都会带着此cookie,服务器就利用此cookie区分浏览器找到对应的session空间。
4.4同一电脑内的不同浏览器使用同一session:JSESSIONID这个cookie默认是保存在浏览器内存中的,我们可以自己创建一个同名同path的Cookie,并设置maxage值,使其被保存在硬盘中,从而实现统一电脑中不同浏览器公用一个JSESSIONID从而使用同一个session。
4.5使禁用Cookie的浏览器也可以使用session:由于session是基于cookie运行的,如果禁用了cookie则会导致session不可用,我们可以将提供给这种浏览器的所有的URL进行重写,在所有的URL后跟上JSEESIONID,从而保证即使禁用了Cookie也能以URL的形式带回JSESSIONID,从而可以使用session。要重写所有的URL是一项成本很高的工作,一般我们不会这么做。
response. encodeRedirectURL(java.lang.String?url)如果此url是作为重定向操作的地址时使用此方法
response. encodeURL(java.lang.String?url)如果此url是普通连接则使用此方法
实验:利用session实现简单的购物功能,并提供对同一台电脑上的多个浏览器共享session的支持以及对禁用cookie浏览器的支持。
实验:使用Session完成用户登陆:当用户登录时在session中保存用户名,在其他页面就可以检查session中是否存在用户名,如果存在则认为已经登录过。注销的过程就是将session杀死的过程。
实验:使用session完成防止表单重复提交:当提供表单页面时,在表单中隐藏一个随机数值,并且将该随机数保存到session中,当表单提交时,检查提交上来到随机数与session中的随机数是否相同,如果相同则允许注册,注册后立即删除session中的随机数,如果不同则认为是表单的重复提交。
实验:实现购买与付账的功能
1.建立一个jsp实现到BuyServlet&PayServlet的超链接并带一个参数过来
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv=" pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <a href="<%=request.getContextPath()%>/servlet/BuyServlet?prod=冰箱">购买冰箱</a> <a href="<%=request.getContextPath()%>/servlet/BuyServlet?prod=空调">购买空调</a> <a href="<%=request.getContextPath()%>/servlet/PayServlet">付账</a> </body> </html>运行界面:
2.在BuyServlet实现通过request.getParamer()的方式获取参数,然后将这个参数设置到session域对象中。下面的设置Cookie的代码是为了实现即时关闭了浏览器(默认是浏览器关闭,cookie死亡,即session丢失)也可以向浏览器写数据。从而关闭了浏览器也可以实现付款(知道是买的那个不会报NULl)
package cn.itheima.session; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class BuyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决中文乱码问题get提交方式 //1.获取参数 String prod=request.getParameter("prod"); prod = new String(prod.getBytes("iso8859-1"),"utf-8"); //2.放到session域中 HttpSession session = request.getSession(); session.setAttribute("prod", prod); //3.重写Cookie重新设置JSESSIONID的声明周期 Cookie c=new Cookie("JSESSIONID", session.getId()); c.setPath(request.getContextPath()); c.setMaxAge(1800); response.addCookie(c); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }点击购买
3.PayServlet实现付款功能
package cn.itheima.session; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class PayServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //1.获取session String prod = (String) request.getSession().getAttribute("prod"); response.getWriter().write("您购买的是价值9999元的"+prod); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }运行结果:
大家可以尝试关闭浏览器....也能实现付款的功能!
评论(0)