博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
会话技术( Cookie ,Session)
阅读量:4871 次
发布时间:2019-06-11

本文共 15902 字,大约阅读时间需要 53 分钟。

 会话技术:

    会话:浏览器访问服务器端,发送多次请求,接受多次响应。直到有一方断开连接。会话结束。
    
    解决问题:可以使用会话技术,在一次会话的多次请求之间共享数据。
        
    分类:
        客户端会话技术    Cookie
        服务器端会话技术    Session

 

  客户端会话技术:Cookie 小饼干的意思

        服务器端不需要管理,方便。但是不安全。
        
        原理:
            1.客户端第一次请求服务器端,服务器作出响应时,会发送set-cookie头,携带需要共享的数据
            2.当客户端接受到这个响应,会将数据存储在客户端
            3.当客户端再次请求服务器端时,会通过cookie请求头携带着存储的数据。
            4.服务器接受带请求,会获取客户端携带的数据。
        
        Java代码实现:
            1.发送cookie
                //1.创建Cookie对象。
                Cookie c = new Cookie("name","zhangsan");
                //2.通过response发送cookie
                response.addCookie(c);
                
            2.接收cookie
                //1.获取所有cookie数组
                Cookie[] cs = request.getCookies();
                //2.遍历数组
                if(cs != null){
                    for (Cookie c : cs) {
                        //获取cookie的名称
                        String name = c.getName();
                        //判断名称,得到目标cookie
                        if("name".equals(name)){
                            //获取值
                            String value = c.getValue();
                            System.out.println(name+":"+value);
                        }
                    }
                }
        
        Cookie的细节:
            1.默认情况下,cookie保存在客户端浏览器内存中。
              需要将数据持久化存储在客户端的硬盘上。
              设置cookie的存活时间。setMaxAge(int s);
            
            2.Cookie是不支持中文数据的。如果要想存储中文数据。需要转码。
                URL编码
        
        功能:记住用户名和密码

        服务器端会话技术:Session  主菜的意思
        
        服务器端需要管理数据,麻烦,但是安全。
        
        原理:
            1.客户端访问服务器端,在服务器端的一个对象(Session)中存储了数据
            2.服务器给客户端作出响应时,会自动将session对象的id通过响应头 set-cookie:jsessionid=xxx 发送到客户端
            3.客户端接受到响应,将头对应的值存储到客户端
            4.客户端再次请求时,会携带着请求头 cookie:jsessionid=xxx.
            5.服务器接受到请求,通过jsessionid的值,找到对应的session对象。就可以获取对象中存储的数据了。
            
            Session技术依赖于cookie。
        
        获取session
            HttpSession session = request.getSession();
        
        域对象:
            setAttribute():
            getAttribute():
            removeAttribute():
        
        session细节:
            1.客户端关闭了,两次session一样吗?
                不一样。因为客户端浏览器内存释放了,jsessionid没了。
              服务器关闭了,两次session一样吗?
                不一样。因为服务器内存释放了,session对象没了。
                    session的钝化:
                        当服务器正常关闭时,会将session对象写入到服务器的硬盘上。
                    session的活化:
                        当服务器正常启动时,会将session文件还原为session对象
        
            2.session对象的销毁
                1.session超时
                    <session-config>
                        <session-timeout>30</session-timeout>
                    </session-config>
                
                2.invalidate():session销毁
                
                3.服务器关闭。
                
            3.session依赖于cookie,如果客户端禁用了cookie,那么session该咋办?
                URL重写。

        

            4.getSession方法的重载:
                boolean:
                    true:默认值
                        通过id查找session,如果没找到,新创建一个
                    false:
                        通过id查找session,如果没找到,返回null
                        第一次创建一个新的对象

 

  代码演示:

1 package cookie; 2  3 import java.io.IOException; 4 import java.sql.PreparedStatement; 5 import java.sql.SQLException; 6  7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest;10 import javax.servlet.http.HttpServletResponse;11 import javax.servlet.http.HttpSession;12 13 public class LoginServlet extends HttpServlet {14 15     private static final long serialVersionUID = -4372317815130787297L;16 17     public void doGet(HttpServletRequest request, HttpServletResponse response)18             throws ServletException, IOException {19         try {20             //1.获取验证码21             String checkCode = request.getParameter("checkCode");22             //2.获取生成的验证码23             HttpSession session = request.getSession();24             String checkCode_pro = (String) session.getAttribute("checkCode_pro");25             26             //1.设置编码27             request.setCharacterEncoding("utf-8");28             //2.获取用户名和密码29             String username = request.getParameter("username");30             String password = request.getParameter("password");31             //3.操作数据库,获取数据库连接32             //4.定义sql33             //5.获取pstmt对象34             PreparedStatement pstmt = JDBCUtils.getConnection().prepareStatement("select * from user where username = ? and userpassword = ?");35             //6.设置参数36             pstmt.setString(1, username);37             pstmt.setString(2, password);38             //7.执行sql39             //8.验证,判断40             //判断验证码是否正确41             if(checkCode_pro.equalsIgnoreCase(checkCode)){42                     //正确43                     //注册 或 登录44                     session.setAttribute("regist_msg", "验证码正确");45                     if(pstmt.executeQuery().next()){46                     //登陆成功47                     request.setAttribute("username", username);48                     request.getRequestDispatcher("/success.jsp").forward(request, response);49                     }else{50                         //登陆失败51                         request.setAttribute("msg", "用户名或密码错误!");52                         request.getRequestDispatcher("/login.jsp").forward(request, response);    53                     }54             }else{55                 //错误56                 session.setAttribute("regist_msg", "验证码错误");57                 response.sendRedirect("/colloquy/login.jsp");58                 //将session中存储的验证码清空59                 session.removeAttribute("checkCode_pro");    60             }    61         } catch (SQLException e) {62             e.printStackTrace();63         }64     }65 66     public void doPost(HttpServletRequest request, HttpServletResponse response)67             throws ServletException, IOException {68         this.doGet(request, response);69     }70 }

 

 

1 package cookie; 2  3 import java.io.IOException; 4  5 import javax.servlet.ServletException; 6 import javax.servlet.http.Cookie; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse;10 11 public class RemServlet extends HttpServlet {12 13     private static final long serialVersionUID = -3477344209817695234L;14 15     public void doGet(HttpServletRequest request, HttpServletResponse response)16             throws ServletException, IOException {17         //1.获取用户名和密码,复选框18         String username = request.getParameter("username");19         String password = request.getParameter("password");20         //2.判断用户名和密码是否正确21         if("zhangsan".equals(username) && "123".equals(password)){22             //登陆成功23             if(request.getParameter("rem") != null){24                 //记住密码25                 //1.创建cookie26                 Cookie c_username = new Cookie("username", username);27                 Cookie c_password = new Cookie("password", password);28                 //2.设置存活时间29                 c_username.setMaxAge(60 * 60 * 24 * 7);30                 c_password.setMaxAge(60 * 60 * 24 * 7);31                 //3.发送cookie32                 response.addCookie(c_username);33                 response.addCookie(c_password);34             }35             request.setAttribute("username", username);36             request.getRequestDispatcher("/success.jsp").forward(request, response);37         }else{38             //登陆失败39             request.setAttribute("msg", "用户名或密码错误!");40             request.getRequestDispatcher("/login.jsp").forward(request, response);41         }42     }43 44     public void doPost(HttpServletRequest request, HttpServletResponse response)45             throws ServletException, IOException {46         this.doGet(request, response);47     }48 }

 

 

1 package cookie; 2  3 import java.awt.Color; 4 import java.awt.Graphics; 5 import java.awt.image.BufferedImage; 6 import java.io.IOException; 7 import java.util.Random; 8  9 import javax.imageio.ImageIO;10 import javax.servlet.ServletException;11 import javax.servlet.http.HttpServlet;12 import javax.servlet.http.HttpServletRequest;13 import javax.servlet.http.HttpServletResponse;14 15 /**16  * 生成验证码17  * @author rongsnow18  *19  */20 public class CheckCodeServlet extends HttpServlet {21 22     private static final long serialVersionUID = 8583894656985684165L;23 24     public void doGet(HttpServletRequest request, HttpServletResponse response)25             throws ServletException, IOException {26         27         int width = 100;28         int height = 50;29         //1.创建图片30         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);31         //2.装饰图片32         //2.1设置背景色33         //2.1.1  获取画笔对象34         Graphics g = image.getGraphics();35         //2.2.2 设置画笔的颜色36         g.setColor(Color.pink);37         //2.2.3 填充背景色38         g.fillRect(0, 0, width, height);39         40         //2.2 画边框41         g.setColor(Color.GREEN);42         g.drawRect(0, 0, width - 1, height - 1);43         44         //2.3 写入验证码45         g.setColor(Color.RED);46         47         String msg = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";48         Random ran = new Random();49         StringBuilder sb = new StringBuilder();50         for (int i = 1; i <= 4; i++) {51             int index = ran.nextInt(msg.length());//随机生成角标52             String s = String.valueOf(msg.charAt(index));53             sb.append(s);54             55             g.drawString(s, width/5 * i, height/2);56         }57         String checkCode_pro = sb.toString();58         //将生成的验证码 存入session59         request.getSession().setAttribute("checkCode_pro", checkCode_pro);60         61         //2.4画干扰线62         g.setColor(Color.BLUE);63         64         for (int i = 0; i < 5; i++) {65             //动态生成坐标点66             int x1 = ran.nextInt(width);67             int x2 = ran.nextInt(width);68             int y1 = ran.nextInt(height);69             int y2 = ran.nextInt(height);70             g.drawLine(x1, y1, x2, y2);71         }72         73         //3.将图片数据 写入到 response输出流中74         ImageIO.write(image, "jpg", response.getOutputStream());75     }76 77     public void doPost(HttpServletRequest request, HttpServletResponse response)78             throws ServletException, IOException {79 80         this.doGet(request, response);81     }82 }

 

 

1 package cookie; 2  3 import java.io.FileNotFoundException; 4 import java.io.FileReader; 5 import java.io.IOException; 6 import java.sql.Connection; 7 import java.sql.DriverManager; 8 import java.sql.ResultSet; 9 import java.sql.SQLException;10 import java.sql.Statement;11 import java.util.Properties;12 13 /**14  * JDBC 工具类15  * @author rongsnow16  *17  */18 public class JDBCUtils {19     private static String url = null;20     private static String user = null;21     private static String password = null;22     private static String driverClass = null;23     24     static{25         /*26          * 加载配置文件,为每一个值赋值27          */28         try {29             //1.创建properties对象30             Properties pro = new Properties();31             //获取配置文件的真实路径32             //2.关联资源文件33             pro.load(new FileReader(JDBCUtils.class.getClassLoader().getResource("jdbc.properties").getPath()));34             //3.获取数据35             url = pro.getProperty("url");36             user = pro.getProperty("user");37             password = pro.getProperty("password");38             driverClass = pro.getProperty("driverClass");39             //4.注册驱动40             Class.forName(driverClass);41             42         } catch (FileNotFoundException e) {43             e.printStackTrace();44         } catch (IOException e) {45             e.printStackTrace();46         } catch (ClassNotFoundException e) {47             e.printStackTrace();48         }49     }50     51     /**52      * 获取数据库连接53      * @throws SQLException 54      */55     public static Connection getConnection() throws SQLException{56         57         return DriverManager.getConnection(url, user, password);58     }59     60     /**61      * 释放资源62      * @throws SQLException 63      */64     public static void close(Connection conn,Statement stmt,ResultSet rs) throws SQLException{65         if(rs != null){
//预防空指针异常66 rs.close();67 }68 if(stmt != null){
//预防空指针异常69 stmt.close();70 }71 if(conn != null){
//预防空指针异常72 conn.close();73 }74 }75 public static void close(Connection conn,Statement stmt) throws SQLException{76 if(stmt != null){
//预防空指针异常77 stmt.close();78 }79 if(conn != null){
//预防空指针异常80 conn.close();81 }82 }83 public static void close(Connection conn) throws SQLException{84 if(conn != null){
//预防空指针异常85 conn.close();86 }87 }88 }

 

 

  web.xml

1 
2
7
8 9
10
This is the description of my J2EE component
11
This is the display name of my J2EE component
12
LoginServlet
13
cookie.LoginServlet
14
15
16
This is the description of my J2EE component
17
This is the display name of my J2EE component
18
RemServlet
19
cookie.RemServlet
20
21
22
This is the description of my J2EE component
23
This is the display name of my J2EE component
24
checkcode
25
cookie.CheckCodeServlet
26
27 28 29
30
LoginServlet
31
/loginServlet
32
33
34
RemServlet
35
/remServlet
36
37
38
checkcode
39
/checkCodeServlet
40
41 42 43
44
index.jsp
45
46

 

  jdbc.properties配置文件内容

driverClass=com.mysql.jdbc.Driver

url=jdbc:mysql:///mydb
user=root
password=123

login.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2  3  4  5      6         My JSP 'login.jsp' starting page 7         15     16     17         <%18             //1.获取所有cookie19             Cookie[] cs = request.getCookies();20             String username = "";21             String password = "";22             //2.遍历cookie数组23             if(cs != null){24                 for(Cookie c : cs){25                     //获取名称26                     String name = c.getName();27                     if("username".equals(name)){28                         username = c.getValue();29                     }30                     if("password".equals(name)){31                         password = c.getValue();32                     }33                 }34             }    35         %>36         37         
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
用户登陆
用户名:
密码:
验证码: 看不清?
记住密码
62
63
<%=request.getAttribute("msg")==null ? "" : request.getAttribute("msg") %>
64
<%=session.getAttribute("regist_msg")==null ? "" : session.getAttribute("regist_msg") %>
65 66

 

 

success.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2  3  4  5      6             My JSP 'success.jsp' starting page 7      8      9         10         <%=11             request.getAttribute("username")12         %>,欢迎您!13         14     15 

 

 所使用的MySQL语句

1 -- 创建用户信息表 user,并指定主键且自增长 2 CREATE TABLE USER( 3     uid        INT PRIMARY KEY AUTO_INCREMENT, 4     username    VARCHAR(32), 5     userpassword    VARCHAR(32)     6 ); 7  8 -- 查询所有列 9 SELECT * FROM USER;10 11 -- 添加数据12 INSERT INTO USER(username,userpassword) VALUE ('zhangsan','123');13 INSERT INTO USER(username,userpassword) VALUE ('lisi','1234');14 INSERT INTO USER(username,userpassword) VALUE ('wangwu','234');15 INSERT INTO USER(username,userpassword) VALUE ('zhaoliu','1234');16 INSERT INTO USER(username,userpassword) VALUE ('sisi','234');

 

转载于:https://www.cnblogs.com/rongsnow/p/5172246.html

你可能感兴趣的文章
Linux 操作
查看>>
【3】JAVA---地址App小软件(AddPanel.class)(表现层)
查看>>
Java中的代理模式
查看>>
一个linux守护进程的编写(Ubuntu环境下)
查看>>
Leetcode-1002 Find Common Characters(查找常用字符)
查看>>
面向对象编程(基础)
查看>>
AOJ 802.运输宝物
查看>>
android studio C/C++ jni 编写以及调试方法
查看>>
Oracle RMAN 的 show,list,crosscheck,delete命令整理
查看>>
JMeter属性和变量
查看>>
java之文件操作
查看>>
数据库基本语句大全
查看>>
模仿smarty迷你类代码
查看>>
Mysql单表查询
查看>>
ubuntu 12.04 不能关机
查看>>
检测某地方新闻小站
查看>>
SOAP=RPC+HTTP+XML
查看>>
【转】 Pro Android学习笔记(四五):Dialog(2):DialogFragment
查看>>
跑路(洛谷 1613)
查看>>
微软云平台媒体服务实践系列 2- 使用动态封装为iOS, Android , Windows 等多平台提供视频点播(VoD)方案...
查看>>