文档章节

Cookie&Session

centrald
 centrald
发布于 2016/03/17 21:01
字数 2061
阅读 78
收藏 8

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>

© 著作权归作者所有

共有 人打赏支持
上一篇: JavaBean
下一篇: servlet
centrald
粉丝 13
博文 112
码字总数 120823
作品 0
杭州
程序员
私信 提问
JavaWeb11-HTML篇笔记(一)

第11章WEB11-Cookie&Session篇 1.1 上次课内容回顾: 1.2 案例一:记录用户的上次登陆访问时间.1.2.1 需求: 1.2.2 分析:1.2.2.1 技术分析: 【会话技术】 Ø 使用会话技术: 【Cookie技术的使用...

我是小谷粒
2018/05/23
0
0
PHP学习的难点、精髓在哪?

下面几点仅供参考(WHT361) 1.Ajax使用(HTML XHTML XML CSS JavaScript Jquery DOM Dhtml) 函数/数组/字符串 2.文件操作(生成html) 图像处理 3.数据库操作 4.类和对象 5.正则表达式 cookie...

万花筒创新创业
2017/03/27
400
0
day10_cookie&session学习笔记

一、会话概述   1、什么是会话?如同打电话。       会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。   ...

黑泽明军
2018/05/08
0
0
Servlet技术 - Cookie与Session

Cookie与Session 会话使用 使用场景 * 偏好记录 * 自动登录 * 浏览记录 原理 * 客户端或者服务端保存用户数据 Cookie与Session Cookie 会话数据保存在浏览器客户端 Session 会话数据保存在服...

抢小孩糖吃
2016/09/03
84
0

没有更多内容

加载失败,请刷新页面

加载更多

没有更多内容

Coding and Paper Letter(六十四)

资源整理。 1 Coding: 1.交互式瓦片编辑器。 tile playground 2.R语言包autokeras,autokeras的R接口。autokeras是一个开源的自动机器学习的软件。 autokeras 3.斯坦福网络分析平台,用于网络...

胖胖雕
34分钟前
0
0
最简单的cd命令是个大坑!

BASH Shell 是大多 Linux 发行版的默认 shell,BASH 有一些自己的内置命令,cd 就是其中的一个。 在centos6里面,系统中不存在 cd 的二进制文件。但是你仍然可以运行该命令,这是因为 cd 是 ...

gaolongquan
45分钟前
1
0
spring获取bean的几种方式

使用jdk:1.8、maven:3.3.3 spring获取Bean的方式 pom.xml文件内容: <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="......

Vincent-Duan
51分钟前
2
0
一段话系列-Linux中IO的同步、异步、阻塞、非阻塞

首先我们框定一下背景,我们探讨的是Linux系统下的IO模型。 同步和异步是针对内核操作数据而言的,同步是指内核串行顺序操作数据,异步是指内核并行(或并发)操作数据,然后通过回调的方式通...

EasyProgramming
56分钟前
4
0
好程序员web前端分享主流CSS image比较

好程序员web前端分享主流CSS image比较在还原设计图的时候,难免会碰到一些样式图片的引用。如何来对这些图片做优化呢?本文简单的梳理了一下目前几种比较常用的使用方式。   注: 1. 有更好...

好程序员IT
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部