session & cookie

历史回顾

JSP九大内置对象

jsp是运行在服务端的程序

JSP有九个内置对象(又叫隐含对象),不需要预先声明就可以在脚本代码和表达式中随意使用

JSP九大内置对象分为四类:

输入输出对象:out对象、response对象、request对象
通信控制对象:pageContext对象、session对象、application对象
Servlet对象:page对象、config对象
错误处理对象:exception对象


jsp四大作用域:

page范围:只在一个页面保留数据(javax.servlet.jsp.PageContext(抽象类))

request范围:只在一个请求中保存数据(javax.servlet.httpServletRequest)

Session范围:在一次会话中保存数据,仅供单个用户使用(javax.servlet.http.HttpSession)

Application范围:在整个服务器中保存数据,全部用户共享(javax.servlet.ServletContext)

九种对象简介:

out对象:用于向客户端、浏览器输出数据。
request对象:封装了来自客户端、浏览器的各种信息。
response对象:封装了服务器的响应信息。
exception对象:封装了jsp程序执行过程中发生的异常和错误信息。
config对象:封装了应用程序的配置信息。
page对象:指向了当前jsp程序本身。
session对象:用来保存会话信息。也就是说,可以实现在同一用户的不同请求之间共享数
application对象:代表了当前应用程序的上下文。可以在不同的用户之间共享信息。
pageContext对象:提供了对jsp页面所有对象以及命名空间的访问。
--------------------- 
作者:蜘蛛侠不会飞 
来源:CSDN 
原文:https://blog.csdn.net/qq_40587575/article/details/79810019 
版权声明:本文为博主原创文章,转载请附上博文链接!

如果四个作用域都存放了一个相同的名字的值,会取最小作用域的值。问题? 如果我就想去session的值,怎么办?

作用域scope.作用域名

会话技术

会话技术一共分为两种

客户端会话技术(Cookie

服务器会话技术(Session

cookie

cookie常见的案例如:浏览器登录页面记住用户名和密码,QQ登录界面记住用户名和密码等。

作用:将数据存储到本地为了智能填充数据,还能够增强用户体验,缓解服务器压力。

如何给自己的网站缓存数据

首先设置:cookie值Cookie cookie = new Cookie("cookie名","cookie值");  然后再把cookie值响应添加到浏览器中:response.addCookie(cookie);

response 是可以将信息返回到浏览器上,所以设置Cookie 的时候是借助Response对象将Cookie发送到本地浏览器。

获取Cookie的方法时通过reqeust 进行获取,注意获取cookie时不能获取某一个,只能获取所有cookie的集合,我们遍历判断后可以去到响应的值。注意cookie是一个对象,不能直接取值赋值。

Cookie的属性

int maxAge 该Cookie失效时间,单位秒。如果为正数,则Cookie在maxAge秒之后失效。

如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存Cookie.如果为0,表示删除Cookie。默认是-1

Integer.MAX_VALUE表示永远有效

注意:设置cookie属性必须放到addCookie之前,即响应到页面之前设置各种属性,否则修改属性无效!

案例:记住账号密码

注意点

1.获取参数信息是getParameter(),获取属性是getAttribute()不要搞混了

2.cookie对象的属性设置一定要在响应添加cookie(response.addCookie())数据之前

3.读取cookie值不能单个读取,只能读取一个数组,遍历获然后if判断即可获取具体的值

4.登陆界面的读取cookie值的java代码片段<%。。。%>一定要在form表单之前,否则无效

form表单

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
	<%//在这里获取cookie的值,这样第二次登陆的时候就会自动添加了,必须要在form表单之前,不然等到form表单加载之后再复制就永远都不会显示了
		Cookie[] c = request.getCookies();
		if(null != c){//首先判断该集合非空
			for(Cookie co:c){
				if("user".equals(co.getName())){
					pageContext.setAttribute("user", co.getValue());
				}
				if("pwd".equals(co.getName())){
					pageContext.setAttribute("pwd", co.getValue());
				}
			}
		}
	%>
	<form action="cookieServlet" method="post">
		用户名:<input type="text" placeholder="请输入账号"  name="user" value="${user }"><br>
		密码:<input type="password" placeholder="请输入密码"  name="pwd" value="${pwd }"><br>
		<input type="submit" value="提交">
	</form>
</body>
</html>

Servlet

package cookie;

import java.io.IOException;

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

@WebServlet("/cookieServlet")
public class CookieServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置页面字符集
		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		//从页面获取信息
		String user = (String)request.getParameter("user");//获取参数用geyparameter,不要和getattribute搞混了
		String pwd = (String)request.getParameter("pwd");
	
		//获取cookie对象并设置其属性
		Cookie c1 = new Cookie("user",user);
		Cookie c2 = new Cookie("pwd",pwd);
		c1.setMaxAge(60*60);
		c2.setMaxAge(60*60);
		//将获取到的cookie响应到本地浏览器中
		response.addCookie(c1);
		response.addCookie(c2);
		
		//重定向到指定登陆成功页面
		response.sendRedirect("success.jsp");
	}
}

成功页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	欢迎登陆!
</body>
</html>

Session会话技术

服务端会话技术

Servlet的一个对象,全称HttpSession,同时也是一个作用域。

生活中实例

登录网站,关闭浏览器之后会提示你重新登录。

如何做到关闭浏览器后通知你重新登录。

 

Session作用域的特性

存放的值可以跨页面,只要你不关闭浏览器那么你的作用域的值就一直存在。也就意味着会话不结束session长存(可以设置最大存活时间)。

 

实际项目中如何实现访问页面拦截

在登录成功之后,将用户的ID或者对象存到Session中,如果访问页面的时候判断Session中存在这个ID 意味着现在已经登录可以访问本页面,如果ID获取不到,意味着没有登录。

会话跟踪技术

实际说session不具备检测浏览器开启关闭的功能,所以能实现的原理就在JSESSION上。能实现这种技术要依赖cookie

案例:用户登录

  1. 如果用户没有登录,需要跳转到login.jsp
  2. 如果用户登录了,允许访问任意本项目页面,并且在页面中显示登录的账号
  3. 如果关闭浏览器,需要重新登录。

实现步骤:

  1. 用户登录成功之后将名称保存到session中
  2. 在本项目各个页面获取用户账号,只需要判断账号是否匹配即可,因为如果没登陆肯定什么都没有,只要登陆了密码肯定是正确的
  3. 关闭服务器后者关闭浏览器,再次访问非登录,跳转到登陆页面中。关闭浏览器之后如果跳过登陆页面访问其他页面直接给跳转到了Login.JSP页面,只需要在登陆成功页面加这样一段判断即可,应用了session作用域在浏览器关闭之前有效。

Session是服务器对象,为什么关闭服务器在启动我们还能够获取session信息

session 的活化与钝化功能。

简单说明:

活化:将session从本地读取到内存中 (启动服务器的时候)

钝化:从内存中将数据保存到本地硬盘 (关闭服务器的时候)

session一般都保存一些非常重要的数据,开发者为了不会因为服务器异常关闭导致内存中的数据丢失,会将数据钝化到本地。 重启后直接恢复到内存中。 数据一直存在。

 

Tomcat服务器默认支持session活化与钝化功能。

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值