Java Web之Cookie、Session

 

 

  讲Cookie和Seesion以前,先讲一下HTTP链接实际上是无序的,服务器不知道是谁在访问它。如今咱们来实现一个简单的邮箱功能。html

要求:html5

1.登陆页面登陆以后看到收件箱和欢迎我java

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

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

 

咱们先来用Servlet实现一下试试服务器

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

<!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有三个,分别是session

1.登陆的LoginServletdom

2.收件箱列表的ListServletide

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那么就提醒开启。

相关文章
相关标签/搜索