cookie免登陆

2019-10-26  本文已影响0人  _FireFly_

Session的管理机制

游泳馆
游泳馆肯定有储物柜(session)
1.储物柜本身是游泳馆的固定资产  
2.某一个具体的小柜子  也不属于某一个人  与人没有对应关系
    (无状态的)
3.小柜子一旦分配给了某一个人   形成一种对应关系   人不离开游泳馆
    关系一直存在(人通过某一个标识找到自己对应的柜子)
4.一旦我离开了  柜子就释放了
5.我的柜子  别人打不开


类比session对象的管理机制
1.session对象是服务器管理的
2.session对象应该不止一个
3.每一个人就一个session    管理者一个就够了   里面那个存储session对象的map一个就够了


服务器
里面应该有一个类   管理session对象的
public class SessionManager{//负责管理session  一个对象就够了
    //有一个集合  为了存储好多个session对象
    private static Map<String 标识,session> sessionMap = new HashMap();
    public static HttpSession getSession(String 标识){
        return sessionMap.get(标识);
    }
}
public class HttpSession{//一个小柜子  好多个对象
    //还有一个集合  小柜子里面的储物格
    private Map<String,Object> attributeMap = new HashMap();
    
    public void setAttribute(String key,Object value){
        attributeMap.put(key,value);
    }
    public Object getAttribute(String key){
        return attributeMap.get(key);
    }
}

//如果想要使用session对象
HttpSession session = SessionManager.getSession("标识");
session.setAttribute("key",objcet);

Object value = session.getAttribute("key");


通过刚才的了解
1.session对象是服务器管理的(session对象存储在服务器端)
2.session对象是无状态的(每一个session对象与浏览器不存在直接的对应关系)
3.session需要一个标识来寻找
    标识是谁分配的?    服务器
    标识长成什么样?    是一个String(唯一)
    标识存储在哪里?    存储在浏览器端的
    什么时候存进去的?   标识是服务器分配的   需要存储在浏览器端
            服务器需要将标识传递给浏览器
            服务器在第一次给浏览器回写响应的时候带回来的  (标识)
    标识具体存储在哪里?  Cookie(执行时是一个对象  key value)  可以永久的存储在文件中

    0.服务器需要先启动(携带着项目-->有好多资源Servlet JSP Filter)
    1.浏览器主动发送请求(第一次请求时没有标识)
    2.服务器解析请求 根据请求找资源 响应信息给回浏览器的时候String
        第一次给予响应信息<html>图片 按钮 表格</html>  +  标识
    3.浏览器需要解析回来的响应信息
        String(展示+标识)   标识存起来(以后每一次请求都带着)

====================================================

Cookie
单词翻译过来    小甜品  小点心  小饼干
互联网领域中    小量信息

刚开始建立网站的时候     不需要好多人来浏览   没有互联网
随着Internet服务的发展  简历很多网路端的服务器
访问者需要更频繁的与互联网中的服务进行交互
需要让访问者与服务器保持一种持续的连接状态
这时候才产生了Cookie对象
1993年   网景公司   Lou Montulli工程师
为了让用户在访问某个网站时,提高速度,保存信息和状态
cookie是一个浏览器端的对象
对象形态是  key-value形式的


Session对象的管理机制
    两个类   一个类负责管理session   一个类负责session对象中的存储
    session对象是每一个人一个的
    session对象本身有好多个
    session对象是无状态的  服务器进行分配
    每一个浏览器第一次访问服务器的时候   
    服务器在第一次给响应的时候 分配一个session的标识    JSESSIONID   String
    JSESSIONID存在浏览器中的cookie里    cookie("JSESSONID","随机")

浏览器从第二次开始 发送请求都会带着这个cookie对象
每一次都能找到属于自己的那个session对象了

知识回顾
Cookie
1.浏览器端存储的一个对象 Cookie("key","value")
2.cookie是服务器在响应的时候回写回来的数据
JSESSIONID=
3.响应信息的时候携带cookie
服务端解析cookie 获取里面的信息
Cookie c = new Cookie("","");
response.addCookie(c);
下一次发送请求会自动携带着cookie的信息
服务端 Cookie[] = request.getCookies();
cookie.getName(); cookie.getValue();
cookie.setMaxAge(int);设置cookie的失效时间
Cookie是一个类 很多属性 maxAge属性 默认值是-1
-1默认指的是当前会话结束时就消失了(临时)
如果想要让cookie永久性的保存起来(浏览器文件中cookies)
自己设置setMaxAge(int 秒)
C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default
cookies文件
4.浏览器端如何解析cookie的信息
通过JavaScript
(String)var cookieObject = document.cookie;
k1=v1;k2=v2;k3=v3
split()
5.实现一个小demo用户免登录


index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <%--<%--%>
    <%--Cookie testCookie1 = new Cookie("test1","testValue1");--%>
    <%--Cookie testCookie2 = new Cookie("test2","testValue2");--%>
    <%--response.addCookie(testCookie1);--%>
    <%--response.addCookie(testCookie2);--%>
  <%--%>--%>
  <%--<body>--%>
    <%--<a href="test?param=paramValue">点我呀</a>--%>
  <%--</body>--%>

  <%
    Cookie[] cookies = request.getCookies();
    if(cookies!=null && cookies.length>1){
      request.getRequestDispatcher("login").forward(request,response);
    }
  %>
  <body>
    <form action="login" method="post">
      账号:<input type="text" name="uname" value=""><br>
      密码:<input type="password" name="upass" value=""><br>
      <input type="checkbox" name="flag" value="true">7日内免登录<br>
      <input type="submit" value="登录"><br>
    </form>
  </body>
</html>

welcome.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <%--<script type="text/javascript">--%>
            <%--window.onload = function(){--%>
                <%--var cookieObject = document.cookie;--%>
                <%--//  String类型的   k1=v1;k2=v2--%>
                <%--alert(cookieObject);--%>
                <%--var cookieMessage = cookieObject.split(";");//[k1=v1,k2=v2]--%>
                <%--for(var i=0;i<cookieMessage.length;i++){--%>
                    <%--var kv = cookieMessage[i].split("=");//[k1,v1]  [k2,v2]--%>
                    <%--alert(kv[0]+"---"+kv[1]);--%>
                <%--}--%>
            <%--}--%>
        <%--</script>--%>
    </head>
    <body>
        ${cookie.uname.value}
        我是welcome资源信息
    </body>
</html>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>controller.TestCookieController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>controller.LoginController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
</web-app>

LoginController

package controller;

import service.UserService;

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 java.io.IOException;

public class LoginController extends HttpServlet {

    private UserService service = new UserService();

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //处理字符集
        request.setCharacterEncoding("UTF-8");
        //接收请求传递的参数
        String uname = request.getParameter("uname");
        String upass = request.getParameter("upass");
        //如果参数没有接收到  去cookie找
        if(uname==null && upass==null){
            Cookie[] cookies = request.getCookies();
            for(Cookie cookie : cookies){
                if(cookie.getName().equals("uname")){
                    uname = cookie.getValue();
                }
                if(cookie.getName().equals("upass")){
                    upass = cookie.getValue();
                }
            }
        }
        //调用业务方法执行登录判断
        String result = service.login(uname,upass);
        //根据结果转发
        if(result.equals("登录成功")){
            //如果用户勾选了 7日免登录 需要将账号密码存入cookie
            String[] values = request.getParameterValues("flag");
            if(values!=null && values.length>=0){
                Cookie nameCookie = new Cookie("uname",uname);
                Cookie passCookie = new Cookie("upass",upass);
                nameCookie.setMaxAge(20);//设置7天
                passCookie.setMaxAge(20);
                response.addCookie(nameCookie);
                response.addCookie(passCookie);
            }
            request.getRequestDispatcher("welcome.jsp").forward(request,response);
        }else{
            request.getRequestDispatcher("index.jsp").forward(request,response);
        }
    }
}

TestCookieController

package controller;

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 java.io.IOException;

public class TestCookieController extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //第二次请求到达服务器
        //服务器中的一个Controller类资源中进行cookie信息的操作
        String param = request.getParameter("param");
        System.out.println("参数:"+param);
        //获取cookie
        Cookie[] cookies = request.getCookies();
        for(Cookie cookie : cookies){
            String name = cookie.getName();
            String value = cookie.getValue();
            System.out.println(name+"-------"+value);
        }
        //服务器给予响应
        request.getRequestDispatcher("welcome.jsp").forward(request,response);
    }
}

UserService

package service;
public class UserService {

    public String login(String uname,String upass){
        if(uname.equals("zzt")&&upass.equals("123")){
            return "登录成功";
        }
        return "账号或密码错误";
    }
}

上一篇 下一篇

猜你喜欢

热点阅读