Servlet--Cookie&Session

Servlet–Cookie&Session

1.请求转发和重定向

1)请求转发

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		System.out.println(req.getMethod());
		//必须在获取请求数据之前设置请求体的编码方式。
		req.setCharacterEncoding("UTF-8");
		//1.获取数据
		String name = req.getParameter("name");
		String pwd = req.getParameter("pwd");
		System.out.println(name+"&"+pwd);
		PrintWriter ps = resp.getWriter();
		if("admin".equals(name)&&"123456".equals(pwd)){
			//请求转发写法
			req.getRequestDispatcher("login_success.html").forward(req, resp);;
		}else{
			req.getRequestDispatcher("login_failure.html").forward(req, resp);;
		}
		
	}

2)重定向

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		resp.setContentType("text/html;charset=UTF-8");
		System.out.println(req.getMethod());
		//必须在获取请求数据之前设置请求体的编码方式。
		req.setCharacterEncoding("UTF-8");
		//1.获取数据
		String name = req.getParameter("name");
		String pwd = req.getParameter("pwd");
		System.out.println(name+"&"+pwd);
		PrintWriter ps = resp.getWriter();
		if("admin".equals(name)&&"123456".equals(pwd)){
			//ps.write("<center><h1>登录成功!</h1></center>");
			//以前的写法
			//resp.setStatus(302);
			//resp.setHeader("location","login_success.html");
			//重定向写法
			resp.sendRedirect("login_success.html");
		}else{
			//ps.write("<center><h1>登录失败!</h1></center>");
			//resp.setStatus(302);
			//resp.setHeader("location","login_failure.html");
			resp.sendRedirect("login_failure.html");
		}
		
	}

3)请求转发和重定向的区别

请求转发

1.地址栏上显示的是请求servlet的地址;

2.请求次数只有一次,因为服务器内部帮客户端执行了后续的操作;

3.请求转发只能跳转自己的项目的资源路径;

4.效率稍微高一点,应为只执行一次请求;

5.后续的请求,没法使用上一次的request存储的数据,或者,没法使用上一次request对象,因为这是两次不同的请求。

重定向

1.地址栏上显示的是最后那个资源的路径地址;

2.请求次数至少有两次,因为是服务器在第一次请求后,或返回一个302状态码和一个地址,浏览器在根据这个地址执行第二次请求。

3.重定向可以跳转到任意路径,不是自己的项目也行。

4.效率低一点,因为至少要执行两次请求;

5.可以使用上一次的request对象。

2.cookie

简介

一份数据,服务器给客户端的一份数据,并且存储在客户端浏览器上

应用场景

自动登录,浏览记录,购物车,

意义

1.http是无状态的协议,客户端与服务器在通讯时时无状态的,其实就是客户端在第二次访问,服务器根本就不知道该客户以前又没有来访过。为了更好的客户体验,更好的交互,更好的收集用户习惯。

简单使用

添加cookie

1.在响应的时候添加cookie;

2.客户端收到的信息里面,响应头中多了一个字段:Set-Cookie;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		//Cookie的简单使用
		Cookie cookie = new Cookie("name","admin");
		//给响应添加一个cookie
		response.addCookie(cookie);
		PrintWriter pr = response.getWriter();
		pr.write("请求成功了");
		pr.close();	
	}
获取cookie

第二次请求,客户端会带上cookie

		//获取cookie
		Cookie[] cookie2 = request.getCookies();
		if(cookie2!=null){
			for (Cookie c : cookie2) {
				String cookieName = c.getName();
				String cookieValue = c.getValue();
				System.out.println(cookieName+"="+cookieValue);
			}
		}
Cookie常用API

1.可以给响应添加多个cookie;

		response.addCookie(new Cookie("name","admin"));
		response.addCookie(new Cookie("age","22"));
		response.addCookie(new Cookie("sex","man"));

2.默认情况下,关闭浏览器cookie就没有了,但是我们可以给cookie设置有效期

Cookie c1 = new Cookie("name","admin");
Cookie c2 = new Cookie("age","22");
Cookie c3 = new Cookie("sex","man");
int expiry = 10;
c1.setMaxAge(expiry);
c2.setMaxAge(expiry);
c3.setMaxAge(expiry);
response.addCookie(c1);
response.addCookie(c2);
response.addCookie(c3);

expiry:有效器,单位为秒;

//正值:表示过了这个数值的秒数后,cookie就被清除了;

//负值,关闭浏览器,cookie就失效了,默认值是-1;

3.cookie.setDomin(pattern);

用于指定只有请求了指定的域名,才会带上该cookie;

4.cookie.setValue(newValue)

为cookie设置新值;

5.cookis.setPath(String str)

只有访问了指定路径,才会带上该cookie

Cookie获取上次访问时间
package com.nikehu.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

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

/**
 * Servlet implementation class GetTimeServlet
 */
public class GetTimeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		String date = null;
		//获取Cookie
		Cookie[] cookies = request.getCookies();
		if(cookies != null){
			for (Cookie cookie : cookies) {
				String name = cookie.getName();
				String val = cookie.getValue();
				if(name.equals("date")){
					date = val;
				}
			}
		}
		//设置cookie
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		String time = sdf.format(new Date());
		Cookie co = new Cookie("date", time);
		co.setMaxAge(60*60*24*7);
		response.addCookie(co);
		PrintWriter pr = response.getWriter();
		if(date==null){
			pr.write("<center><h1>这是你最近7天内的第一次来访</h1></center>");
		}else{
			pr.write("<center><h1>你最近的一次来访时间是"+date+"</h1></center>");
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

3.session(会话)

简介

基于cookie的一种绘画机制,cookie是服务器返回一小份数据给客户端,并且存放在客户端上,session是数据存放在服务器端,全称HttpSession。

提供一种方式,跨多个页面请求或对 Web 站点的多次访问标识用户并存储有关该用户的信息。

servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。服务器能够以多种方式维护会话,比如使用 cookie 或重写 URL。

此接口允许 servlet

session常用API

		//多个请求同属于同一个会话,同一个session。
		HttpSession session = request.getSession();
		//获取会话ID
		String id = session.getId();
		System.out.println("sessionID="+id);
		//获取session创建时间
		long creationTime = session.getCreationTime();
		//创建session属性
		session.setAttribute("name", "zhangsan");
		//获取session属性
		String name = (String)session.getAttribute("name");
		//移除session属性
		session.removeAttribute("name");

session简单使用

sessionID=27218C8F5E37C4048405E5F3BAEFE412
JSESSIONID=27218C8F5E37C4048405E5F3BAEFE412
session何时创建,何时销毁?

如果在Servlet中调用了HttpSession session = request.getSession()时,session就创建了。

session是存放在服务器内存中的数据,当然可以持久化(Redis),即使关了浏览器,session也不会销毁。

1.关闭服务器可以销毁session

2.session会话时间过了,session也会被销毁,默认有效期为30分钟。(服务器规定的)

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登入</title>
</head>
<body>
<center>
	<form action="SessionDemo01" method="post">
	账户:<input type="text" name="account"/><br/>
	密码:<input type="password" name="pwd"/><br/>
	<input type="submit" value="登录"><br>
	</form>
</center>
</body>
</html>

SessionDemo01.java

package com.nikehu.servlet;

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;

/**
 * Servlet implementation class SessionDemo01
 */
public class SessionDemo01 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		//获取用户提交数据
		String account = request.getParameter("account");
		String password = request.getParameter("pwd");
		//多个请求同属于同一个会话,同一个session。
		HttpSession session = request.getSession();
		//获取会话ID
		String id = session.getId();
		System.out.println("sessionID="+id);
		//获取cookie
		Cookie[] cookies = request.getCookies();
		for(Cookie cookie:cookies){
			System.out.println(cookie.getName()+"="+cookie.getValue());
		}
		//创建session属性
		session.setAttribute("name", account);
		session.setAttribute("pwd", password);
		response.sendRedirect("SessionDemo02");
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

SessionDemo02.java

package com.nikehu.servlet;

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 javax.servlet.http.HttpSession;

/**
 * Servlet implementation class SessionDemo02
 */
public class SessionDemo02 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		HttpSession session = request.getSession();
		String account = (String) session.getAttribute("name");
		String pwd = (String) session.getAttribute("pwd");
		PrintWriter writer = response.getWriter();
		writer.println("已经获取到Session:");
		writer.println("account="+account);
		writer.println("password="+pwd);
		writer.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
Session购物车例子

product_list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>商品列表</title>
</head>
<body>
<a href="CarServlet?id=0"><h3>iphone8</h3></a>
<hr>
<a href="CarServlet?id=1"><h3>小米mix3</h3></a>
<hr>
<a href="CarServlet?id=2"><h3>魅族10</h3></a>
<hr>
<a href="CarServlet?id=3"><h3>三星note7</h3></a>
<hr>
<a href="CarServlet?id=4"><h3>华为p20</h3></a>
<hr>
<a href="CarServlet?id=5"><h3>锤子</h3></a>
<hr>
</body>
</html>

CarServlet.java

package com.nikehu.servlet;

import java.io.IOException;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

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

/**
 * Servlet implementation class CarServlet
 */
public class CarServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		//1.获取要添加到购物车的商品id
		int id = Integer.parseInt(request.getParameter("id"));
		String[] products = {"iphone8","小米mix3","魅族10","三星note7","华为p20","锤子"};
		String name = products[id];
		//2.获取购物车存放东西的session
		//把一个map对象存放到map中,并且保证只存一次
		HttpSession session = request.getSession();
		Map<String, Integer> map = (Map<String, Integer>) session.getAttribute("cart");
		//session中没有存放任何商品
		if(map==null){
			map = new LinkedHashMap<String, Integer>();
			map.put(name, 1);
			session.setAttribute("cart", map);
		}else{
			//判断购物车中有没有该商品
			if(map.containsKey(name)){
				Integer num = map.get(name);
				map.put(name, num+1);
			}else{
				map.put(name, 1);
			}
		}
		//session.setAttribute("cart", map);
		//4.输出页面(跳转)
		response.getWriter().write("<a href='product_list.jsp'><h3>继续购物</h3></a>");
		response.getWriter().write("<a href='cart.jsp'><h3>去购物车结算</h3></a>");
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

cart.jsp

<%@page import="java.util.Map"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>购物车</title>
</head>
<body>
<h2>你的购物车清单</h2>
<%
	Map<String,Integer> map = (Map<String,Integer>)session.getAttribute("cart");
	if(map!=null){
		for(String name:map.keySet()){
%>
	<h3>商品名:<%=name %>, 商品数量:<%=map.get(name) %></h3>
<%
		}
	}
%>
<a href="ClearCar"><h3>清空购物车</h3></a>
</body>
</html>

ClearCar.java

package com.nikehu.servlet;

import java.io.IOException;

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

/**
 * Servlet implementation class ClearCar
 */
public class ClearCar extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		HttpSession session = request.getSession();
		session.removeAttribute("cart");
		response.sendRedirect("cart.jsp");
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值