黑马day05 session重新设置JSESSIONID的生命周期

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杀死的过程。

实验:使用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);}}运行结果:我不去想是否能够成功,既然选择了远方,便只顾风雨兼程!

黑马day05 session重新设置JSESSIONID的生命周期

相关文章:

你感兴趣的文章:

标签云: