javaweb -- 3、Servlet系列之Cookie、Session

目录

 

5

5.1: Servlet系列之Cookie

5.2:

5.3: 实现用户的一周免登录(将4.2.2的包和类全考过来)

6

6.1: Servlet系列之Session(给服务端的基本的存储)

1、创建sessoin对象 

2、向Session对象中添加值 

3、获取Session中的值 

4、设置sessoin属性

 

6.2:

6.3:

 


5

5.1 Servlet系列之Cookie

(相当于:浏览器的历史信息、5天内自动登录等等)

添加文件:

web.xml文件:

<servlet>
    <servlet-name>CookieServlet</servlet-name>
    <servlet-class>com.mashibing.CookieServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CookieServlet</servlet-name>
    <url-pattern>/cookie</url-pattern>
</servlet-mapping>
<servlet>

Java文件:CookieServlet(Cookie程序)

public class CookieServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("gbk");

        //response.getWriter().write("学习cookie");

//创建Cookie对象(两个Cookie对象)
        Cookie cookie = new Cookie("00001","beijing");
        Cookie cookie1 = new Cookie("0002","shanghai");
//给cookie对象添加时间有效期,单位是s
        cookie.setMaxAge(3*24*3600); //浏览器重启后候数据还在
//给cookie修改固定路径值
        cookie1.setPath("/cookie/abc");
//将cookie设置到response(响应)对象中
        response.addCookie(cookie);
        response.addCookie(cookie1);
        response.getWriter().write("学习cookie");
    }
}

给cookie对象添加时间有效期,单位是秒:

随便填入一个地址,进去检查(上次的信息仍然保留)

如果重新启动浏览器:(上次的信息就死掉了)

给cookie修改固定路径值:

调试:

在……/cookie/abc地址中打开:(地址已修改)

cookie:用来处理客户端发送不同请求的时候使用相同的参数信息

  cookie的使用:
*        Cookie cookie = new Cookie("00001","beijing");
*        response.addCookie(cookie);
*        设置cookie的参数
*        cookie.setMaxAge( int seconds)
*        cookie.setPath(String  url)
*        获取cookie对象
*        Cookie[] cookies = request.getCookies()
*  特点:
*      1、cookie是保存在浏览器端的数据名称
*      2、cookie分类:
		临时cookie,默认是存储在内存中的,所以当浏览器关闭的时候,cookie自动失效
		持久化cookie,保存在浏览器的某个存储目录,当时间过期之后,才会失效
*      3、每一个cookie对象中保存一个key-value键值对的数据,想要存储多个k-v数据,需要创建多个Cookie对象  //两个Cookie对象

5.2

web.xml文件:

    <servlet-name>GetCookieServlet</servlet-name>
    <servlet-class>com.mashibing.GetCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>GetCookieServlet</servlet-name>
    <url-pattern>/getcookie</url-pattern>
</servlet-mapping>

java文件:GetCookieServlet(获取Cookie程序)

public class GetCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("gbk");

        //获取cookie对象
        Cookie[] cookies = request.getCookies();
//写if是防止页面发生一次500,导致数据永久消失
        if(cookies.length>0){ 
            for (Cookie c: cookies) {
                String key = c.getName();
                String value = c.getValue();
                System.out.println(key+":"+value);  //为00001 : beijing
            }
        }
    }
}

5.3 实现用户的一周免登录(将4.2.2的包和类全考过来)

用户免登录实现:

    1、用户发送验证cookie信息的请求,编写对应的servlet进行处理
    2、如果包含cookie,直接跳转到成功页面
    3、如果不包含cookie信息,直接跳转到登录页面

web.xml文件:

<servlet>
    <servlet-name>PageServlet</servlet-name>
    <servlet-class>com.cookie.control.PageServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>PageServlet</servlet-name>
    <url-pattern>/page</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.cookie.control.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.cookie.control.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

web.xml文件:

<servlet>
    <servlet-name>CookieProjectServlet</servlet-name>
    <servlet-class>com.cookie.control.CookieProjectServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>CookieProjectServlet</servlet-name>
    <url-pattern>/ck</url-pattern>
</servlet-mapping>

java文件:CookieProjectServlet(Cookie项目程序)

public class CookieProjectServlet extends HttpServlet {
//引入”用户服务”的类
    UserService userService = new UserServiceImpl();

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("gbk");

//获取cookie对象
        Cookie[] cookies = request.getCookies();
//如果cookies如果为null,直接跳转到登录页面进行登录请求
        if(cookies!=null){
            for (Cookie  c: cookies) {
                String key = c.getName(); //id(名字)
                if("uid".equals(key)){
                    String value =  c.getValue();
                    User u = userService.getUserById(Integer.valueOf(value));
//如果u如果不为null,那么有值,直接跳转
                    if(u!=null){
                        response.sendRedirect("hello");//跳转后的地址
                    }else{
                        response.sendRedirect("page"); //跳转后的地址
                    }
                }else{
                    response.sendRedirect("page"); //跳转后的地址
                }
            }
        }else{
//跳转到登录页面
            response.sendRedirect("page"); //跳转后的地址
        }
    }
}

java文件:LoginServlet(登录程序)

修改成:

java文件:UserService(用户服务)

添加:

java文件:UserServiceImpl(用户服务)

添加:

java文件:UserDao(用户访问)

添加:

java文件:UserDaoImpl(用户访问)

添加:

public class UserDaoImpl implements UserDao {
    @Override
    public User checkUser(User user) {
        //定义连接的对象
        Connection conn = null;
        PreparedStatement pstmt  = null;
        ResultSet rs = null;
        User u = null;
        try {
        //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/login","root","123456");
            //获取预处理块
            pstmt = conn.prepareStatement("select * from user where name = ? and pwd =?");
            //给?赋值
            pstmt.setString(1,user.getName());
            pstmt.setString(2,user.getPwd());
            //执行sql语句
            rs = pstmt.executeQuery();
            //从resultset中获取结果值
            while (rs.next()){
                u = new User(rs.getInt("id"),rs.getString("name"),rs.getString("pwd"));
            }
        } catch (Exception e) {
            e.printStackTrace();
     }finally {
        try {
            rs.close();
            pstmt.close();
            conn.close();
        } catch (SQLException e) {e.printStackTrace();}
    }
       return u;
}
===================== 复制上面,只修改黄色部分 =====================
@Override
public User getUserById(int id) {
    //定义连接的对象
    Connection conn = null;
    PreparedStatement pstmt  = null;
    ResultSet rs = null;
    User u = null;
    try {
        //加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //获取连接
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/login","root","123456");
        //获取预处理块
        pstmt = conn.prepareStatement("select * from user where id = ?");
        //给?赋值
        pstmt.setInt(1,id);
        //执行sql语句
        rs = pstmt.executeQuery();
        //从resultset中获取结果值
        while (rs.next()){
            u = new User(rs.getInt("id"),rs.getString("name"),rs.getString("pwd"));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        try {
            rs.close();
            pstmt.close();
            conn.close();
        } catch (SQLException e) {e.printStackTrace();}
    }
    return u;
}

①调试:

退出浏览器,重启

②直接进入该链接:

6

6.1 Servlet系列之Session(给服务端的基本的存储)

cookie与session区别:

cookie

一个用户发送多次相同请求的处理需要使用相同的数据

Session

一个用户发送不同请求的处理需要使用相同的数据(比如下面,报错500,也能有响应头下的cookie

 

Session:解决一个用户发送不同请求时的数据共享问题(比如进入淘宝的某个商品地址不用输密码)

在处理过程中会给用户创建一个 session 对象,用来存储用户请求处理相关的公共数据,并将此 session 对象的 JSESSIONID 以 sessoin 的形式保存在浏览器中(临时存储, 浏览器关闭即失效),与之前的cookie类似?

 

用户在发起第二次请求及后续请求时, 请求信息中会附带 JSESSIONID, 服务器在接收到请求后,调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其对应的 session 对象

      1、由服务器进行创建session对象,存储共享的数据
      2、session需要依赖cookie技术
      3、每个用户对应一个独立的session对象
      4、每个session对象的有效时长是30分钟
      5、每次关闭浏览器的时候,重新请求都会开启一个新的session对象,因为返回的JSESSIONID保存在浏览器的内存中(临时cookie),所以关闭之后自然消失

1、创建sessoin对象 

        HttpSession session = request.getSession()

2、向Session对象中添加值 

       sessoin.setAttribute(String name,Object object)

3、获取Session中的值 

      session.getAttribute(String name)

4、设置sessoin属性

      session.setMaxInactiveInterval(5) //设置存活时间,5

      session.invalidate(); //session强制失效

 

web.xml文件:

<servlet>
    <servlet-name>SessionServlet</servlet-name>
    <servlet-class>com.mashibing.SessionServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>SessionServlet</servlet-name>
    <url-pattern>/session</url-pattern>
</servlet-mapping>

java文件:SessionServlet(会话程序)

public class SessionServlet extends javax.servlet.http.HttpServlet {
    @Override
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        this.doGet(request,response);
    }
    @Override
    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
//将乱码换成中文
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        System.out.println("接受到请求get");

//图一:第一次开启浏览器,cookie在请求头下
//图三:第二次开启浏览器,cookie在响应头下(由之前保持下来了)

idea中显示:(是两次打开浏览器)不一样就表示数据没保存?

//获取session对象
        HttpSession session = request.getSession();
//设置session的有效时长
        //session.setMaxInactiveInterval(5); //5秒
//getid方法拿到JSESSIONID
        System.out.println(session.getId());
//设置session强制失效
        //session.invalidate();
//向session中设置参数
        //session.setAttribute("111","zhangsan"); //这行是配合下面的java代码
        response.getWriter().write("学习session");
    }
}

当随便输入地址时:也出现Cookie(原因是留下的信息造成的)

6.2

web.xml文件:

<servlet>
    <servlet-name>SessionServlet2</servlet-name>
    <servlet-class>com.mashibing.SessionServlet2</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>SessionServlet2</servlet-name>
    <url-pattern>/session2</url-pattern>
</servlet-mapping>

java文件:SessionServlet2(会话程序)

public class SessionServlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

//获取session对象
        HttpSession session= request.getSession();
//获取session中的参数值
        String str = (String) session.getAttribute("111");
        System.out.println(str);
        response.getWriter().write(str);
    }
}

//图一:第一次开启浏览器,cookie在请求头下

//图二:第二次开启浏览器,cookie在响应头下(有之前保持下来了)

 (上面是第一次开启浏览器,下面第二次)

6.3

例子:报错500

idea中显示: (登录成功)

熟悉之前的案例:

(数据库中有该用户 --> 登录成功)

跳转到hello:

“实现用户的一周免登录案例” 一样,也是将4.2.2的包和类拷过来:

(此时就有五个页面地址):

web.xml文件:

<servlet>
    <servlet-name>PageServlet</servlet-name>
    <servlet-class>com.session.PageServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>PageServlet</servlet-name>
    <url-pattern>/page</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.session.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.session.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

java文件:LoginServlet(登录程序)

添加:

java文件:HelloServiet(Hello程序)

String name = request.getParameter("name");换成:

cookie与session区别:

cookie

同一个用户发送多次相同请求的处理需要使用相同的数据

Session

同一个用户发送不同请求的处理需要使用相同的数据(比如上面,报错500,也能有响应头下的cookie

Session:解决一个用户发送不同请求时的数据共享问题(比如进入淘宝的某个商品地址不用输密码)

在处理过程中会给用户创建一个 session 对象,用来存储用户请求处理相关的公共数据,并将此 session 对象的 JSESSIONID sessoin 的形式保存在浏览器中(临时存储, 浏览器关闭即失效),与之前的cookie类似?

 

用户在发起第二次请求及后续请求时, 请求信息中会附带 JSESSIONID 服务器在接收到请求后,调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其对应的 session 对象

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值