表明墙完满(数据库,前端,后端Servlet),再谈Cookie和Session。以及一个 ...

打印 上一主题 下一主题

主题 1015|帖子 1015|积分 3045

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目录

表明墙引入数据库 
再谈Cookie和session
得到Cookie
​编辑

设置Cooie
使用Cookie编写一个登入的小界面


表明墙引入数据库 

   1.先引入数据库的依靠(驱动包),5.1.49
  pom.xml中,在之前的两个之前,再去添加一个
  1. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  2. <dependency>
  3.     <groupId>mysql</groupId>
  4.     <artifactId>mysql-connector-java</artifactId>
  5.     <version>5.1.49</version>
  6. </dependency>
复制代码
2.创建本地的数据库
  1. create table messageWall(`from` varchar(20),`to` varchar(20),message varchar(1024));
复制代码
3.之前的代码中有一段可以删掉了
  1. //此处把消息保存到内存中(一旦重启服务器,内存数据就会消失了。更科学的做法,应该是保存到数据库里面)
  2.     private List<Message> messageList=new ArrayList<>();
复制代码
这个代码需要删除,因为我们已经决定使用数据库去存储了,就不需要本地去存了。
  
   完整代码
  1. import com.fasterxml.jackson.databind.ObjectMapper;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;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.sql.DataSource;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;class  Message{    public String from;    public String to;    public String message;    @Override    public String toString() {        return "Message{" +                "from='" + from + '\'' +                ", to='" + to + '\'' +                ", message='" + message + '\'' +                '}';    }}@WebServlet("/message")public class MessageServlet extends HttpServlet {    //起首要把一个json转化为java对象    private ObjectMapper objectMapper=new ObjectMapper();    //此处把消息保存到内存中(一旦重启服务器,内存数据就会消失了。更科学的做法,应该是保存到数据库里面)
  2.     private List<Message> messageList=new ArrayList<>();
  3.     @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {       //1.需要能够读取请求body,转换成java对象        Message message=objectMapper.readValue(req.getInputStream(),Message.class);        //2.得到message之后,需要把message保存到服务器中        try {            save(message);        } catch (SQLException e) {            e.printStackTrace();        }        System.out.println("服务器收到message:"+message.toString());        //3.返回相应,(其实没啥大须要,主要是返回一个200ok就行,body可以没有)        resp.setStatus(200);                          //设置成功状态码,会更加清晰        resp.getWriter().write("ok");    }    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        List<Message>messageList= null;        try {            messageList = load();        } catch (SQLException e) {            e.printStackTrace();        }        //1.把内存中的这些Message,组织成json格式,返回到相应中       String respJson=objectMapper.writeValueAsString(messageList);       //这个代码十分关键,告诉欣赏器,返回的相应的body是json格式(utf8编码)       resp.setContentType("application/json; charset=utf8");       resp.getWriter().write(respJson);        // 2.针对List/数组这种,jackon会自动把数据整理成json数组,里面每个对象,又会被jsckon转换成{}json对象(json对象属性名字,也是和Message类的成员名字对应的)    }    private void save(Message message) throws SQLException {        //通过jdbc从数据库中存储数据。        DataSource dataSource=new MysqlDataSource();        //useSSL=false 此处的SSL就是HTTPS中的加密方案        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/message?characterEncoding=utf8&&useSSL=false");        ((MysqlDataSource)dataSource).setUser("root");        ((MysqlDataSource)dataSource).setPassword("lcl15604007179");        //2.创建链接        Connection connection=dataSource.getConnection();        //3.构造SQL        String sql="insert into messageWall values(?,?,?)";        PreparedStatement statement=connection.prepareStatement(sql);        statement.setString(1, message.from);        statement.setString(2, message.from);        statement.setString(3, message.from);        //4.实行SQL        statement.executeUpdate();        //5.释放资源,关闭毗连        statement.close();        connection.close();    }    private List<Message> load() throws SQLException {        //通过jdbc,从数据库读取数据        //1。创建数据源        DataSource dataSource=new MysqlDataSource();        ((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/message?characterEncoding=utf8&&useSSL=false");        ((MysqlDataSource) dataSource).setUser("root");        ((MysqlDataSource)dataSource).setPassword("lcl15604007179");        //2.创建毗连        Connection connection= dataSource.getConnection();        //3.构造SQL        String sql="select *from messageWall";        PreparedStatement statement=connection.prepareStatement(sql);        //4.实行SQL        ResultSet resultSet= statement.executeQuery();        //5.遍历效果集合     List <Message> messageList=new ArrayList<>();     while (resultSet.next()){         Message message=new Message();         message.from=resultSet.getString("from");         message.to=resultSet.getString("to");         message.message=resultSet.getString("message");         messageList.add(message);     }     //关闭毗连,释放资源        resultSet.close();        statement.close();        connection.close();        return messageList;    }}
复制代码
我们可以知道,表明墙上的东西,即使你关闭服务器,我们的数据也是保存的,这也是游戏停服了但是你的数据不丢失的原因。

再谈Cookie和session

   Cookie是欣赏器在本地持久化存储数据的一种机制
  1.Cookie的数据从那里来?
  服务器返回给欣赏器的
  2.Cookie的数据长什么样子?
  Cookie中是键值对结构的数据,并且这里的键值对都是程序员自定义的。
  3.Cookie有什么用
  Cookie可以在欣赏器这边存储一些临时性数据
  此中最范例的一种使用方式,就是用来存储“身份标识”
  sessionId->Cookie和Session之间的联动了

  4.Cookie到那里去
  Cookie的内容会在下次访问该网站的时间,自动被带到HTTP请求中
  5.Cookie怎么存储的
  欣赏器按照不同的域名分别存储Cookie域名和域名之间不能打搅。
  Cookie存储在硬盘上的
  Cookie存储往往会有一个超时时间(看欣赏器不同而定,付出宝很短,安全)
  


得到Cookie

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.Cookie;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet("/getcookie")
  9. public class GetCookieServlet extends HttpServlet {
  10.     @Override
  11.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  12.         Cookie[] cookies = req.getCookies();
  13.         if (cookies != null) {
  14.             for (Cookie cookie : cookies) {
  15.                 System.out.println(cookie.getName() + ":" + cookie.getValue());
  16.             }
  17.         } else {
  18.             resp.getWriter().write("当前请求中没有cookie");
  19.         }
  20.         resp.getWriter().write("ok");
  21.     }
  22. }
复制代码




设置Cooie

  1. import javax.servlet.ServletException;
  2. import javax.servlet.annotation.WebServlet;
  3. import javax.servlet.http.Cookie;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. @WebServlet("/setcookie")
  9. public class SetCookieServlet extends HttpServlet {
  10.     //期望通过doGet方法,把一个自定义的cookie数据返回到浏览器这边。
  11.     @Override
  12.     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  13.         Cookie cookie=new Cookie("date","2023-09-23");
  14.         resp.addCookie(cookie);
  15.         Cookie cookie1=new Cookie("time","19:55");
  16.         resp.addCookie(cookie1);
  17.         resp.getWriter().write("setCookie ok");
  18.     }
  19. }
复制代码



   我们需要是先设置Cookie之后,就可以此时拿到Cookie的内容,当然Cookie里面的数据,只是在欣赏器休息休息,真正发挥作用,照旧得在服务器这边的逻辑见效的。
  Cookie结合Session实现登入效果,此时就能更清晰的看出来
  


   sessionId是一个广义的概念,不同的库中具体实现过程会有一些细节的差别,在Servlet里,把这个属性具体叫做JSESSIONID
  getSession背后做的事变(会话,就相当于账户,用户和服务器的交流,之前有没有这个账户)
  1.读取请求中的Cookie,看Cookie里面是否有JESSIONID属性,以及值是什么,假如没有,就认为需要创建新的会话,假如有,就拿着这个ID去查询当前的session是否存在
  要是session存在,就直接返回该session
  要是session不存在,就准备创建新的会话。
  2.假如当前确实需要创建会话,就会创建一个Session对象,同时生成唯一的一个JESSIONID,以JSESSIONID为key,SESSION对象为value,把这个键值对插入到服务器上述的哈希表中
  3.刚才生成的JESSIONID又会通过addCookie方法,加入到相应中,此时相应里就会带有Set-Cookie字段,这里的值就是JSEEION=xxxxxxx通过相应,就把JSESSIOID返回到欣赏器这边了。
  这一行小小的,能量大大的
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表