会话

作者: 打死你的小乌龟 | 来源:发表于2018-09-07 16:57 被阅读0次

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("请不要重复提交");
        }

相关文章

  • 20171107 Tomcat(二)

    会话保持Tomcat ClusterTomcat实现会话粘滞Tomcat实现会话集群Tomcat实现会话服务器 一...

  • Tmux使用

    创建新会话 查看会话 连接已有会话 断开会话 会话中的窗口操作 前缀按键,默认为Ctrl + b,以下命令,先按前...

  • zk源码阅读21:会话管理SessionTrackerImp源码

    摘要 本节讲解会话,会话状态以及会话的创建,针对源码SessionTrackerImp进行展开,主要讲解 会话 客...

  • screen 常用命令

    查看所有的会话 创建一个会话 返回一个会话 删除一个会话 返回一个已经掉线(attached)的会话

  • JavaWebday04

    Cookie和Session 会话技术CookieSession 会话:一次会话中包含多次请求和响应。一次会话:浏...

  • 二维码扫描

    输入设备 输出设备 会话 预览图层 开启会话 导入框架 权限 输入设备 输出设备 会话 预览图层 开启会话

  • 变更支持

    一、查看当前会话 二、查看活动会话 三、查杀活动会话 查杀锁住某个object的所有会话(gv$locked_ob...

  • 「React Native」即时聊天-融云IM封装

    (一) 功能 在React Native封装了会话列表,支持跳转到会话详情,滑动删除,动态刷新会话列表等等。(会话...

  • day12_编码实战&Jsp基础

    1课程回顾 会话管理 1)会话管理:管理浏览器和服务器之间的会话过程中产生的会话数据 2)Cookie技术:会话数...

  • repeatable read下的 gap locks

    1、表结构 2、验证1 (主键索引 等值查询) 会话1 会话2 3、验证2 会话1 会话2(主键索引 区间区间)...

网友评论

      本文标题:会话

      本文链接:https://www.haomeiwen.com/subject/towcgftx.html