1.关闭浏览器重新打开,要求可以重新获取原先session中的数据
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);
response.addCookie(cookie);
2.仿照案例,使用session技术实现购物网站显示浏览记录的功能。
即:浏览过的商品都加入到session。然后在每个商品页面都取出session看看之前浏览过哪些商品。
import org.apache.commons.dbutils.DbUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//访问当前servlet时,页面显示出所有的商品信息
response.setContentType("text/html;charset=utf-8");
try {
QueryRunner runner = new QueryRunner(DruidUtils.getDataSource());
List<Product> products = runner.query("select * from product", new BeanListHandler<Product>(Product.class));
for (Product product : products) {
response.getWriter().println("<a href='" + request.getContextPath() + "/goodsInfo?id=" + product.getId() + "'>" + product.getName() + "</a><br>");
}
} catch (Exception e) {
e.printStackTrace();
}
response.getWriter().println("您最近的三条浏览记录为:<br>");
HistoryUtils.showRecentView(request, response);
}
}
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/history")
public class HistoryServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
HistoryUtils.showRecentView(request,response);
}
}
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/goodsInfo")
public class GoodsInfoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
/**
* 首先商品详情页要显示商品的信息
* 其次要修改浏览记录
* @param request
* @param response
* @throws ServletException
* @throws IOException
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String id = request.getParameter("id");
try {
QueryRunner runner = new QueryRunner(DruidUtils.getDataSource());
Product product = runner.query("select * from product where id = ?", new BeanHandler<>(Product.class),id);
response.getWriter().println(product);
HistoryUtils.updateRecentView(product,request);
} catch (Exception e) {
e.printStackTrace();
}
response.getWriter().println("<a href='" + request.getContextPath() + "/history" + "'>查看最近浏览记录</a>");
}
}
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
public class HistoryUtils {
/**
* @param request 通过request获取session对象
* @param response 直接输出记录到浏览器
*/
public static void showRecentView(HttpServletRequest request, HttpServletResponse response) throws IOException {
List<Product> history = (List<Product>) request.getSession().getAttribute("history");
if(history != null || !history.isEmpty()){
for (Product product : history) {
response.getWriter().println("<a href='" + request.getContextPath() + "/goodsInfo?id=" + product.getId() + "'>" + product.getName() + "</a> ");
}
}
}
/**
*
* @param product
* @param request
*/
public static void updateRecentView(Product product, HttpServletRequest request) {
LinkedList<Product> history = (LinkedList<Product>) request.getSession().getAttribute("history");
if(history == null){
history = new LinkedList<>();
}
if(history.contains(product)){
history.remove(product);
}else{
//这里面也可以自定义,显示多少条记录
if(history.size() > 2){
history.removeLast();
}
}
history.addFirst(product);
request.getSession().setAttribute("history", history);
}
}
3.简述cookie技术和session技术的联系和区别。
Session和Cookie的主要区别在于:
Cookie技术是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。(在浏览器保存)。
Session技术是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象,
由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,
当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
即把用户的数据写到用户独占的session中。(在服务器端保存)