热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2.3会话管理和生成验证码

文章目录会话管理Cookie简介Session生成验证码-导入jar包-编写Kaptcha配置类实现刷新效果DEBUG会话管理Cookie简介https:developer.m


文章目录

  • 会话管理
    • COOKIE简介
  • Session
  • 生成验证码
    • -导入jar包
    • -编写Kaptcha配置类
    • 实现刷新效果
  • DEBUG






会话管理


COOKIE简介

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/COOKIEs

HTTP COOKIE(也叫 Web COOKIE 或浏览器 COOKIE)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。COOKIE 使基于无状态的HTTP协议记录稳定的状态信息成为了可能。

COOKIE 主要用于以下三个方面:


  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

在这里插入图片描述

1、浏览器第一次向服务器发起请求,服务器接受请求,并且应答头部带上COOKIE;

2、浏览器接收到服务器的响应,在本地创建COOKIE;

3、浏览器第二次向服务器发起请求会带上之前的COOKIE

在这里插入图片描述

//指定路径,Test下的方法都在这个路径下访问
@Controller
@RequestMapping("/Test")
public class TestController {//第一次请求设置COOKIE@RequestMapping(path = "/COOKIE/set",method = RequestMethod.GET)@ResponseBodypublic String setCOOKIE(HttpServletResponse httpServletResponse){//创建一个新COOKIE,存储一个随机字符串COOKIE COOKIE=new COOKIE("code", CommunityUtil.generateUUID());//设置COOKIE的访问路径 只有访问这些路径才会带上COOKIECOOKIE.setPath("/community/Test");//设置COOKIE存活时间 秒为单位COOKIE.setMaxAge(60*10);//向response中添加COOKIE,发送COOKIEhttpServletResponse.addCOOKIE(COOKIE);return "set COOKIE";}//第二次请求获得COOKIE//@COOKIEValue获取对应的COOKIE值@RequestMapping(path = "/COOKIE/get",method = RequestMethod.GET)@ResponseBodypublic String getCOOKIE(@COOKIEValue("code") String code){System.out.println(code);return "get COOKIE";}
}

在这里插入图片描述


Session

Session存放在服务器端,更加安全但是会增加服务器内存压力

在这里插入图片描述

// session示例@RequestMapping(path = "/session/set", method = RequestMethod.GET)
@ResponseBody
public String setSession(HttpSession session) {session.setAttribute("id", 1);session.setAttribute("name", "Test");return "set session";
}@RequestMapping(path = "/session/get", method = RequestMethod.GET)
@ResponseBody
public String getSession(HttpSession session) {System.out.println(session.getAttribute("id"));System.out.println(session.getAttribute("name"));return "get session";
}

分布式session共享方案:

1、粘性session:在nginx中提供一致性哈希策略,可以保持用户ip进行hash值计算固定分配到某台服务器上,负载也比较均衡,其问题是假如有一台服务器挂了,session也丢失了。

2、同步session:当某一台服务器存了session后,同步到其他服务器中,其问题是同步session到其他服务器会对服务器性能产生影响,服务器之间耦合性较强。

3、共享session:单独搞一台服务器用来存session,其他服务器都向这台服务器获取session,其问题是这台服务器挂了,session就全部丢失。

4、redis集中管理session(主流方法):redis为内存数据库,读写效率高,并可在集群环境下做高可用。

在这里插入图片描述


生成验证码


-导入jar包


com.github.pengglekaptcha2.3.2


-编写Kaptcha配置类

@Configuration
public class KaptchaConfig {@Beanpublic Producer kaptchaProducer() {Properties properties = new Properties();//验证码图像的宽度properties.setProperty("kaptcha.image.width", "100");//验证码图像的高度properties.setProperty("kaptcha.image.height", "40");//验证码生成字体的大小properties.setProperty("kaptcha.textproducer.font.size", "32");properties.setProperty("kaptcha.textproducer.font.color", "0,0,0");//验证码生成的字母的范围properties.setProperty("kaptcha.textproducer.char.string", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYAZ");//验证码的长度properties.setProperty("kaptcha.textproducer.char.length", "4");//采用的干扰类 图片扭曲拉伸properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.NoNoise");DefaultKaptcha kaptcha = new DefaultKaptcha();//加载配置信息Config config = new Config(properties);kaptcha.setConfig(config);return kaptcha;}}

-生成随机字符、生成图片

-写一个请求返回验证码图片


  • 需要把验证码生成的文本保存来校验验证码是否输入正确并且需要在多个值之间传递,因此设置session来保存验证码
  • 先生成验证码文本,在生成图片
  • 将图片输出给浏览器 使用字节流
  • 可以不用手动关闭流,response会关闭

//生成验证码
@RequestMapping(value = "/Kaptcha",method = RequestMethod.GET)
public void getKaptcha(HttpServletResponse httpServletResponse, HttpSession session) {// 生成验证码String text = kaptchaProducer.createText();BufferedImage image = kaptchaProducer.createImage(text);//保存验证码到sessionsession.setAttribute("KaptchaCode",text);//将图片输出给浏览器httpServletResponse.setContentType("image/png");try {ServletOutputStream outputStream = httpServletResponse.getOutputStream();ImageIO.write(image,"png",outputStream);} catch (IOException e) {e.printStackTrace();}
}

实现刷新效果


  • 修改图片访问路径
  • 使用jquery写一个刷新验证码的方法
  • js中定义一个全局变量项目工程名 方便修改
  • P="+Math.random(); 防止浏览器误以为请求路径没变而不发送请求导致无法刷新

var CONTEXT_PATH="/community";

刷新验证码




DEBUG

一开始写COOKIE出现了Thymeleaf解析地址错误的问题,发现原来是COOKIE的路径设置错了,要加上工程路径

COOKIE.setPath("/community/Test");

推荐阅读
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • adfs是什么_培训与开发的概念
    adfs是什么_培训与开发的概念(如您转载本文,必须标明本文作者及出处。如有任何疑问请与我联系me@nap7.com)ADFS相关开发技术的中文资料相对匮乏,之前在弄这个东西的时候 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
author-avatar
mobiledu2502883527
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有