Cookie学习:
对于浏览器和服务器的交互模式,以及请求的处理都有了理解,并且也能够进行请求的处理。围绕整个流程再次进行技术优化,重点学习 Cookie 技术,此技术的应用面是非常广的。
问题:
HTTP是无状态,无连接的,在一次请求结束后,相关数据会被销毁。那么第二次请求需要使用相同的数据要怎么办呢?
使用cookie技术在浏览器端存储信息
解释:
Cookie 技术其实是浏览器端的数据存储技术,解决了同一个工程下不同请求
需要使用相同的请求数据的问题。我们把请求需要共享的请求数据,存储在浏览器端,避免用户进行重复的书写请求数据。但是哪些数据需要使用 Cookie 技术存储起来是一个主观问题,需要在后台进行响应的时候来告诉浏览器,有些数据其他请求还会使用
作用:Cookie 技术解决不同请求发送之间的数据共享问题。
登陆页面,重定向
package com.serlvet;
import com.pojo.User;
import com.service.UserServieImpl;
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;
import java.net.URLEncoder;
public class LoginServlet extends HttpServlet {
UserServieImpl usi;
public LoginServlet(){
usi = new UserServieImpl();
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
String uname =req.getParameter("uname");
String pwd =req.getParameter("pwd");
//调用service
User user = usi.login(uname,pwd);
if(user != null){
System.out.println("登录了");
//创建Cookie对象
// Cookie c = new Cookie("user", user.getUname());
//旧版本web中cookie是中文的时候要进行url传输编码处理URLEncoder.encode(user.getUname(),"utf-8")
Cookie c = new Cookie("user", URLEncoder.encode(user.getUname(),"utf-8"));
Cookie c2 = new Cookie("pwd",user.getPwd());
//重定向,跳转页面
resp.addCookie(c);//把Cookie对象放入resp对象,响应到浏览器
resp.addCookie(c2);//把Cookie对象放入resp对象,响应到浏览器
resp.sendRedirect("Success");
}else{
resp.getWriter().write("<font color='red'>用户或密码有误!</font>");
}
}
}
Cookie工作原理:用于解决不同请求之间的数据共享
- 浏览器端第一次返送请求到服务器
- 服务器端创建cookie,包含用户信息,将cookie发送到浏览器端
- 浏览器再次访问服务器时携带数据cookie
- 服务器通过cookie携带的数据来区分用户
重定向页面,检验cookie数据来区分用户
package com.serlvet;
import com.pojo.User;
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;
import java.net.URLDecoder;
public class Success extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
Cookie[] cookies = req.getCookies();
String value =null;
String pwd =null;
for(Cookie c:cookies){
if(c.getName().equals("user")){
// value = c.getValue();
//解码url传输的数据
value = URLDecoder.decode(c.getValue(),"utf-8");
}
if(c.getName().equals("pwd")){
pwd = c.getValue();
}
}
resp.getWriter().write("欢迎"+value+"登录,XX管理系统");
resp.getWriter().write(pwd);
}
}
Cookie 数据存储:
临时存储:
不设置 cookie 信息的存储时间,周期为一次会话,存储在浏览器的运行内存中,关闭浏览器即失效了
默认是临时存储:默认cookie存储之后,每次请求都会附带,除非设置有效路径
cookie设置请求路径:
Cookie c = new Cookie("user", URLEncoder.encode(user.getUname(),"utf-8"));
Cookie c2 = new Cookie("pwd",user.getPwd());
c2.setPath("/SecondWeb/Success");//设置携带cookie请求的路径,就会仅仅在访问设置的路径才携带此cookie
c1.setPath("/SecondWeb/Success");
定时存储:
设置存储时间,周期为时间设置,存储在用户电脑硬盘中。在有效期内符合路径要求的请求都会附带该信息。
c1.setMaxAge(10);//给Cookie c2设置有效时间,单位是秒
c2.setMaxAge(10);//给Cookie c2设置有效时间,单位是秒
Servlet的注解配置uri
@WebServlet(name = "MyServlet",urlPatterns = "/MyServlet")
等同于web.xml中的以下配置:
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.serlvet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
Cookie中存储中文的问题
一般来说用Cookie来保存信息的时候是不能带有中文的,但是有时候必须要用到中文的时候该怎么办呢?
注意 当Cookie里面要存中文字符的时候也需要设置编码格式
存:
Cookie c = new Cookie("uname",URLEncoder.encode(u.getName(), "utf-8"));
取:
String name = URLDecoder.decode(c[0].getValue(), "UTF-8");
存的时候按照编码格式存
URLEncoder.encode(name,“UTF-8”)
取的时候照样要设置编码格式
URLDecoder.decode(name,“UTF-8”)才能转换成中文字符
Session学习:
Cookie 解决了发送不同请求的数据共享问题。Cookie 是浏览器端的数据存储技术,而session 则是服务器端的存储技术。
使用session技术在浏览器端存储信息
用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建一个 session 对象(一但创建,就会有一个 JSESSIONID),用来存储用户请求处理相关的公共数据,并将
此 session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中(临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后,调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其对应的 session 对象(解析 JSESSIONID并通过 JSESSIONID找对应Session的是服务器底层来完成)。
特点: Session 技术是依赖 Cookie 技术的服务器端的数据存储技术。
- 由服务器进行创建
- 每个用户独立拥有一个 session 存储和获取数据
存储:session.setAttribute(String name,Object value);
获取:session.getAttribute(String name) 返回的数据类型为Object
注意:
存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。
使用时机:
一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。
默认存储时间为 30 分钟
作用:
解决了一个用户的不同请求的数据共享问题。
注意:
只要不关闭浏览器,并且 session 不失效的情况下,同一个用户的任意请求在项目的任意 Servlet 中获取到的都是同一个 session对象
作用域:一次会话(一个工程内的不同请求,到关闭浏览器)
session登陆页面
package com.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@javax.servlet.annotation.WebServlet(name = "ServletA",urlPatterns = "/ServletA")
public class ServletA extends javax.servlet.http.HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
String a = req.getParameter("a");
String b = req.getParameter("b");
//创建Session对象
HttpSession session = req.getSession(); //如果服务器中没有sesssion就创建一个新的session,如果有,就获取已经存在的session
//把a的值放入session
session.setAttribute("a",a);
session.setAttribute("b",b);
}
}
重定向页面,用来区分不同用户
package com.servlet;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "ServletB",urlPatterns = "/ServletB")
public class ServletB extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取session对象
HttpSession session = req.getSession();
String a = (String)session.getAttribute("a");
String b = (String)session.getAttribute("b");
resp.getWriter().println("通过session取到a的值:"+a);
resp.getWriter().println("通过session取到b的值:"+b);
}
}
设置存储时间
session.setMaxInactiveInterval(int seconds);//单位是秒
销毁session对象
session.invalidate();
总结:
Cookie储存在浏览器端,保存的是字符串,cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的
Session
存储在服务器端,保存的是对象,Session依赖Cookie,session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到,session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户
上下文:也叫做“公共区域”,也就是同一个WEB应用程序(项目)中,所有的Servlet和JSP都可以共享同一个区域