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);
}
}