目录
代码模板
Cookie的基本使用
概念
Cookie的API
public Cookie(String name, String value)
发送Cookie对象到客户端:使用response对象
创建Cookie对象并响应给浏览器
Cookie的使用细节
1.持久化Cookie
Session的基本使用
概念
获取Session对象,使用request对象
存储数据到session域中
根据key,获取值
根据key,删除键值对
Session的原理
代码模板
我们发现重复写一个代码很繁琐,我们可以i设置一个代码模板
写一个组名
在组名中添加
写完代码模板之后,要点击define选择代码类型,正确会变成change
成功
Cookie的基本使用
概念
客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问
Cookie是创建服务器端,存在于浏览器端
好处:减轻服务端压力
弊端:不安全,一旦清空浏览器数据,这些Cookie数据就会被清除
Cookie的API
public Cookie(String name, String value)
创建Cookie对象,并设置数据
Cookie cookie=new Cookie("key","value");
发送Cookie对象到客户端:使用response对象
reponse.addCookie(cookie);
创建Cookie对象并响应给浏览器
步骤:
1.创建Cookie对象
//name值是唯一的,如果name值一致,后出现的value会覆盖之前的value2.把Cookie对象发送到浏览器
@WebServlet("/cookieServlet1") public class cookieServlet1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建Cookie对象 //name值是唯一的,如果name值一致,后出现的value会覆盖之前的value Cookie cookie = new Cookie("msg", "赫赫"); //把Cookie对象发送到浏览器 response.addCookie(cookie); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
查看
在服务器后端获取Cookie对象 Cookie[]cookies=requset.getCookies();
@WebServlet("/cookieServlet2") public class cookieServlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //取出请求中的所有Cookie对象 Cookie[] cookies = request.getCookies(); //遍历cookies for (Cookie cookie : cookies) { //获取cookie对象的name String name = cookie.getName(); //获取cookie的value String value = cookie.getValue(); System.out.println(name+"----"+value); } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
结果:
Cookie的使用细节
1.持久化Cookie
cookie默认是会话级别的,会话结束(关闭浏览器),cookie消失,再次打开浏览器cookie就会不存在 。在开发中会话级别的cookie无法达到长时间共享数据
因此我们要使用持久化Cookie
持久化Cookie就是要使用Cooki类的方法
void setMaxAge(int expiry) 单位是秒
测试
@WebServlet("/cookieServlet3") public class cookieServlet3 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建cookie Cookie cookie = new Cookie("username", "hh"); //设置持久化cookie cookie.setMaxAge(60*60*24);//一天 //响应给cookie response.addCookie(cookie); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
2.cookie存储特殊字符
1.如果向cookie中存储特殊字符,如果存放就会报错,消息 Cookie值中存在无效字符[32] 描述 服务器遇到一个意外的情况,阻止它完成请求。
2.如果想向cookie中存储特殊字符需要对特殊符号进行编码和解码
存储
@WebServlet("/cookieServlet4") public class cookieServlet4 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String value="hh aa";//空格是特殊字符 //直接响应给浏览器会报错 消息 Cookie值中存在无效字符[32] 描述 服务器遇到一个意外的情况,阻止它完成请求。 //所以设置编码 String encode = URLEncoder.encode(value, "utf-8"); //创建Cookie Cookie cookie = new Cookie("msg", encode); response.addCookie(cookie); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
读取
@WebServlet("/cookieServlet5") public class cookieServlet5 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取Cookie对象 Cookie[] cookies = request.getCookies(); for (Cookie cookie : cookies) { if("msg".equals(cookie.getName())){ //取值 String value = cookie.getValue(); //解码 String decode = URLDecoder.decode(value, "utf-8"); System.out.println("decode="+decode);//decode=hh aa } } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Session的基本使用
概念
服务器会话跟踪技术:创建于服务器,将数据存储到服务端
Session是将数据存储到服务端,而Cookie是将数据存储到客户端
存储在客户端的数据容易被窃取
存储在服务端的数据更安全
获取Session对象,使用request对象
HttpSession session=request.getSession();//如果第一次执行就是创建session对象,如果不是第一次执行就是获取session
HttpSession session=request.getSession(boolean create);//如果是true,跟无参一样,如果是false表示如果存在session就获取,如果不存在就不创建session,就返回null;
Session对象提供的功能:Session也是域对象,只要再一次会话过程中多次请求都可以共享seesion中的数据
存储数据到session域中
void setAttribute(String name,object c);
根据key,获取值
Object getAttribute(String name);
根据key,删除键值对
void removeAttribute(String name)
测试
@WebServlet("/sessionServlet1") public class sessionServlet1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取Session HttpSession session = request.getSession();//没有seesion就创建,有就获取 //存储数据 session.setAttribute("msg","session"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
@WebServlet("/sessionServlet2") public class sessionServlet2 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取session HttpSession session = request.getSession(); //取出数据 Object msg = session.getAttribute("msg"); System.out.println(msg);//session } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Session的原理
tomcat服务器会为每个浏览器(访问的Servlet创建Session)创建一个session容器,那么每个session容器该怎么区分?
tomcat创建session容器之后会为每个seesion容器添加一个唯一的标识,这个标识JSESSIONID 并使用该标识来区分seesion容器
由于tomcat服务器存在多个session容器,那么对于浏览器甲来说,第二次访问tomcat服务器的时候,怎么找到自己的容器?
其实tomcat在第一次为浏览器创建session容器的时候同时会创建一个会话Cookie,将session容器的唯一标识JSESSIONID存放到cookie中,然后将会话级别的cookie存放到浏览器中,当下次访问tomcat服务器时携带cookie,并在tomcat中取出cookie中的JSESESSION的值,进行比对查找找到自己创建的容器,然后再取出存储的数据