java项目实践-cookie-session-day18
1. cookie
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项目实践-cookie-session-day18的更多相关文章
- 一次从0到1的java项目实践清单
虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...
- Java web学习 Cookie&&Session
cookie&&session 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会 话技术就是记录这次会话中客户端的状态与数据的. 会话技术分为Coo ...
- 一份从0到1的java项目实践清单
虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...
- java ->会话技术Cookie&Session
会话技术Cookie&Session 会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户 ...
- Django项目之cookie+session
原文:https://www.cnblogs.com/sss4/p/7071334.html HTTP协议 是短连接.且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览 ...
- 【java项目实践】具体解释Ajax工作原理以及实现异步验证username是否存在+源代码下载(java版)
一年前,从不知道Ajax是什么,伴随着不断的积累,到如今常常使用,逐渐有了深入的认识. 今天,假设想开发一个更加人性化,友好,无刷新,交互性更强的网页,那您的目标一定是Ajax. 介绍 在具体讨论Aj ...
- Java项目登录报Session Error
在web.xml文件添加下面红色代码即可,注意:添加代码后,格式化一下代码. <servlet> <servlet-name>dwr-invoker</se ...
- Java Web Application使Session永不失效(利用cookie隐藏登录)
在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...
- java项目使用memcache实现session共享+session基础
本文章主要目的是配置session共享,为了巩固基础,捎带介绍了一些基础知识(网上搜索后觉得最全面的特引过来,节省时间),基础扎实的可以自动忽略. 基础篇: 1.了解java web中的session ...
- 【项目实践】一文带你搞定Session和JWT的登录认证方式
以项目驱动学习,以实践检验真知 前言 登录认证,估计是所有系统中最常见的功能了,并且也是最基础.最重要的功能.为了做好这一块而诞生了许多安全框架,比如最常见的Shiro.Spring Security ...
随机推荐
- GHOST 系统安装教程 轻松一键,系统恢复到最佳状态
硬盘安装系统 安装前准备 1.保证能够正常进入系统: 2.下载Ghost系统镜像文件: 3.下载镜像安装器: 安装步骤 1.下载Ghost系统镜像"Win7_x64_Pure_5.07.GH ...
- 10个必备的 async/await 工具函数
| 当谈到异步编程时,async/await是JavaScript中常用的功能之一.下面是10个常用的await和async函数示例,以及对它们的代码用途的解析: 1.异步获取数据 async fun ...
- Kernel Memory 入门系列:生成并获取文档摘要
Kernel Memory 入门系列:生成并获取文档摘要 前面在RAG和文档预处理的流程中,我们得到一个解决方案,可以让用户直接获取最终的问题答案. 但是实际的业务场景中,仍然存在一些基础的场景,不需 ...
- lottie 动画在 vue 中的使用
前言 最近我所负责的项目中,我采用了动画效果,并开始使用 gif 来实现.然而,在实践过程中,我发现 gif 格式的动画在 git 中出现了明显的锯齿感,这让我非常困扰.为了追求更完美的表现效果,我最 ...
- 使用Mybatis自定义插件实现不侵入业务的公共参数自动追加
背景 后台业务开发的过程中,往往会遇到这种场景:需要记录每条记录产生时间.修改时间.修改人及添加人,在查询时查询出来. 以往的做法通常是手动在每个业务逻辑里耦合上这么一块代码,也有更优雅一点的做法是写 ...
- 2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数, 如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列。 对于 0 <
2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数, 如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列. 对于 0 & ...
- electron入门之创建新窗口remote(一)
electron入门到入土,从渲染线程中创建新窗口.2022-03-21入门版本17.1.2 electron重要概念,只有一个主线程,其他都是渲染进程或者叫子线程,他们不能直接相互操作,可以通过ip ...
- 【OpenVINO】 使用 OpenVINO CSharp API 部署 PaddleOCR 项目介绍
前言: 在之前的项目中,我们已经使用 OpenVINOTM CSharp API 部署 PaddleOCR 全系列模型,但随着PaddleOCRv4版本发布以及OpenVINO CSharp AP ...
- 26、Flutter中命名路由
Flutter 中的命名路由 main.dart中配置路由 void main() { runApp(MaterialApp( theme: ThemeData( appBarTheme: const ...
- 云小课|教你如何使用RDS for PostgreSQL插件
摘要:本文介绍RDS for PostgreSQL支持的插件及不同插件的创建.删除或使用方法. 本文分享自华为云社区<[云小课][第42课]RDS for PostgreSQL插件介绍>, ...