广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java全面细致讲解Cookie与Session及kaptcha验证码的使用
  • 706
分享到

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

2024-04-02 19:04:59 706人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录Cookie1. 概念2. 创建Cookie3. 服务器获取Cookie4. Cookie的修改5. Cookie的生命控制6. Cookie的有效路径Path7. Cookie

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

// 查找特定的Cookie
public 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什么时候销毁

apisetMaxAge(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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java全面细致讲解Cookie与Session及kaptcha验证码的使用

本文链接: https://www.lsjlt.com/news/151883.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java全面细致讲解Cookie与Session及kaptcha验证码的使用
    目录Cookie1. 概念2. 创建Cookie3. 服务器获取Cookie4. Cookie的修改5. Cookie的生命控制6. Cookie的有效路径Path7. Cookie...
    99+
    2022-11-13
  • Java的Cookie、Session及kaptcha验证码如何使用
    这篇文章主要讲解了“Java的Cookie、Session及kaptcha验证码如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的Cookie、Session及kaptcha验...
    99+
    2023-07-02
  • Java全面细致讲解Wrapper的使用
    目录一、概述二、作用三、使用1. 基本数据类型-包装类的实例(装箱)2. 包装类-基本数据类型(拆箱)3. String-基本数据类型/包装类4. 基本数据类型/包装类-String...
    99+
    2022-11-13
  • Java全面细致讲解final的使用
    目录一、理解二、作用1. 修饰-类2. 修饰-方法3. 修饰-变量3.1 修饰-成员变量(属性)3.2 修饰-局部变量三、经典题目一、理解 final:最终的 二、作用 final ...
    99+
    2022-11-13
  • Java全面细致讲解==和equals的使用
    目录equals与==1. ==的使用1.1 概述1.2 代码演示2. equals的使用2.1 概述2.2 代码演示3. ==和equals的区别3.1 概述3.2 代码演示上篇博...
    99+
    2022-11-13
  • C语言全面细致讲解单双精度float与double的使用方法
    目录一、float与double类型介绍二、例题三、总结一、float与double类型介绍 代码: #include <stdio.h> int main (void)...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作