zoukankan      html  css  js  c++  java
  • Java Web之Cookie、Session

      讲Cookie和Seesion之前,先讲一下HTTP连接其实是无序的,服务器不知道是谁在访问它。现在我们来实现一个简单的邮箱功能。

    要求:

    1.登录页面登录之后看到收件箱和欢迎我

    2.点击收件箱看到几封邮件和欢迎我

    3.点击一封邮件显示邮件内容和欢迎我

    我们先来用Servlet实现一下试试

    首先,写一个HTML 叫login,代码如下

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h3>注册页面</h3>
    <form action="/param/login" method="post">
        账号:<input type="text" name="userName" value="默认值" required><br/>   <!--required是Html5的新特性,在以前必填字段我们需要通过js来判断,现在html5实现!-->
        密码:<input type="password" name="passWord"><br/>
        <input type="submit" value="登录"/>
    </form>
    </body>
    </html>

    然后我们的Servlet有三个,分别是

    1.登录的LoginServlet

    2.收件箱列表的ListServlet

    3.邮件内容的GetServlet

    代码分别如下:

    package main.com.vae.Param;
    
    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 java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/param/login")
    public class LoginServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out=resp.getWriter();
            //=============上面三行代码几乎是固定的
            String name=req.getParameter("userName");
            out.println("欢迎你:"+name+"</br>");
            out.println("<a href='/param/list?userName="+name+"'>收件箱</a>");
    
    
        }
    }
    package main.com.vae.Param;
    
    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 java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/param/list")
    public class ListServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out=resp.getWriter();
            //=============上面三行代码几乎是固定的
            String name=req.getParameter("userName");
            out.println("欢迎你:"+name+"</br>");
            for (int i = 0; i < 6; i++) {
                out.println("<a href='/param/get?userName="+name+"'>一封邮件</a><br>");
            }
    
    
    
        }
    }
    package main.com.vae.Param;
    
    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 java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/param/get")
    public class GetServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out=resp.getWriter();
            //=============上面三行代码几乎是固定的
            String name=req.getParameter("userName");
            out.println("欢迎你:"+name+"</br>");
            out.println("本封邮件的内容是:蜀云泉,你真帅啊");
    
        }
    }

    看看效果,还是不错的

     但是有一个问题啊,因为我写的是  <a href='/param/get?userName="+name+"'>  只有这样才能传我的名字过去,写在了请求头里面这样就显示在浏览器的url里面了啊

    这样是不行的,我的名字暴露了,以后还有其他字段密码,手机号,住址什么的。。。这样肯定不行。所以,我们本篇文章的主人公,cookie和seesion该出场了。

    Cookie

     什么是Cookie呢?

    我们用Cookie来实现一下上面的例子,把登录页面里面的action改一下

     然后改一下我们的三个Servlet,直接贴代码吧

    package main.com.vae.Cookie;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    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.io.PrintWriter;
    
    @WebServlet("/cookie/login")
    public class LoginServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out=resp.getWriter();
            //=============上面三行代码几乎是固定的
            String name=req.getParameter("userName");
    
            //使用Cookie技术
            Cookie cookie=new Cookie("userName",name); //创建Cookie
            resp.addCookie(cookie);   //把Cookie响应给浏览器
    
            out.println("欢迎你:"+name+"</br>");
            out.println("<a href='/cookie/list'>收件箱</a>");
    
    
        }
    }
    package main.com.vae.Cookie;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    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.io.PrintWriter;
    
    @WebServlet("/cookie/list")
    public class ListServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out=resp.getWriter();
            //=============上面三行代码几乎是固定的
            String userName="";
            //获取多个Cookie
            Cookie[] cookies=req.getCookies();
            for (Cookie cookie : cookies) {
                String name=cookie.getName();
                String value=cookie.getValue();
    
                if ("userName".equals(name)){
                    userName=value;
                }
    
            }
    
            out.println("欢迎你:"+userName+"</br>");
            for (int i = 0; i < 6; i++) {
                out.println("<a href='/cookie/get'>一封邮件</a><br>");
            }
    
    
    
        }
    }
    package main.com.vae.Cookie;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    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.io.PrintWriter;
    
    @WebServlet("/cookie/get")
    public class GetServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out=resp.getWriter();
            //=============上面三行代码几乎是固定的
            String userName="";
    
            Cookie[] cookies=req.getCookies();
            for (Cookie cookie : cookies) {
                String name=cookie.getName();
                String value=cookie.getValue();
    
                if ("userName".equals(name)){
                    userName=value;
                }
    
            }
    
            out.println("欢迎你:"+userName+"</br>");
            out.println("本封邮件的内容是:蜀云泉,你真帅啊");
    
        }
    }

    运行一下看看结果。完美的解决了上面的问题。

     

     Cookie的详细介绍

     以下7点都得掌握,其中第4点,cookie中文乱码的问题,Tomcat8.5版本之后,Cookie已经支持了中文了,8.5版本之前的不支持,需要自己手动的编码解码一下

    第6点是最重要的,Cookie分为会话Cookie和持久化Cookie,这两个需要好好了解。

     

     可以自己去尝试,设定一个Cookie的存活时间为15秒,可以刷新页面试试,15秒之后就没有名字了。这个可以做免登陆的事情。

     

    Cookie的domain,如果修改了资源名称,Cookie就不认识了,所以必须设置domain,cookie.setPath("/")

     

    Cookie的缺陷:

    Session

    Session其实就是一个会话Cookie,关了浏览器之后啥都没有了,属于服务器端技术.

    网上大把的以会员卡为例子介绍Cooklie和Session的,我就不介绍了,Session技术服务器端会给你一个ID的,我们可以在浏览器里面看到

     Session的一些操作:

      //使用Session技术
            HttpSession session=req.getSession(); //创建Session
            session.setAttribute("name",name);   //设置Session的值,Session是默认响应给浏览器的
            //获取Session的值
            HttpSession session=req.getSession();
            userName=(String) session.getAttribute("name");

    我们可以把上面的图书馆的例子修改一下,结果还是OK的,可以显示我许嵩的名字

    Session细节

    不知道发现了一个事情没,Cookie我们是可以接收多个参数的,Session其实也是可以的。

    Session和Cookie的一个区别就是,Cookie都是String类型的参数,而Session的key是String类型的,value是Object类型的。

    这样我们在设置value值的时候,其实是可以传入一个类类型的,也就是Model,我们现在写一个User类,来看看

    package main.com.vae.Session;
    
    
    public class User {
        private String userName;
        private String passWord;
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public String getPassWord() {
            return passWord;
        }
    
        public void setPassWord(String passWord) {
            this.passWord = passWord;
        }
    }
    package main.com.vae.Session;
    
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.*;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/Session/login")
    public class LoginServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out=resp.getWriter();
            //=============上面三行代码几乎是固定的
            String name=req.getParameter("userName");
            String passWord=req.getParameter("passWord");
    
            User user=new User();
            user.setUserName(name);
            user.setPassWord(passWord);
            //使用Session技术
            HttpSession session=req.getSession(); //创建Session
            session.setAttribute("USER_IN_SESSION",user);   //设置Session的值,Session是默认响应给浏览器的
    
            out.println("欢迎你:"+name+"</br>");
            out.println("<a href='/Session/list'>收件箱</a>");
    
    
        }
    }
    package main.com.vae.Session;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.*;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/Session/list")
    public class ListServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out=resp.getWriter();
            //=============上面三行代码几乎是固定的
            String userName="";
            //获取Session的值
            HttpSession session=req.getSession();
            User user =(User) session.getAttribute("USER_IN_SESSION");
    //        for (Cookie cookie : cookies) {
    //            String name=cookie.getName();
    //            String value=cookie.getValue();
    //
    //            if ("userName".equals(name)){
    //                userName=value;
    //            }
    //
    //        }
    
            out.println("欢迎你:"+user.getUserName()+"</br>");
            for (int i = 0; i < 6; i++) {
                out.println("<a href='/Session/get'>一封邮件</a><br>");
            }
    
    
    
        }
    }
    package main.com.vae.Session;
    
    
    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;
    import java.io.PrintWriter;
    
    @WebServlet("/Session/get")
    public class GetServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out=resp.getWriter();
            //=============上面三行代码几乎是固定的
            String userName="";
            HttpSession session=req.getSession();
            User user =(User) session.getAttribute("USER_IN_SESSION");
    
            out.println("欢迎你:"+user.getUserName()+"</br>");
            out.println("本封邮件的内容是:蜀云泉,你真帅啊");
    
        }
    }

    就是这样的,再次重启Tomcat,结果也是OK的

    Session的删除

     

    Session的超时管理

     session.setMaxInactiveInterval(15);

    Session的URL重写

    当浏览器禁用Cookie之后,Cookie和Session都是不能再使用的。所以想要实现数据的共享,我们只能在跳转链接加上Session的ID,就是一串数字。但是这样很蠢,又在浏览器上的URL框里显示了。所以有一个Response.EncodeURL,使用这个可以自动的帮助我们加上Session的ID。但是一般是没有人关闭Cookie的,关闭了之后会很麻烦。所以一般的做法是监测用户的浏览器是否关闭了Cookie,如果禁用了Cookie那么就提醒开启。

  • 相关阅读:
    Install the Maven in your computer
    《李嘉诚全传》--孙良珠
    Crystal Reports 2008(水晶报表) 第一个报表
    《唤醒心中的巨人》--[美]安东尼·罗宾
    《写给女人》--[美]桃乐丝·卡耐基
    Crystal Reports 2008(水晶报表) JDBC连接mysql数据库
    Crystal Reports 2008(水晶报表) 启动时检查更新
    Crystal Reports 2008(水晶报表) 安装
    《百年孤独》--[哥伦比亚]加夫列尔·加西亚·马尔克斯
    《自己拯救自己》--[英]塞缪尔·斯迈尔斯
  • 原文地址:https://www.cnblogs.com/yunquan/p/10217197.html
Copyright © 2011-2022 走看看