cookie免登陆
Session的管理机制
-
1.Tomcat WEB容器
2.Servlet JSP(编译+EL+JSTL) Filter Listener (文件上传与下载 外部jar包)
3.配置web.xml文件
4.XML文件的解析
域对象的特点
--->浏览器发送请求
request 到达Tomcat 解析(请求名 携带参数) (new Request对象)
Java中的原生管理方式 每次都new 没有引用指向被GC回收*session 一次会话 周期是在浏览器和服务器没有断线的过程中
每一个人拥有一个(特点一定是通过编码来实现的)
session.setAttribute("key",object);
session.getAttribute();application 全局(上下文)的对象 特点大家公用
Java中的单例管理方式 或者类中static元素
游泳馆
游泳馆肯定有储物柜(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 "账号或密码错误";
}
}