Servlet学习(3)之cookie和session

  1. jsp概念:Java Server Page Java 服务页面。
    特点:即能写HTML CSS JS 他还能写 Java代码。
    作用:简化页面的书写。
    jsp的本质是servlet。
    在这里插入图片描述

  2. 在jsp上使用特定的语法编写java的代码

    早期脚本(不推荐大量使用)
    1.<%----%> 注释
    2.<%!   %> java代码的成员位置
    3.<%    %> 在servlet的service的方法中(在后台展示)
    4.<%="abc"%> 生成的代码在 prinlt("abc")(在前台展示)
    

    存放的java和.class文件在开启服务器后的提示:
    在这里插入图片描述

  3. 刷新头(三秒跳转)

    案例2-当我们登录失败,提示"用户名密码不匹配",3秒以后跳转到登录页面
    技术分析:
    	定时刷新
    常见的响应头-refresh
    	响应头格式:
    		refresh:秒数;url=跳转的路径
    	设置响应头:
    		response.setHeader(String key,String value);设置字符串形式的响应头
    		response.addHeader(String key,String value);追加响应头, 若之前设置设置过这个头,则追加;若没有设置过,则设置
    	设置定时刷新:
    		response.setHeader("refresh","3;url=/day0901/login.htm");
    步骤分析:
    	登录失败之后,修改业务逻辑
    		打印之后添加一个头信息即可
    
  4. 会话技术:解决客户端和服务端的数据共享问题,因为http协议是一种无状态协议(不会记录上次访问的记录),所以通过会话数据,实现多次数据的共享。

    1. 会话:***是服务器与客户端浏览器之间建立起来的一次通信,在这一个通信中实现一次或者多次请求或者响应,实现服务器和客服端的数据之间的共享。***

    2. 客户端会话技术(cookie):将数据保存在浏览器(服务端),可以减轻服务器的压力,数据不安全

      1. 原理:浏览器第一次请求服务器,服务器第一次响应会给一个set-cookie头+数据,把数据交给浏览器保存,浏览器第二次请求服务器,会带上数据通过cookie请求头带给服务器,服务器端可以取数据出来用。
        在这里插入图片描述

      2. 代码展示:
        第一个servlet给浏览器客户端发一个cookie的数据

        public class cookieServlet1 extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                //创建cookie
                Cookie cookie = new Cookie("key", "value");
                //发送cookie
                response.addCookie(cookie);
            }
        

        第二个servlet获取浏览器客户端中的cookie中的数据

        @WebServlet(name = "CookieServlet2",value = "/demo2")
        public class CookieServlet2 extends HttpServlet {
            protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                Cookie[] cookies = request.getCookies();
                 //判断cookie是否为空
                if (cookies != null) {
                //遍历cookies数组
                for (Cookie cookie : cookies) {
                    //获取cookie的键
                    String name = cookie.getName();
                    //判断cookie的键
                    if (name.equalsIgnoreCase("key")){
                        //获取cookie中的数据
                        String value = cookie.getValue();
                        System.out.println(value);
                    }
                }
            }
        }
        
      3. cookie的注意事项:

        1. 持久性问题:默认情况下,cookie中的数据是保存在浏览器的缓存中,浏览器关闭时,内存释放,cookie中的数据就没有了,处理方法:设置cookie保存数据的事件

          在客户端设置存放cookie的时间
              protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                  //创建cookie
                  Cookie cookie = new Cookie("key", "value");
                  //设置cookie存活的时间,以秒为单位
                  cookie.setMaxAge(60*60);//这是存放一小时
                  //-1是默认值,直接保存在客户端,0是清除cookie,不允许存放cookie
                  cookie.setMaxAge(-1/0)
                  //在请求头中添加cookie
                  response.addCookie(cookie);
              }
          

          清除cookie

          代码展示:

              protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
                  //设置与客户端的数据要一致
                  Cookie cookie = new Cookie("key", "value");
                  //设置cookie存放的时间为0
                  cookie.setMaxAge(0);
                  //发送回去
                  response.addCookie(cookie);
              }
          
        2. 不能跨浏览器进行操作

        3. cookie以前不支持中文,现在cookie可以直接存储中文,不需要进行编解码的操作
          get请求中有提交的方式是通过(URLdecoder解码,URLencoder编码)

          public class Demo {
              public static void main(String[] args) throws UnsupportedEncodingException {
                  String name="张三";
                  //编码,参1为需要编码的字符串,参2为编码规则
                  String bmname = URLEncoder.encode(name, "utf-8");
                  System.out.println(bmname);
                  //解码,参1为需要解码的字符串,参2为编码规则
                  String jmname = URLDecoder.decode(bmname, "utf-8");
                  System.out.println(jmname);
              }
          }
          
    3. 服务端会话技术(Session):将数据存放在服务端(数据有保障,但会增加服务器的压力)

      1. 将数据存储在服务器端

      2. 原理:session依赖于cookie存在
        在这里插入图片描述

      3. Java实现Session:
        //1.获取session
        HttpSession session = request.getSession();
        //2.存储数据
        session.setAttribute(“msg”, “hehe”);
        //3.获取数据
        Object msg = session.getAttribute(“msg”);

      4. session细节:

        1. 浏览器关闭了,session不一样了。

          1. Cookie没了。jsessionid没了。

          2. 服务器关闭了,session一样吗?不一样。内存释放了。

            优化:虽然对象不一样了,但是session中存储的数据还是一样的

            • 钝化:服务器正常关闭后,session对象被写入硬盘的文件中
            • 活化:服务器开启后,将文件还原为内存的session对象
        2. session的生命周期

          • 创建:
            request.getSession():
            会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
          • 销毁:
            1. 服务器关闭
            2. session超时
            3. invalidate() :session自杀,处理安全退出。
             <session-config>
             	<session-timeout>30</session-timeout>
             </session-config>
     3.如果客户端禁用了 cookie,session该如何自处?
     客户端禁用了cookie,session将不一样。
     URL重写:http://localhost:8080/day09/s1;jsessionid=731DED0DC4F0AA06CDBB815733D4043E
 
         	PrintWriter pw = response.getWriter();
         	HttpSession session = request.getSession();
         	String id = session.getId();
         
         	String href = "/day09/s1";
         	href = response.encodeRedirectURL(href);
         	System.out.println(href);
         	pw.write("<a href='"+href+"'>s1</a>");
4.获取session:
         	getSession():会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
         	getSession(boolean flag):
         		true:默认值,会根id值查找是否存在sesison对象,如果没找到,则创建新的session
         		false:会根据jsessionid值查找是否存在sesison对象,如果没找到,则返回null
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值