栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Javaweb基础-servlet应用2

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Javaweb基础-servlet应用2

状态管理
现有问题

Http是无状态的,不能保存每次提交的信息如果用户发来一个新的请求,服务器无法知道它是否与上次请求是否有联系对于那么需要提交多次信息才能完成的操作,比如购物,就很有问题 概念

将浏览器和web服务器之间多次交互当成一个整体来处理,并且将多次交互所涉及的数据(即状态)保存先来。

状态管理分类

客户端状态管理:将状态保存在客户端。代表性技术就是cookie技术服务器状态管理: 将状态保存在服务端,代表性技术就是Session技术

cookie的使用
什么是cookie

cookie是服务器发送到用户浏览器并保持在本地的一小块,他会在浏览器下次向服务器发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器。

cookie的基本操作 
@WebServlet("/cs")
public class cookieServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//1.服务端创建cookie对象
		cookie cookie = new cookie("username", "qcby");
           //2.设置cookie有效期 1 小时  
           cookie.setMaxAge(60*60);  // 存储数据有三种方式:>0有效期,单位秒;=0浏览器关闭;<0 临时存储,默认为-1
		//3.将cookie响应给客户端
		resp.addcookie(cookie);
	}
}

在浏览器访问:http://localhost:8080/SecondServlet/cs

我们可以在chrome浏览器的设置--->隐私设置和安全性中找到查看cookie和网站数据

cookie的获取

浏览器jQuery获取cookie

function getcookie(cname){
    var name = cname + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i 
 

服务器获取cookie的值

@WebServlet("/getcookie")
public class GetcookieServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 通过request对象获取所有的cookie
		cookie[] cookies = req.getcookies();
		// 通过for循环遍历cookie
		if (cookies != null) {
			for (cookie cookie : cookies) {
				System.out.println(cookie.getName() + " " + cookie.getValue());
			}
		}
	}
}
cookie的编码和解码

cookie默认不支持中文,只能包含ASCII码。所以cookie需要对Uncode字符进行编码,否则会出现乱码

创建带有中文的cookie

@WebServlet("/cs")
public class cookieServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//1.服务端创建cookie对象
		cookie cookie = new cookie(
				URLEncoder.encode("姓名","UTF-8"),
				URLEncoder.encode("张三","UTF-8")
				);
	   //2.设置cookie有效期 1 小时
	    cookie.setMaxAge(60*60);
		//3.将cookie响应给客户端
		resp.addcookie(cookie);
	}
}

解码带有中文的cookie

@WebServlet("/getcookie")
public class GetcookieServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 通过request对象获取所有的cookie
		cookie[] cookies = req.getcookies();
		// 通过for循环遍历cookie
		if (cookies != null) {
			for (cookie cookie : cookies) {
				System.out.println(URLDecoder.decode(cookie.getName(),"UTF-8")+" " + URLDecoder.decode(cookie.getValue(),"UTF-8"));
			}
		}
	}
}
cookie的优缺点

优点:

    可配置到期规则简单性:cookie是一种包含文本轻量结构,包含简单的键值对数据持久性:cookie默认在过期之前可以一直保存在客户端浏览器上

缺点:

    大小受限制:大多数浏览器对cookie的大小有限制,分别是4k和8k字节用户配置为禁用:有些用户禁用了浏览器或者客户端设备接收cookie的能力,因此限制了这一功能潜在的安全风险:cookie可能被篡改
Session对象(重点) 
Session概述

Session用于记录用户的状态。Session是指在一段时间之内,单个客户端与Web服务端的一连串的交互过程。在一个Session中,客户可能会多次请求访问各种不同的服务器资源 Session原理

服务器会为每一次会话分配一个Session对象同一浏览器发起的多次请求,同属于一次会话(Session)首次使用Session时,服务器会自动创建session,并创建cookie存储SessionId发送回客户端

Session的使用 

获取session

@WebServlet("/ss")
public class cookieServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 1. 通过request对象获取Session对象
		HttpSession session = req.getSession();
		// 获取sessionid
		System.out.println(session.getId());
	}
}

Session保存数据

setAttribute("key", value)保存数据到session中

session.setAttribute("key", value); //以键值对的形式存储在session当中

Session获取数据

getAttribute("key")获取session中的数据

session.getAttribute("key"); // 通过String类型的key访问Object类型的value

Session移除数据

removeAttribute("key")从session中删除数据

session.removeAttribute("key"); // 通过key值删除session中的值
Session的生命周期

开始:第一次使用到session的请求产生则创建session结束

    浏览器关闭session超时失效:session.setMaxInactiveInterval(interval)手动销毁失效:session.invalidate();
浏览器禁用cookie后使用Session解决方案

浏览器在默认情况下,会使用cookie的方式将sessionID发送给浏览器,如果用户禁用cookie,则sessionID不会被浏览器保存,此时浏览器可以使用URL重写这样的方式发送sessionID

URL重写:浏览器在访问服务器上的某个地址时,不在使用原来的地址,而是使用经过该写的地址(在原来的地址上边加上sessionID)

实现URL重写:response.encodeRedirectURL(url)

@WebServlet("/ss")
public class SetSession extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession session = request.getSession();
		// 重写 URL 追加 SessionID
		String newUrl = response.encodeRedirectURL("/SecondServlet/gs");
		System.out.println(newUrl);
		response.sendRedirect(newUrl);  //重定向到我们要跳转页servlet
	}
}
@WebServlet("/gs")
public class GetSession extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		// 1. 通过request对象获取Session对象
		HttpSession session = req.getSession();
		// 获取sessionid
		System.out.println(session.getId());
	}
}

输出结果就是我们在url上边加上了sessionID。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/736835.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号