Cookie&Session

JSP简介:

      java server page  运行在服务器端的页面.  ==> 本质就是servlet.

1.运行流程:

    jsp =(第一次访问时)=> .java ==> .class ==> 运行

2.JSP中的脚本:

    <% java内容 %>  该脚本包裹的代码会出现在 service方法中

    <%=表达式 %>  该脚本用于输出内容.out.print();方法包裹输出内容.

    <%! 内容 %>(了解): 该脚本包裹的内容会出现在类定义中.

3.JSP中的脚本注释:

    <%--  注释内容  --%>

cookie 

1.基本概念

    浏览器端记录信息的技术

   会话技术:从打卡一个浏览器访问某个站点 到关闭这个浏览器的整个过程 成为一次会话

    为什么需要会话技术?

   http协议是无状态  用户在一个站点中没有存储自己数据的区域

    Cookie和session的区别?

    Cookie:数据存储在客户端本地 减少服务器端的存储的压力  安全性不好  客户端可以清除cookie

    Session:将数据存储到服务器端 安全性好 增加服务器的压力  客户端可以清除cookie

    cookie和session 都属于会话技术.

2.基本操作

创建cookid

Cookie cookie = new Cookie(String key,String value);

发送cookie

response.addCookie(cookie);

获得cookie

Cookie cookie = null; 

Cookie[] cookies =  request.getCookies();

if(cookies!=null && cookies.length>0){

    for(Cookie c : cookies ){

         if(c.getName().equals("remember")){

            cookie = c;

         }

     }

}

3.cookie的细节

1>关于浏览器记住多久.

(默认情况) 当浏览器关闭时(会话结束时)

//cookie.setMaxAge(60*60*24*7*2);//两周

//cookie.setMaxAge(-1);//(默认情况)浏览器关闭时删除cookie

//cookie.setMaxAge(0);// 用于删除cookie

2>浏览器在什么情况下发送cookie(cookie的路径问题)

cookie的默认路径就是 发送cookie的动态资源所在的上一级路径.

如果 cookie路径是"/cookie",  那么浏览器在访问cookie路径的所有子路径时会携带cookie.

http:/localhost:8080/cookie/BServlet 会发送

http:/localhost:8080/cookie/ABC/BCD/CServlet 会发送

http:/localhost:8080/AServlet 不会发送

http:/www.baidu.com/cookie/BServlet 不会发送

cookie的默认路径就是发送cookie的资源(AServlet)所在路径

使用代码手动控制cookie路径以及主机:

cookie.setPath("/cookie");

3> cookie中主机问题

cookie的默认主机就是发送cookie资源所在的主机

主机用处: 如果cookie需要发送,那么主机也必须符合.

主机的手动控制:

理论上可以手动控制. 主机的设置不允许设置发送cookie资源所在主机以外的其他主机.

//cookie.setDomain("www.baidu.com"); //不允许

//cookie.setDomain("localhost"); // localhost => 特殊的主机 =>不能设置

cookie.setDomain(".baidu.com");//如果我们当前主机是www.baidu.com.

4> cookie删除的问题

原理: 使用一个寿命为0的cookie覆盖要删除的cookie.

如何覆盖: 保证3点一致,即可覆盖=> 主机,路径,cookie的键

5>  跨域(主机)共享cookie.

需求: cookie可以跨越多个主机 例如: www.baidu.com  music.baidu.com 等等

操作:

1. 将cookie的主机设置为".baidu.com" => *.baidu.com主机都满足

2. 将cookie的路径设置为"/"=> 什么路径都满足

6> 使用cookie记录中文键值对问题.

原则: 响应头和请求头中不允许使用中文编码. 只能使用ISO-8859-1编码.

解决: 使用URLEncode编码,即可. 

操作: 

工具类(JDK提供):使用 URLEncoder.encode()方法编码

使用 URLDecoder.decode()方法解码

例子:

1.记住用户名

1>.用户名密码 获得

2>.验证用户名密码(填了就算)

3>.判断 用户是否勾选记住用户名checkbox

4>.勾选=> 新建cookie

 没勾选=>新建cookie 设置maxage为0

5>.将cookie添加到response

6>.重定向到成功页面

(1)cookie02.java

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class cookie02 extends HttpServlet {

	
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//获得用户的用户名信息
		String username = request.getParameter("username");
		//获得勾选框的勾选状态
		String status = request.getParameter("check");
		System.out.println(status);
		//新建cookie
		Cookie cookie = new Cookie("remember", URLEncoder.encode(username, "UTF-8"));
		System.out.println(cookie.getName()+":"+cookie.getValue());
		//根据勾选框的状态判断是否需要设置cookie的保持时间或者销毁cookie
		if("yes".equals(status)){
			//将cookie保持一天
			cookie.setMaxAge(60*60*24);
			System.out.println("已执行1");
		}
		else{
			//销毁cookie,即设置寿命为0
			cookie.setMaxAge(0);
			System.out.println("已执行2");
		}
		//添加cookie到response响应中去
		response.addCookie(cookie);
		//重定向到登录成功页面
		response.sendRedirect("/cookie_session/success.jsp");
		
	}

}

(2)login.jsp

<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'login.jsp' starting page</title>
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<%	
		Cookie[] cookies = request.getCookies();
		Cookie cookie = null;
		if(cookies!=null&&cookies.length>0){
			for(Cookie c:cookies){
				if(c.getName().equals("remember")){
					cookie = c;%>
					<%=cookie%>
				<% }
			}
		}
	 %>
  </head>
 
  <body>
    <form action="/cookie_session/cookie02" method="post" name="myform">
    	<table align="center">
    		<tr>
    			<td>用户名:</td>
    			<td><input type="text" name = "username" value="<%=cookie!=null?URLDecoder.decode(cookie.getValue(), "UTF-8"):""%>"/></td>
    		</tr>
    		<tr>
    			<td>密码:</td>
    			<td><input type="password" name="userpass"></td>
    		</tr>
    		<tr>
    			<td><input type="submit" value="提交"/></td>
    			<td><input type="checkbox" name="check" value="yes" <%=cookie!=null?"checked='checked'":""%> />记住用户名</td>
    		</tr>
    	</table>
    </form>
  </body>
</html>

session

1.session的细节

1>操作session

session就是域对象.

session.setAttribute("name", "tom");

String  name = (String) session.getAttribute("name");

session.removeAttribute("name");

Enumeration<String> attributeNames = session.getAttributeNames();

2>session域的范围

一次会话期间共享数据的.

开始:第一访问服务器,服务器创建session对象,范围的开始

结束:1.关闭浏览器,会话结束. 

2.Session的过期时间到了,Session销毁

3.调用invalidate方法,Session立刻销毁

//-------------------------------------------

为什么说关闭浏览器会话就算结束?

因为保存sessionId的cookie的有效时间是,浏览器关闭cookie删除.

cookie中的sessionID丢失.sessionID一旦丢失,那么就再也找不到Session对象了.

如果永远不关闭浏览器,SessionID就不会丢失.服务器中的Session也会一直存在吗?

Session的空闲时间如果超过30(默认值)分钟,仍然会被删除.

配置:tomcat/conf/web.xml

<session-config>

<session-timeout>30</session-timeout>

</session-config>

自己项目的web.xml中也可以配置=>只影响当前项目

3>session中的其他api(了解)

long ctime = session.getCreationTime();//获得创建时间

String id = session.getId();//获得Session的Id

long atime = session.getLastAccessedTime();// 获得最后一次操作Session的时间

int sec = session.getMaxInactiveInterval();//获取Session的有效时间的

session.setMaxInactiveInterval(interval)//设置Session的有效时间的

session.getServletContext();// 获得servletContext对象

boolean is = session.isNew();// 判断该Session是不是新的

session.invalidate();//(记住)让Session失效. 让Session对象销毁

例子:

1.验证码实例

(1)session01.java(验证码生成是使用验证码工具类生成的,大家可以自行去网络上下载)

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.dsna.util.images.ValidateCode;


public class sessionTest01 extends HttpServlet {
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//生成验证码 (长,宽,位数,干扰线)
		ValidateCode vc = new ValidateCode(140,70,4,2);
		//发送给浏览器
		vc.write(response.getOutputStream());
		//放入session中
		request.getSession().setAttribute("code", vc.getCode());
	}

}

(2)cookieTest02.java

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class sessionTest02 extends HttpServlet {	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//解决request乱码问题
		request.setCharacterEncoding("UTF-8");
		//获得用户提交的验证码
		String code1 = request.getParameter("code");
		System.out.println(code1);
		//获得验证码的正确信息
		String code2 = (String)request.getSession().getAttribute("code");
		System.out.println(code2);
		//进行比对
		if(code1!=null&&code1.equalsIgnoreCase(code2)){
			//验证码比对正确
			System.out.println("验证码正确");
			response.getWriter().write("sucess!");
		}
		else{
			//如果验证不成功
			request.setAttribute("error", "验证码错误");
			request.getRequestDispatcher("/vclogin.jsp").forward(request, response);
		}
	}

}

(3)vclogin.java

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'vclogin.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
	<script type="text/javascript">
		function func1(){//切换验证图片
			var one = document.getElementById("one");
			one.src="/cookie_session/sessionTest01?haha="+new Date();
		}
	</script>
  </head>
  
  <body>
    <form action="/cookie_session/sessionTest02" method="post" name="myform">
    	<table>
    		<tr>
    			<td>用户名:</td>
    			<td><input type="text" name="username"/></td>
    		</tr>
    		<tr>
    			<td>密码:</td>
    			<td><input type="password" name="userpass"/></td>
    		</tr>
    		<tr>
    			<td>验证码:</td>
    			<td><input type="text" name="code" size="4"/><img src="/cookie_session/sessionTest01" id="one"/><a href="javascript:void(0)" onclick="func1();">看不清,换一张</a><td>
    		</tr>
    		<tr>
    			<td><input type="submit" value="登录" /></td>
    			<td><font color="red"><%=request.getAttribute("error")!=null?request.getAttribute("error"):"" %></font></td>
    		</tr>
    	</table>
    </form>
  </body>
</html>

Cookie&Session_第1张图片

你可能感兴趣的:(session,jsp.cookie)