首页 > 编程语言 >java项目实践-cookie-session-day18

java项目实践-cookie-session-day18

时间:2023-10-19 23:16:23浏览次数:31  
标签:java String request write session cookie response

目录

cookie 在客户端(浏览器)中保持http状态的 信息技术
本质 是浏览器缓存
每次发请求的时候 在请求头中 带给 服务端

常见的应用场景:实现7天免登录

浏览器 F12

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


        Cookie cookie = new Cookie("0001", "beijing");
        response.addCookie(cookie);
        response.getWriter().write("learning cookie !");

cookie的获取

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

        Cookie[] cookies = request.getCookies();

        if (cookies.length>0){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();

                System.out.println("key:"+ name);
                System.out.println("value:"+ value);
            }

        }

    }
}

使用之前的用户登录项目
实现7天免登录

对于之前的
loginServlet 登录成功添加cookie

//            response.getWriter().write("welcome:" + u.getName());
            Cookie cookie = new Cookie("userid", u.getId()+"");
            cookie.setMaxAge(7*24*3600);
            response.addCookie(cookie);
            
            response.sendRedirect("hello");

增加一个CookieServlet是实现/ck接口

package com.msb.control;

import com.msb.entity.User;
import com.msb.service.UserService;
import com.msb.service.impl.UserServiceImpl;

import javax.servlet.ServletException;
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.sql.SQLException;

/**
 * @Auther: jack.chen
 * @Date: 2023/10/19 - 10 - 19 - 21:07
 * @Description: ${PACKAGE_NAME}
 * @version: 1.0
 */
public class CookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        this.doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("gbk");
        UserService userService = new UserServiceImpl();
        Cookie[] cookies = request.getCookies();
        if (cookies!=null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if ("userid".equals(name)){
                    String userid = cookie.getValue();
                    // 对 userid 校验
                    try {
                        User u = userService.getUserById(Integer.valueOf(userid));
                        if (u!=null){
                            response.sendRedirect("hello");
                        }else{
                            response.sendRedirect("page");
                        }
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }
                    return;

                }
            }
                response.sendRedirect("page");
        }else{
            response.sendRedirect("page");
        }

    }
}

/ck-->/page 未登录
/ck --> /hello 已经登录

2. session

登录成功之后 再访问其他的页面 不需要再带上 用户名密码 就能直接访问
现实的例子:理发店 办理会员卡
第一种方式:给客户留一张 卡片--客户端
第二种方式:之后只要 报卡号 或者手机号--服务端

session是用于解决用户访问不同页面时 带上sessionid

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("sess api do get ");
        HttpSession session = request.getSession();
        System.out.println("session id:"+session.getId());

        response.getWriter().write("learn session");
    }

    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");



        System.out.println("sess api do get ");
        HttpSession session = request.getSession();
        System.out.println("session id:"+session.getId());

        //设置有效期
//        session.setMaxInactiveInterval(5);
        // 强制失效
//        session.invalidate();

        session.setAttribute("111", "beijing");
        response.getWriter().write("learn session");
    }
        Object attribute = (String)session.getAttribute("111");
        response.getWriter().write("get session attr:"+attribute);

实现登录页面 欢迎xxxx登录

            HttpSession session = request.getSession();
            session.setAttribute("name", u.getName());

        HttpSession session = request.getSession();
        String name = (String)session.getAttribute("name");

3. servletcontext

不同用户 数据传递 数据共享 ---当前访问人数 当前帖子的的在线阅读人数

被web项目中所有的servlet访问
服务器创建 一个项目只能有一个servletcontext对象
项目的任意位置 获取到的是同一个对象
该对象所有用户共有

servlet1

        ServletContext servletContext = this.getServletContext();
//        ServletContext servletContext = this.getServletConfig().getServletContext();
//        ServletContext servletContext = request.getSession().getServletContext();
        //三种方式获取的都是同一个对象

        servletContext.setAttribute("111", "beijing");
        response.getWriter().write("servlet context 1");

servlet2

        ServletContext servletContext = this.getServletContext();

        String attribute = (String)servletContext.getAttribute("111");

        System.out.println(attribute);
        response.getWriter().write("servlet context 2");

公共设置

web.xml中的公共配置

    <context-param>
        <param-name>beijing</param-name>
        <param-value>beautiful</param-value>
    </context-param>
        String beijing = (String)servletContext.getInitParameter("beijing");
        System.out.println(beijing);

如何实现 当前访问量的统计

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");


        ServletContext context = this.getServletContext();
        Integer num = (Integer) context.getAttribute("num");
        if(num==null){
            context.setAttribute("num", 1);
        }else{
            num++;
            context.setAttribute("num", num);
        }
        PrintWriter writer = response.getWriter();
        writer.write("<html>");
        writer.write("<head>");
        writer.write("</head>");
        writer.write("<body>");
        writer.write("用户访问量:"+context.getAttribute("num"));
        writer.write("</body>");
        writer.write("</html>");

    }

4.servletConfig

每个servlet 单独获取自己的属性配置

        ServletConfig servletConfig = this.getServletConfig();
        String china = servletConfig.getInitParameter("china");
        System.out.println("====="+china+"==");

标签:java,String,request,write,session,cookie,response
From: https://www.cnblogs.com/cavalier-chen/p/17775926.html

相关文章

  • NodeJS之父Ryan Dahl:我不想被认为是一个JavaScript专家
    NodeJS之父RyanDahl:我不想被认为是一个JavaScript专家    被称为Node之父的RyanDahl在2012年离开了Node项目,后来加入Google的Brain团队,从事深度学习方面的研究,主要专注在图像的着色和超解像技术上。拥有深厚数学功底的Ryan经历了从Web开发到深度学习的跨越,还主导了......
  • Javaweb(十一)
    1、实现登录操作时提示的错误信息可封装在request域中,如下所示:然后再JSP中访问域中的数据:<divid="errorMsg">${login_msg}${register_msg}</div>获取cookie中的值:2、Filter概念:Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的......
  • Redis代替session需要考虑的问题
    Redis代替session需要考虑的问题◆选择合适的数据结构◆选择合适的key◆选择合适的存储粒度......
  • Java语法之运算符二(附练习和答案)
    10.自增自减运算符分类:++自增运算符--自减运算符++:就是把变量里面的值+1--:就是把变量里面的值-1使用方式:放在变量的前面,我们叫做先++。比如:++a放在变量的后面,我们叫做后++。比如:a++注意点:不管是先++,还是后++。单独写在一行的时候,运算结果是一模一样的。案例://++inta=10;......
  • java学习_03
    运算符对字面量或者变量进行操作的符号表达式用运算符把字面量或者变量连接起来,符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表达式。算数运算符加+、减-、乘*、除/、取模%整数参与计算,结果只能得到整数小数参与计算,结果......
  • Java基础 方法引用
    方法引用的概念:把已经有的方法拿过来用,当作函数式接口中抽象方法的方法体 方法引用需要满足的条件:1.引用处必须是函数式接口2.被引用的方法必须是已经存在的3.被引用方法的形参和返回值需要跟抽象方法保持一致4.被引用方法的功能要满足当前需求 ::是方法引用符,是......
  • 【Java】Vert.x Jackson 序列化后日期数据正常展示
    有段时间没有更新了,年尾嘛大家都懂的。其实最近有个想法,想将自己的vtx_fw框架给开源了。但开源之前还是有很多收尾的工作需要做的(总不能让各位笑话吧o(╥﹏╥)o),这不今天就发现了一个问题,立刻就归纳一下给各位分享。这个问题就是Vert.x框架中日期类型数据在Jackson序列化下的......
  • Java资源文件获取方法详解:从 Classpath 到 Web 应用程序
    在Java开发中,访问和读取资源文件是一个常见的需求。这些资源可以是配置文件、图像、音频、视频、文本文件等。在Java中,获取资源文件有多种方式,包括直接通过类路径(Classpath)访问,或者通过Web应用程序的上下文路径(ContextPath)访问。以下我们将详细探讨这些方法。通过类路径(Classpath)......
  • Java拾贝第六天——包装类
    Java拾贝不建议作为0基础学习,都是本人想到什么写什么基本数据类型怎么变化引用数据类型(对象)Java为每种基本类型都提供了对应的包装类型:基本数据类型包装类intIntegercharCharactershortShortlongLongfloatFloatdoubleDoublebooleanBoolean......
  • java程序题
    指数计算问题1.有一对兔子,从出生后第3个月起每个月都生兴对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?程序分析;兔子的规律为数列1,1,2,3,5,8,13,21..... 2.水仙花数打印出所有的"水仙花数",所谓"水仙花数“是指一个三位数,其各位数......