会话

Cookie API

为了封装cookie信息在Cookie API中提供了一个javax.servlet.httpCookie类,该类包含生成Cookie信息和提取cookie信息各个属性的方法。

如果一个存在浏览器缓存中的cookie的路径是/hhh/servlet/
当访问http://localhost:8080/hhh/CookiePathDemo1时,浏览器根本不带Cookie给服务器。
浏览器比对的是cookie的路径和当前访问的资源的路径。
 
浏览器满足一下条件就会带cookie给服务器:
当前访问的地址的路径.startWith(已存cookie的路径)。
即:如果一个Cookie的路径设置为了当前应用,说明访问该网站的任何资源时浏览器都带该cookie给服务器。(开发中经常做的)

 
把Cookie写给客户端:
HttpServletResponse.addCookie(Cookie c):实际上就是向客户端发送了一个响应消息头。
注意:客户端只能保存一个网站最多20个Cookie数据,总共最多300个。每个Cookie的大小
不能超过4kb。

 
注意:domain+path+name唯一确定一个Cookie。

构造方法

cookie类有且仅有一个构造方法

public Cookie(java.lang.String name, java.lang.String value);
name 指定cookie名称
value 指定cookie值
cookie类的常用方法
方法声明 功能描述
void setPath(java.lang.String uri) :设置cookie的有效访问路径
void setMaxAge(int expiry) : 设置cookie的有效时间
void setValue(java.lang.String newValue) :设置cookie的值
void setDomain(String pattern) :设置cookie的项的有效域
void setVersion() :设置cookie的项的有效域
void setComment(String purpose) :设置cookie的项的注解部分
void setDomain(String pattern) :设置cookie的项采用的协议版本
String getName()
String getValue
int get maxAge()
String getPath
void response.addCookie(Cookie cookie) : 发送cookie 发送cookie到浏览器端保存
cookieCookie[] request.getCookies() : 服务器接收cookie
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String remember = request.getParameter("remember");//没有选中就是null
        
        Cookie c = new Cookie("loginInfo", username);
        c.setPath(request.getContextPath());
        if(remember==null){
            //没有选中:删cookie
            c.setMaxAge(0);
        }else{
            //用户记住用户名:存cookie
            c.setMaxAge(Integer.MAX_VALUE);
        }
        response.addCookie(c);
        out.write("登录成功");  
    }

//得到指定的cookie
        String username = "";
        String checked = "";
        Cookie cs[] = request.getCookies();
        for(int i=0;cs!=null&&i<cs.length;i++){
            if("loginInfo".equals(cs[i].getName())){
                username = cs[i].getValue();
                checked="checked='checked'";
                break;
            }
        }

cookie案例


public class Book {
    private String id;
    private String name;
    private String price;
    private String author;
    private String description;
    setter 和getter方法,无参构造,全参构造 此处省略
   --------------------------   -------------  ------------------
//模拟数据
public class BookDB {
    
    private static Map<String,Book> books = new HashMap<String,Book>();
    static{
        books.put("1", new Book("1", "《呼啸山庄》", "10", "艾米莉·勃朗特", "与世隔绝的“呼啸山庄”"));
        books.put("2", new Book("2", "《雾都孤儿》", "20", "查尔斯·狄更斯", "勇敢地直面人生"));
        books.put("3", new Book("3", "《简·爱》", "20", "夏洛蒂·勃朗特", "爱情经典"));
        books.put("4", new Book("4", "《名利场》", "10", "萨克雷", "凡是有思想的人在"));
        books.put("5", new Book("5", "《理智与情感》", "10", "简·奥斯汀", "经典著作"));
    }
    public static Map<String,Book> findAllBooks(){
        return books;
    }
    public static Book findById(String bookId){
        return books.get(bookId);
    }
}
-----------------------------------------------------------------------
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ShowAllBooksServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        //显示所有的商品,提供查看详细内容的链接
        out.write("<h1>书</h1>");
        Map<String, Book> books = BookDB.findAllBooks();

        for(Map.Entry<String, Book>  b:books.entrySet()){
            out.write(b.getValue().getName()+"&nbsp;&nbsp;<a href='"+request.getContextPath()+"/ShowDetailsServlet?id="+b.getKey()+"' target='_blank'>浏览</a><br/>");
        }
        

        out.write("<hr/>您最近的浏览记录如下:<br/>");
        Cookie cs[] = request.getCookies();
        for(int i=0;cs!=null&&i<cs.length;i++){
            if("bookHistory".equals(cs[i].getName())){
                String value = cs[i].getValue();
                String ids[] = value.split("\\-");
                for(String id:ids){
                    out.write(BookDB.findById(id).getName()+"<br/>");
                }
                
                break;
            }
        }   
    }
----------------------------------------------------------------------
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        
        String id = request.getParameter("id");
        Book book = BookDB.findById(id);
        out.write(book.toString());
        //组织数据,向客户端写cookie 3条  
        String bookId = makeId(id,request);
        Cookie c = new Cookie("bookHistory", bookId);
        c.setPath(request.getContextPath());
        response.addCookie(c);
        
    }
    //组织数据
    

    //客户端的cookie                            当前访问的书的id           
    //cookie为null                               1               
    //cookie不为null,但没有bookHistory           1               
    //bookHistory=1                              2              
    
    
    private String makeId(String id, HttpServletRequest request) {
//      cookie为null                             1               bookHistory=1
        Cookie cs[] = request.getCookies();
        if(cs==null){
            return id;
        }
//      cookie不为null,但没有bookHistory         1               bookHistory=1
        Cookie bookHistoryCookie = null;
        for(Cookie c:cs){
            if("bookHistory".equals(c.getName())){
                bookHistoryCookie = c;
                break;
            }
        }
        if(bookHistoryCookie==null){
            return id;
        }

        
        String value = bookHistoryCookie.getValue();
        String ids[] = value.split("\\-");
        LinkedList<String> list = new LinkedList<String>(Arrays.asList(ids));
        
        if(list.size()<3){
            if(list.contains(id)){
                list.remove(id);
            }
        }else{
        

            if(list.contains(id)){
                list.remove(id);
            }else{
                list.removeLast();
            }
        }
        list.addFirst(id);
        
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<list.size();i++){
            if(i>0){
                sb.append("-");
            }
            sb.append(list.get(i));
        }
        
        return sb.toString();
    }

session对象

getSession()方法有两种重载形式

public HttpSession getSession();
public HttpSession getSession(Boolean  create);

HttpSession 常用方法

HttpSession是一个域对象
void setAttribute(String name,Object value);
Object getAttribute(String name);
void removeAttribute(String name);
String getId()
HttpSession request.getSession();

HttpSession request.getSession(boolean b):
b如果为true,和getSession()完全一样的
b为false,服务器只是查找,找不到不会创建新的,返回null。

HttpSession.invalidate();使HttpSession对象立即失效。

放入购物车

response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String id = request.getParameter("id");
        Book b = BookDB.findById(id);
        
        //放到HttpSession中用List来存
        HttpSession session = request.getSession();
        List<Book> cart = (List<Book>) session.getAttribute("commodity");
        if(cart==null){
            cart = new ArrayList<Book>();
            session.setAttribute("commodity", cart);
        }
    
        commodity.add(b);
        String url = request.getContextPath()+"/servlet/ShowAllBooksServlet";
        url = response.encodeURL(url);
        out.write(b.getName()+"已放入您的购物车<a href='"+url+"'>继续购物</a>");

-------------------------------------------------------------------------------

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        HttpSession session = request.getSession();
        List<Book> cart = (List<Book>)session.getAttribute("commodity");
        if(cart==null||cart.size()==0){
            out.write("您还没有购买任何商品");
            return;
        }
        
        out.write("<h1>你购买的商品如下</h1>");
        for(Book b:cart){
            out.write(b.getName()+"<br/>");
        }
    }

httpsession防止表单重复提交


String token = new BigInteger(165, new Random()).toString(36).toUpperCase();//GUID
        
        request.getSession().setAttribute("token", token);
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();


------------------------------------------------------------------------

        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String name = request.getParameter("name"); 
        String stoken = (String) request.getSession().getAttribute("token");
        String ftoken = request.getParameter("token");
        if(ftoken.equals(stoken)){
            System.out.println(name);
            request.getSession().removeAttribute("token");
        }else{
            out.write("请不要重复提交");
        }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 2.1 软件中的会话 一次会话: 打开浏览器 -> 访问一些服务器内容 -> 关闭浏览器 登录场景: 打开浏览器 ...
    yangliangliang阅读 3,003评论 0 0
  • 1课程回顾 Servlet编程 1)Servlet生命周期(重点) 构造方法:创建servlet对象。默认情况下,...
    守亭翁阅读 1,558评论 0 0
  • Web应用中的会话与会话状态 Web应用的会话状态是指Web服务器与浏览器在会话过程中产生的状态信息,借助会话状态...
    禅与发现的乐趣阅读 4,421评论 0 1
  • 我们平时书写的数字(比如12.85)、字符(比如'F')、字符串(比如"谢谢"),它们都属于“字面常量”。 有一些...
    今天庹阅读 1,468评论 0 2
  • 这个提示的意思是,同一个主机连接MySQL数据库的次数太多了,超过了预定义的次数,只需要执行以下 mysqladm...
    旋转马达阅读 2,507评论 0 0

友情链接更多精彩内容