• 第十九章 cookie和session


    1.练习

    ①创建数据库,创建用户表;

    ②实现登录功能,查询用户表进行校验;

    数据访问层:

    1. public class UserDaoImpl implements IUserDao {
    2. @Override
    3. public Integer selectUser(String userName, String password) {
    4. String sql="select userId from user where userName = ? and password = ?";
    5. BaseDao.setPst(sql,new Object[]{userName,password});
    6. List> rows = BaseDao.executeQuery();
    7. if(rows.size()>0){
    8. return (Integer) rows.get(0).get("userId");
    9. }
    10. return -1;
    11. }
    12. }

    事务逻辑层:

    1. public class IUserServiceImpl implements IUserService {
    2. IUserDao userDao = new UserDaoImpl();
    3. @Override
    4. public Boolean login(String userName, String password) {
    5. return userDao.selectUser(userName,password)>0;
    6. }
    7. }

    servlet :

    1. @WebServlet(urlPatterns = "/LoginServlet")
    2. public class LoginServlet extends HttpServlet {
    3. IUserService userService = new IUserServiceImpl();
    4. @Override
    5. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    6. String userName = req.getParameter("userName");
    7. String password = req.getParameter("password");
    8. if(userService.login(userName,password)){
    9. System.out.println("登录成功");
    10. HttpSession session =req.getSession();
    11. session.setAttribute("userName",userName);
    12. session.setAttribute("password",password);
    13. System.out.println(session.getId());
    14. req.getRequestDispatcher("/success.jsp").forward(req,resp);
    15. }else {
    16. System.out.println("登录失败");
    17. req.getRequestDispatcher("/fail.jsp").forward(req,resp);
    18. }
    19. }
    20. }

    2. Cookie和Session

    会话技术,可以实现会话跟踪,不同请求发送的数据能够进行共享。

    目的:对于http协议来说每一次请求之间相互独立,互不关联,无法在多次请求之间共享数据,cookie和session就是用来解决共享数据问题。

    区别:

    cookie:在客户端(浏览器)存储数据,用户多次请求的数据跟踪(数据共享);

    session:在服务器端的内存中存储数据,用于在一次会话的多次请求间共享数据,进行数据跟踪。

    2.1 cookie

    2.1.1 使用

    1. //创建cookie对象
    2. Cookie ck = new Cookie(String name,String value);
    3. //将cookie对象添加到浏览器
    4. resp.addCookie(ck);
    5. //获取浏览器请求中的cookie对象
    6. Cookie[] cookies = request.getCookies()
    7. //获取cookie的name
    8. ck.getName();
    9. //获取cookie的value
    10. ck.getValue();

     2.2.2 原理

            通过Http协议中的响应头set-cookie和请求头cookie完成的。

     

     

     cookie 是由服务器设置到浏览器中的。

     2.2.3 注意事项

    ①cookie的保存时间:

            默认情况下是瞬时的,关闭浏览器后销毁;

            通过 ck.setMaxAge(60*2); 方法设置时间;(参数:正数,保存时间(/秒) ;负数:默认(瞬时cookie);0:删除cookie)

    ②cookie中存储的是字符串,并且不能有其他的特殊的符号,如:” ,“,中文内容在Tomcat8之前的版本也不可以;

    ③浏览器对单个cookie的数据大小也有限制(<=4k)。

    2.2.4 实现短时间内自动登录(cookie) 

    过程:

    ①在访问登录页面前判断浏览器中的cookie是否已经保存有登录的信息,在信息匹配成功的情况下通过转发的方式到成功登录的页面,否则继续访问登录页面;

    ②登录页面,先判断账号密码是否正确,再判断是否勾选了自动登录,是 则创建一个新的cookie并设置到浏览器,否 则不创建,直接转发到新页面。

     访问登录页面时:

    1. @WebServlet(urlPatterns = "/ToLoginServlet")
    2. public class ToLoginServlet extends HttpServlet {
    3. StudentDaoImpl studentDao = new StudentDaoImpl();
    4. @Override
    5. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    6. Cookie[] cks = req.getCookies();
    7. if(cks!=null){
    8. for (Cookie ck:cks) {
    9. System.out.println(ck);
    10. for (Student stu:studentDao.selectAllStu()) {
    11. if (stu.getStuName().equals(ck.getValue())){
    12. req.getRequestDispatcher("/main.jsp").forward(req,resp);
    13. return;
    14. }
    15. }
    16. }
    17. }
    18. req.getRequestDispatcher("/login.jsp").forward(req,resp);
    19. }
    20. }

    登录页面:

    1. @WebServlet(urlPatterns = "/LoginServlet")
    2. public class LoginServlet extends HttpServlet {
    3. ILoginAndRegisterService loginAndRegisterService = new LoginAndRegisterService();
    4. IStudentDao studentDao = new StudentDaoImpl();
    5. Student student = null;
    6. @Override
    7. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    8. String userName = req.getParameter("userName");
    9. String password = req.getParameter("password");
    10. System.out.println(userName);
    11. System.out.println(password);
    12. int userId = loginAndRegisterService.userLogin(userName,password);
    13. if(userId>0){
    14. System.out.println("登录成功!");
    15. System.out.println(userId);
    16. System.out.println(student.toString());
    17. Cookie ck = new Cookie(String.valueOf(userId),student.getStuName());
    18. ck.setMaxAge(60*2);//存活 2min
    19. resp.addCookie(ck);
    20. RequestDispatcher rd = req.getRequestDispatcher("/main.jsp");
    21. rd.forward(req,resp);
    22. }else {
    23. System.out.println("登录失败!");
    24. req.setAttribute("message","登录失败!");
    25. req.getRequestDispatcher("/login.jsp").forward(req,resp);
    26. }
    27. }
    28. }

    2.2 Session

    2.2.1 使用

    1. //直接获取session,不存在就创建一个
    2. HttpSession session =req.getSession();
    3. //设置session的值
    4. session.setAttribute("userName",userName);
    5. session.setAttribute("password",password);
    6. //获取session ID
    7. System.out.println(session.getId());
    8. //根据session的name获取session的值
    9. String userName = (String)req.getSession().getAttribute("userName");
    10. String password = (String)req.getSession().getAttribute("password");
    11. //删除session
    12. req.getSession().removeAttribute("userName");
    13. //销毁session
    14. session.invalidate();

    2.2.2 用途

            只在一次对话的多次请求之间共享数据,cookie的数据存储在浏览器上容易被修改,session更加安全,而且如果使用重定向的方式跳转页面,由于不能通过request传输数据,cookie就不能进行数据共享。

    2.2.3 原理

    ①session 的实现是依赖于cookie的;

    ②session是在服务器的内存中开辟空间存储的。

    2.2.4 注意

            当客户端关闭之后再次打开获得session不是同一个,原因是浏览器上存储的cookie是瞬时的,可以通过设置cookie来实现相同。

    1. Cookie ck = new Cookie("JSESSINOID",session.getId());
    2. ck.setMaxAge(60*60);
    3. resp.addCookie(ck);

    2.2.5 session的失效时间

    默认的失效时间是30min

    查看路径:

    tomcat的位置\apache-tomcat-9.0.38-windows-x64\apache-tomcat-9.0.38\conf\web.xml

     2.2.6 session实现自动登录

            实现过程和cookie的相同,只是把cookie换成了session。

    ToLoginServlet :

    1. @WebServlet("/ToLoginServlet")
    2. public class ToLoginServlet extends HttpServlet {
    3. @Override
    4. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. //根据session的name获取session的值
    6. String userName = (String)req.getSession().getAttribute("userName");
    7. String password = (String)req.getSession().getAttribute("password");
    8. System.out.println(userName);
    9. System.out.println(password);
    10. System.out.println(req.getSession().getId());
    11. if(userName!=null&&password!=null){
    12. req.getRequestDispatcher("/success.jsp").forward(req,resp);
    13. }else {
    14. req.getRequestDispatcher("/login.jsp").forward(req,resp);
    15. }
    16. }
    17. }

    LoginServlet:

    1. @WebServlet(urlPatterns = "/LoginServlet")
    2. public class LoginServlet extends HttpServlet {
    3. IUserService userService = new IUserServiceImpl();
    4. @Override
    5. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    6. String userName = req.getParameter("userName");
    7. String password = req.getParameter("password");
    8. if(userService.login(userName,password)){
    9. System.out.println("登录成功");
    10. //直接获取session,不存在就创建一个
    11. HttpSession session =req.getSession();
    12. //设置session的值
    13. session.setAttribute("userName",userName);
    14. session.setAttribute("password",password);
    15. //获取session ID
    16. System.out.println(session.getId());
    17. req.getRequestDispatcher("/success.jsp").forward(req,resp);
    18. }else {
    19. System.out.println("登录失败");
    20. req.getRequestDispatcher("/fail.jsp").forward(req,resp);
    21. }
    22. }
    23. }

  • 相关阅读:
    CVE-2016-4977 Spring远程代码执行漏洞复现 POC、EXP在文末
    【蓝桥杯单片机入门记录】动态数码管
    基于Java毕业设计蛋糕店会员系统的设计与实现源码+系统+mysql+lw文档+部署软件
    Jmeter初始学习
    惊!这么好用的纯html网页模板可还行?偷偷拿去做作业真是绝绝子!!
    详解数据挖掘
    顶级论文创新点怎么找?中国高校首次获CVPR最佳学生论文奖有感
    【MySQL基础篇】SQL通用语法及分类
    04-Vue的简单动画Transition,动画钩子函数,Animate第三方动画库,TransitionGroup列表动画
    mac电脑zsh: command not found: adb
  • 原文地址:https://blog.csdn.net/m0_71674778/article/details/126054661