Java全面细致讲解Cookie与Session及kaptcha验证码的使用

目录
  • Cookie
    • 1. 概念
    • 2. 创建Cookie
    • 3. 服务器获取Cookie
    • 4. Cookie的修改
    • 5. Cookie的生命控制
    • 6. Cookie的有效路径Path
    • 7. Cookie应用-免用户名密码登录
  • Session
    • 1. 概念
    • 2. 创建和获取Session
    • 3. Session域数据的存取
    • 4. Session的生命周期的控制
    • 5. 浏览器和Session的关联
  • kaptcha验证码
    • 1. 使用
    • 2. 验证码的切换

Cookie

1. 概念

是服务器通知客户端保存键值对的一种技术。

cookie 是 servlet(服务器) 发送到 Web 浏览器(客户端)的少量信息,这些信息由浏览器保存,然后发送回服务器。

客户端有了 cookie 后,每次请求都发送给服务器

每个 cookie 的大小不能超过 4 KB。

2. 创建Cookie

protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {    req.setCharacterEncoding("utf-8");    resp.setContentType("text/html;charset=utf-8");    //1. 创建Cookie对象    Cookie cookie = new Cookie("key1", "value1");    //2. 通知客户端保存    resp.addCookie(cookie);    resp.getWriter().write("Cookie创建成功");}

3. 服务器获取Cookie

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {    req.setCharacterEncoding("utf-8");    resp.setContentType("text/html;charset=utf-8");    Cookie[] cookies = req.getCookies();    for (Cookie cookie : cookies) {        //System.out.println(cookie);        resp.getWriter().write("Cookie["+ cookie.getName() + " = " + cookie.getValue() + "] <br/>");    }    // 查找特定的Cookie  (项目中会把这个写成工具类)    Cookie need = null;    for (Cookie cookie : cookies) {        if ("key2".equals(cookie.getName())) {            need = cookie;            break;        }    }    if (need != null) { // 不等于null,说明赋过值        resp.getWriter().write("找到了需要的Cookie");    }}

CookieUtils.java

// 查找特定的Cookiepublic static Cookie findCookie(Cookie[] cookies, String name) {    if (cookies == null || name == null || cookies.length == 0) {        return null;    }    for (Cookie cookie : cookies) {        if (name.equals(cookie.getName())) {            return cookie;        }    }    return null;}

4. Cookie的修改

protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) {    // 第一种    // 修改需要先创建同key的Cookie对象,新值直接构造传入就行    Cookie newCookie1 = new Cookie("key1", "newValue1");     resp.addCookie(newCookie1); // 保存修改    // 第二种    Cookie newCookie2 = CookieUtils.findCookie(req.getCookies(), "key2");    if (newCookie2 != null) {        newCookie2.setValue("newValue2"); // !注意不支持中文和一些符号,需要的话可以使用BASE64编码        resp.addCookie(newCookie2);    }}

5. Cookie的生命控制

Cookie的生命控制,即Cookie什么时候销毁

API:setMaxAge(int expiry)

正值表示 cookie 将在经过该值表示的秒数后过期 (关闭浏览器再次访问还在)负值意味着 cookie 不会被持久存储,将在 Web 浏览器退出时删除 (默认是负数,-1)0 值表示马上删除 cookie。

修改后记得 resp.addCookie(cookie);

6. Cookie的有效路径Path

有效路径Path 可以过滤哪些Cookie可以发送给服务器,那些不发。

Path是通过请求的地址来进行有效的过滤

例如:

cookie1 path=/工程路径

cookie2 path=/工程路径/abc

请求地址: (默认是当前的工程路径)

http://ip:port/工程路径/a.html 则cookie1会发送给服务器,cookie2不发送

http://ip:port/工程路径/abc/d.html cookie2,cookie1都发送!!

Cookie cookie = new Cookie("path1", "path1");cookie.setPath(req.getContextPath() + "/abc"); //  ->  /工程路径/abc

7. Cookie应用-免用户名密码登录

前端:login.jsp

<form action="/dynamicobject/loginServlet" method="post">    用户名: <input type="text" name="username" value="${cookie.username.value}"> <br/>    密码: <input type="password" name="password" value="${cookie.password.value}"> <br/>    <input type="submit" value="登录"></form>

后端:LoginServlet.java

public class LoginServlet extends HttpServlet {    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {        String username = req.getParameter("username");        String password = req.getParameter("password");        // 这里可以去数据库查找,我们这里写死了        if ("sutong".equals(username) && "123456".equals(password)) {            Cookie c1 = new Cookie("username", username);            c1.setMaxAge(60 * 60 * 24 * 7); // 一周内有效            resp.addCookie(c1);            Cookie c2 = new Cookie("password", password); // 一般密码都会加密的            c2.setMaxAge(60 * 60 * 24 * 7);            resp.addCookie(c2);            System.out.println("登陆成功!");        } else {            System.out.println("登陆失败!");        }    }}

Session

1. 概念

Session是一个接口(HttpSession),就是会话。

用来维护一个客户端和服务器之间关联的一种技术。

每个客户端都有它自己的一个Session。

Session会话中,我们经常用来保存用户登录之后的信息。

2. 创建和获取Session

创建和获取都是一个函数 request.getSession()

第一次调用是创建Session,之后调用都是获取前面创建好的Sesson会话对象

isNew() : 判断是不是刚创建出来的(是不是新的)

getId() : 每个会话都会有个唯一id值

protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws IOException {    req.setCharacterEncoding("utf-8");    resp.setContentType("text/html;charset=utf-8");    HttpSession session = req.getSession(); // 创建或获取Session    boolean flag = session.isNew(); // 判断是否刚创建    String id = session.getId(); // id    resp.getWriter().write("得到的Session的Id是" + id + "<br/>");    resp.getWriter().write("这个Session是否刚创建" + flag);}

3. Session域数据的存取

存取:

HttpSession session = req.getSession();session.setAttribute("key1", "value1");

获取:

String att = (String) req.getSession().getAttribute("key1");  // 返回的是Object

4. Session的生命周期的控制

API:public void setMaxInactiveInterval(int interval)

设置Session的超时时间(秒为单位),超过时长就会被销毁(是最大不活跃间隔!)

正数是超时时长,负数是永不超时。注意:0不是立即销毁,立即销毁是session.invalidate()

获取方法:public int getMaxInactiveInterval()

默认是1800秒,即半小时。

因为在Tomcat的服务器的配置文件web.xml中,有写<session-timeout>30</session-timeout>

如果我希望我们工程的Session不想是30分钟,可以在自己项目下的web.xml做以上相同的配置,就可以修改工程下所有Session的默认超时时长了。

<session-config>    <session-timeout>20</session-timeout> <!-- 分钟为单位--></session-config>

如果只想修改个别Session的超时时长,则需要使用session.setMaxInactiveInterval(interval) 方法

超时时长:指的是客户端两次请求的最大间隔时长!!

5. 浏览器和Session的关联

当客户端没有Cookie信息的时候,发送请求,服务器会(调用req.getSession())创建Session对象,每次创建Session会话的时候,都会创建一个Cookie对象,这个Cookie对象的key永远是:JSESSIONID,value是新创建出来的Session的Id。然后通过响应头返回给客户端。

当客户端有了这个Cookie之后,每次请求会把Session的Id以Cookie的形式发送给服务器,然后服务器这边会通过Id查找自己之前创建好的Session对象(调用req.getSession()),并返回。

如果上次创建的Session的没过期的时候,我们手动把Cookie信息删掉的话,服务器就没法通过得到id,就没法找到之前的那个Session对象,客户端发送请求的时候,服务器则会重新创建新的Session会话,重复上面的操作。

Session 技术,底层其实是基于 Cookie 技术来实现的

kaptcha验证码

验证码可以解决表单重复提交的情况

1. 使用

我们可以使用第三方的jar包,谷歌验证码,kaptcha-2.3.2.jar

导包在 web.xml 中去配置用于生成验证码的Servlet程序 (即com.google.code.kaptcha.servlet.KaptchaServlet这个类,谷歌写的)

<servlet>    <servlet-name>KaptchaServlet</servlet-name>    <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class></servlet><servlet-mapping>    <servlet-name>KaptchaServlet</servlet-name>    <!-- 注意这里改的访问名(看起来像个图片),这样的话访问这个就是自动生成验证码和图片,并保存到Session域-->     <url-pattern>/kaptcha.jpg</url-pattern> </servlet-mapping>

在表单中使用 img标签去显示验证码并使用它

<form action="" method="post">    用户名:<input type="text" name="username"> <br/>    密码:<input type="password" name="password"> <br/>    验证码:<input type="text" name="code"> <br/>    <img id="code_img" src="http://localhost:8080/book/kaptcha.jpg" alt="图片找不到"> <br/>    <input type="button" value="注册"></form>

在服务器获取谷歌生成的验证码和客户端发来的验证码比较使用 (获取后记得马上删除)

获取谷歌生成的验证码 :req.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);

获取用户提交的验证码:req.getSession().getAttribute("code")

2. 验证码的切换

// 给验证码图片绑定单机事件$("#code_img").click(function () {    // 但这样每次发一样的请求,可能会被浏览器的缓存导致验证码无法改变,    // 缓存是根据工程名后面的资源名和参数产生的,所以我们可以在后面加上一个随机的参数跳过缓存//this.src = "http://localhost:8080/book/kaptcha.jpg";         this.src = "http://localhost:8080/book/kaptcha.jpg?d=" + new Date(); // 可以加个时间戳});

到此这篇关于Java全面细致讲解Cookie与Session及kaptcha验证码的使用的文章就介绍到这了,更多相关Java Cookie Session kaptcha内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java验证码组件kaptcha使用方法

    使用方法: 项目中导入kaptcha-2.3.jar包在web.xml里面新增:  复制代码 代码如下: <!-- 登陆验证码Kaptcha -->    <servlet>        <servlet-name>Kaptcha</servlet-name>        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>   

  • java中的session对象如何获取

    目录 获取session对象 1.在springmvc中 2.通过ServletActionContext获取 在session存取值和对象的方法 获取session对象 1.在springmvc中 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); 2.通过ServletActionContext获取 HttpSer

  • Java 模拟cookie登陆简单操作示例

    本文实例讲述了Java 模拟cookie登陆简单操作.分享给大家供大家参考,具体如下: 最近在做将禅道上的功能接口做到手机端,在做登陆的时候,看了禅道的源码,是由cookie来登陆,所以要做一个模拟cookie登陆的接口,将拿到的cookie放到每次接口请求的头部中去,就可以正常访问了. import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; /** * @Author:

  • javaWeb使用Kaptcha组件生成验证码

    javaWeb之使用Kaptcha组件使用验证码 web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="htt

  • Java后端Cookie实现(时间戳)代码实例

    我们来简单实现一个cookie. 一.简单介绍 Cookie 是一些数据, 存储于你电脑上的文本文件中. 当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息. Cookie 的作用就是用于解决 "如何记录客户端的用户信息": 当用户访问 web 页面时,他的名字可以记录在 cookie 中. 在用户下一次访问该页面时,可以在 cookie 中读取用户访问记录 (博客园cookie界面) 二.简单实现 0.maven引入依赖 servlet和jsp的依

  • Cookie在Java中的使用

    什么是Cookie 在现实生活中,当顾客第一次在超市购物,通常服务员会询问是否办理一张会员卡来积分以便日后折扣等福利活动.会员卡会记录顾客的姓名.积分.消费记录等信息,如果顾客要参与超市的福利活动等都需要提供会员卡,服务员在后台刷卡查询即可知道是哪个用户在使用会员卡. 现在将现实生活中的案例中的角色互换一下. 当用户没有在Web服务器登记过用户信息,而使用网站提供的需登录的服务时,服务器会告知浏览器跳转到登陆页面进行用户信息的登记操作,登录完成之后,浏览器向服务器发起一次登陆请求,服务器将用户的

  • Java中Session的详解

    目录 1.什么是session: 2.session的经典应用场景: 3.session中常用的方法 4.举例 5.session与cookie的区别 1.什么是session: 服务器会给每一个用户(浏览器)创建一个session对象 一个session独占一个浏览器,只要浏览器不关闭,这个session就一直存在 session称为会话控制,存储用户会话所需的属性和配置信息,这样,用户在应用程序的web页面跳转时,存储在session对象中的用户信息不会丢掷,而是在整个用户会话中一直保持下去

  • java中的session对象及其常用方法小结

    session对象用于在会话范围内,记录每个客户端的访问状态,以便于跟踪每个客户端的操作状态,在会话存储的信息,在浏览器发出后续请求时可以获取这些会话的有效数据. 在jsp页面中可以直接使用session对象(jsp的内置对象),也可以通过pageContext.getSession()或者request.getSession重新回去session对象. session可以保存用户的信息和实现购物车等功能. HTTP协议是一种无状态协议,客户向服务器发出的请求request,然后服务器返回响应r

  • java下使用kaptcha生成验证码

    kaptcha是一个简单好用的验证码生成工具,通过配置,可以自己定义验证码大小.颜色.显示的字符等等.下面就来讲一下如何使用kaptcha生成验证码以及在服务器端取出验证码进行校验. 一.搭建测试环境 1.1.创建Web测试项目 新建一个Web项目,并将kaptcha-2.3.2.jar放在项目的WEB-INF/lib目录下,如下图所示: 1.2.在web.xml文件配置生成验证码的KaptchaServlet KaptchaServlet的详细配置如下: <?xml version="1

  • Java全面细致讲解Cookie与Session及kaptcha验证码的使用

    目录 Cookie 1. 概念 2. 创建Cookie 3. 服务器获取Cookie 4. Cookie的修改 5. Cookie的生命控制 6. Cookie的有效路径Path 7. Cookie应用-免用户名密码登录 Session 1. 概念 2. 创建和获取Session 3. Session域数据的存取 4. Session的生命周期的控制 5. 浏览器和Session的关联 kaptcha验证码 1. 使用 2. 验证码的切换 Cookie 1. 概念 是服务器通知客户端保存键值对的

  • Java全面细致讲解类与对象

    目录 类和对象的关系 类和对象的实例化 static关键字 private实现的封装 构造方法 this关键字 代码块 匿名对象 小结 类和对象的关系 类就是一类对象的统称.对象就是这一类具体化的一个实例. (对象是类的实例化) 对象是什么? 此对象非彼对象!!!说到对象就要提到过程. 面向过程:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题.面向过程注重的是过程,在整个过程中所涉及的行为,就是功能. 面向对象:JAVA是基于面向对象的,关注的是对象,将一件事情

  • Java全面细致讲解final的使用

    目录 一.理解 二.作用 1. 修饰-类 2. 修饰-方法 3. 修饰-变量 3.1 修饰-成员变量(属性) 3.2 修饰-局部变量 三.经典题目 一.理解 final:最终的 二.作用 final 可以用来修饰的结构:类.方法.变量 1. 修饰-类 final 用来修饰一个类,表示此类不能被其它类所继承,提高安全性,提高程序的可读性. 比如:String类.System类.StringBuffer类… 代码演示: final class A{}class B extends A{ //错误,不

  • Java全面细致讲解Wrapper的使用

    目录 一.概述 二.作用 三.使用 1. 基本数据类型-包装类的实例(装箱) 2. 包装类-基本数据类型(拆箱) 3. String-基本数据类型/包装类 4. 基本数据类型/包装类-String 5. 转换图 四.经典题目 一.概述 针对八种基本数据类型定义相应的引用类型—包装类(封装类). 二.作用 有了类的特点,就可以调用类中的方法,Java才是真正的面向对象. 八种基本数据类型与其包装类的对应关系: 基本数据类型 包装类 byte Byte short Short int Integer

  • Java全面细致讲解==和equals的使用

    目录 equals与== 1. ==的使用 1.1 概述 1.2 代码演示 2. equals的使用 2.1 概述 2.2 代码演示 3. ==和equals的区别 3.1 概述 3.2 代码演示 上篇博文:Java-多线程的使用 equals与== 1. ==的使用 1.1 概述 用于基本类型比较值时:只要两个变量的值相等,即为true. 用于引用类型比较引用(是否指向同一个对象)时,比较两个对象的地址值是否相同,即两个引用是否指向同一个对象实体,只有指向同一个对象时,==才返回true. 用

  • Java Web学习之Cookie和Session的深入理解

    cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于才服务器端保持状态的方案在客户端也需要保存一个标识,所以session 机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择 会话cookie和持久cookie的区别 如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了.这种生命期为浏览会话期

  • 基于java中cookie和session的比较

    cookie和session的比较 一.对于cookie: ①cookie是创建于服务器端 ②cookie保存在浏览器端 ③cookie的生命周期可以通过cookie.setMaxAge(2000);来设置,如果没有设置setMaxAge, 则cookie的生命周期当浏览器关闭的时候,就消亡了 ④cookie可以被多个同类型的浏览器共享  可以把cookie想象成一张表 比较: ①存在的位置: cookie 存在于客户端,临时文件夹中 session:存在于服务器的内存中,一个session域对

  • cookie、session和java过滤器结合实现登陆程序

    cookie.session和过滤器通常都是用在web应用中,cookie和session用来保存一定的数据,过滤器Filter则是在浏览器发出请求之后,而后台执行特定的请求之前发生一定的作用.之所以把这三个放一起,是因为有很多时候都会是把他们结合在一起使用,例如有些登陆程序. cookie是浏览器的机制,session是服务器的机制,但是实际上cookie也是由服务器生成的,之后返回给浏览器的,并不是浏览器本身生成.当浏览器发送某个请求时,如果拥有有效的cookie则会把这个cookie带在一

  • Java中Cookie和Session的那些事儿

    Cookie和Session都是为了保持用户的访问状态,一方面为了方便业务实现,另一方面为了简化服务端的程序设计,提高访问性能.Cookie是客户端(也就是浏览器端)的技术,设置了Cookie之后,每次访问服务端,请求中都会带上Cookie:Session是服务端技术,在服务端存储用户的访问信息. 使用Cookie传递信息,随着Cookie个数增多和访问量增大,它占用的带宽会越来越大:使用Session保存信息,最大的弱点就是不容易在多台服务器之间共享. 1 Cookie 通俗地讲,当用户使用H

  • Java中Cookie和Session详解及区别总结

    目录 会话技术 Cookie 概念 快速入门 实现原理 cookie的细节 Cookie的特点和作用 案例:记住上一次访问时间 分析 代码实现 Session 概念 快速入门 原理 细节 Session的特点 Session与Cookie的区别 会话技术 会话:一次会话中包含多次请求和响应. 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求间,共享数据 方式: 客户端会话技术:Cookie 服务器端会话技术:Session Cookie

随机推荐