Web保存状态的手段(请求转发,Cookie的使用)

news2024/10/19 11:42:58

一,掌握请求转发

请求转发与重定向技术都是跳转页面的途径,但是这两个技术之间也有不同之处。

请求转发更倾向于servlet跳转jsp,而重定向更倾向于servlet跳转到servlet。

1. 常用页面跳转方法2:请求转发(重写URL)
 RequestDispatcher接口对象允许将请求转发到其他服务器资源
2. javax.servlet.RequestDispatcher接口的常用方法
 void forward(HttpServletRequest,HttpServletResponse) throws ServletException,java.io.IOException
 说明:在服务器上转发请求到另一个资源(Servlet, JSP, HTML)
3. javax.servlet.ServletContext接口的常用方法
 RequestDispatcher getRequestDispatcher(String path)
 说明:一个RequestDispatcher对象可以用来转发请求到资源或包含在响应中的资源,资源可以是动态或静态的。
 参数说明:path-转发路径
4. 通过HttpServletRequest接口中的方法设置/获取参数
 setAttribute(String name,Object value)
 getAttribute(String name)

package csdn;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/cs")
public class CheckServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        if (RegisterServlet.map.get(username) != null & RegisterServlet.map.get(username).equals(password)) {

            req.getRequestDispatcher("welcome.jsp").forward(req,resp);

        } else {

            req.getRequestDispatcher("login2.jsp").forward(req,resp);
            
        }
    }
}

效果跟使用重定向的效果是一样的

5.重定向与请求转发对比

二,Web中保持状态的手段

1.Cookie的使用

1. 如何实现“两周内自动登录”功能?

Cookie:保存到客户端的(多是文本文件),与客户端相关,以“key-value”对的形式保存数据

  •  设置过期时间
  •  存储在硬盘上(例:IE)
  •  可以在不同的浏览器进程间共享,关闭后再次打开浏览器cookie依然有效

注:客户端可以阻止服务器写入Cookie

1. 创建Cookie:

  •  javax.servlet.http.Cookie
  •  new Cookie(name,value)

2. Cookie类的常用方法:

  •  String getName()
  •  返回cookie的名称,在创建后名称不能改变
  •  void setValue(String value)/String getValue()
  •  设置/返回cookie的值
  •  void setMaxAge(int age)
  •  设置cookie的最大值(秒)

3. 其他常用方法

  •  void addCookie(Cookie)
  •  接口HttpServletResponse中的方法
  •  响应中指定的cookie,此方法可以多次调用来设置多个cookie
  •  Cookie[] getCookies()
  •  接口HttpServletRequest中的方法
  •  读取客户端的所有Cookie,返回一个Cookie数组;如果没有cookie返回null
Map<String,String>map=new HashMap<>();
        map.put("admin","123");
        map.put("test","456");
        map.put("abc","xyz");


        //通过用户名,去map中查找密码,如果用户名存在,则可以找到,否则为空
        String x=map.get(u);
        //Set<String> k=map.keySet();
        if (x!=null&&x.equals(s)/*k.contains(u) && map.get(k).equals(s)*/) {
            //auto!=null表示勾选了自动登录
            if (auto!=null){
                //我们使用login作为cookie的键,用这个cookie来实现自动登录
                Cookie c=new Cookie("login",u);
                c.setMaxAge(60);
                resp.addCookie(c);
            }
<%--
  Created by IntelliJ IDEA.
  User: ***
  Date: 2024/7/19
  Time: 10:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>

<%
    Cookie[] cookies = request.getCookies();
    if (cookies!=null){
        for (Cookie c:cookies){
            String name = c.getName();
            //login这个cookie是我们用来做自动登陆的,如果找到了他,说明我们之前选过自动登录并且还有效
            if (name.equals("login")){
                session.setAttribute("abc",c.getValue());
                response.sendRedirect("welcome.jsp?name="+c.getValue());
            }
        }
    }

%>

<form action="dbCheck" method="post">
    用户名:<input type="text" name="userName">
    <br/>
    密码:<input type="password" name="password">
    <br/>
    <input type="checkbox" name="autoLogin" value="1">两周内自动登录
    <input type="submit" value="登录">
</form>

</body>
</html>

我们要使用js在这里定义cookie数组,将自动登录的用户名和密码保存在这里

这是一段关于Cookie的代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2218448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot+Vue+uniapp微信小程序的教学质量评价系统的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

细胞力学需测量,多种方法齐上场,优劣互补要明了

大家好&#xff01;今天我们来了解细胞力学方法的比较研究——《A comparison of methods to assess cell mechanical properties》发表于《Nature Methods》。细胞力学对细胞的多种功能至关重要&#xff0c;然而不同测量方法得到的结果差异较大。本次研究选取了MCF-7细胞&…

用Java爬虫API,轻松获取taobao商品SKU信息

在电子商务的世界里&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;是商品管理的基础。对于商家来说&#xff0c;SKU的详细信息对于库存管理、价格策略制定、市场分析等都有着重要作用。taobao作为中国最大的电子商务平台之一&#xff0c;提供…

JavaSE——集合4:List接口实现类—LinkedList

目录 一、LinkedList的全面说明 二、LinkedList的底层操作机制 (一)LinkedList添加结点源码 (二)LinkedList删除结点源码 三、LinkedList常用方法 四、ArrayList与LinkedList的选择 一、LinkedList的全面说明 LinkedList底层实现了双向链表和双端队列的特点可以添加任意…

【热门】用ChatGPT做智慧农业云平台——农业ERP管控系统

随着科技的进步,原有农业种植方式已经不能满足社会发展的需要,必须对传统的农业进行技术更新和改造。经过多年的实践,人们总结出一种新的种植方法——温室农业,即“用人工设施控制环境因素,使作物获得最适宜的生长条件,从而延长生产季节,获得最佳的产出”。这种农业生产方式…

“智改数转”转了什么?

万界星空科技专门针对数字化改造申报的MES系统具有显著的技术优势和实施效果&#xff0c;能够为制造型企业提供全方位、高效、可靠的数字化转型支持。项目合作可以私信或者百度上海万界星空科技官网。 “智改数转”是一个综合性的过程&#xff0c;涉及企业多个方面的转型和升…

随机抽取学号

idea 配置 抽学号 浏览器 提交一个100 以内的整数。&#xff0c;后端接受后&#xff0c;根据提供的整数&#xff0c;产生 100 以内的 随机数&#xff0c;返回给浏览器&#xff1f; 前端&#xff1a;提供 随机数范围 &#xff0c;病发送请求后端&#xff1a;处理随机数的产生&…

C 408—《数据结构》算法题基础篇—链表(下)

目录 Δ前言 一、两个升序链表归并为一个降序链表 0.题目&#xff1a; 1.算法设计思想&#xff1a; 2.C语言描述&#xff1a; 3.算法的时间和空间复杂度&#xff1a; 二、两个链表的所有相同值结点生成一个新链表 0.题目&#xff1a; 1.算法设计思想&#xff1a; 2.C语言描述…

DDD重构-实体与限界上下文重构

DDD重构-实体与限界上下文重构 概述 DDD 方法需要不同类型的类元素&#xff0c;例如实体或值对象&#xff0c;并且几乎所有这些类元素都可以看作是常规的 Java 类。它们的总体结构是 Name: 类的唯一名称 Properties&#xff1a;属性 Methods: 控制变量的变化和添加行为 一…

MySQL中 truncate、drop和delete的区别

MySQL中 truncate、drop和delete区别 truncate 执行速度快&#xff0c;删除所有数据&#xff0c;但是保留表结构不记录日志事务不安全&#xff0c;不能回滚可重置自增主键计数器 drop 执行速度较快&#xff0c;删除整张表数据和结构不记录日志事务不安全&#xff0c;不能回…

JavaWeb——Maven(3/8):配置Maven环境(当前工程,全局),创建Maven项目

目录 配置Maven环境 当前工程 全局 创建Maven项目 配置Maven环境 当前工程 选择 IDEA中 File --> Settings --> Build,Execution,Deployment --> Build Tools --> Maven 设置 IDEA 使用本地安装的 Maven&#xff0c;并修改配置文件及本地仓库路径 首先在 IDE…

QtCreator14调试Qt5.15出现 Launching Debugger 错误

1、问题描述 使用QtCreator14调试程序&#xff0c;Launching Debugger 显示红色&#xff0c;无法进入调试模式。 故障现象如下&#xff1a; 使能Debugger Log窗口&#xff0c;显示&#xff1a; 325^error,msg"Error while executing Python code." 不过&#xff…

【软件推荐】信创终端上通过kshutdown实现定时关机 _ 统信 _ 麒麟 _ 方德

往期好文&#xff1a;【功能介绍】麒麟2403支持配置任务栏上的图标“从不合并”啦&#xff01; Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于如何在信创终端系统上通过kshutdown实现定时关机的文章。在日常使用中&#xff0c;定时关机是一个非常实用的功能&am…

Leetcode 841. 钥匙和房间

1.题目基本信息 1.1.题目描述 有 n 个房间&#xff0c;房间按从 0 到 n – 1 编号。最初&#xff0c;除 0 号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而&#xff0c;你不能在没有获得钥匙的时候进入锁住的房间。 当你进入一个房间&#xff0c;你可能会在…

uniapp 微信小程序分包操作

1. 在项目根目录创建一个新的目录&#xff0c;名称为分包名称 2. 打开manifest.json&#xff0c;选择源码视图&#xff0c;加入以下代码 "optimization" : {"subPackages" : true } 3. 在pages.json中&#xff0c;pages后面添加分包代码 "subPackag…

tkinter Listbox 列表框实现多列对齐排列并绑定下拉框和滚动条

from tkinter import * from tkinter import ttk, Button, Canvas, Listbox, Entry, LabelFrame, IntVar, Checkbutton, messageboximport win32print root Tk() root.title("tkinter Listbox 列表框实现多列对齐排列") root.geometry(550x450)def callback2(t, eve…

k8s-对命名空间资源配额

对k8s命名空间限制的方法有很多种&#xff0c;今天来演示一下很常用的一种 用的k8s对象就是ResourceQuota 一&#xff1a;创建命名空间 kubectl create ns test #namespace命名空间可以简写成ns 二&#xff1a; 对命名空间进行限制 创建resourcequota vim resourcequ…

Http请求转发服务器实现

Http请求转发服务器实现 需求场景 云服务器通过VPN连接了现场的n台工控机&#xff0c;每台工控机上都在跑web程序&#xff0c;现在我想通过公网直接访问工控机上的web服务&#xff0c;给客户查看现场的具体运行情况&#xff0c;而不是让客户再装一个VPN&#xff0c;简化操作。…

Axure重要元件三——中继器函数

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;中继器函数 主要内容&#xff1a;Item、Reperter、TargetItem 1、中继器的函数&#xff1a;Item\Reperter\TargetItem Item item&#xff1a;获取…

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第五篇-着色器投影-投射阴影部分】

投射阴影 最初打算将投影内容放在上一篇中&#xff0c;因为实现非常快速简单&#xff0c;没必要单独成篇。不过因为这里面涉及一些问题&#xff0c;我觉得还是单独作为一篇讲一下比较好。 原理 这里要用到的是 Shadow Pass Switch ,它可以为非不透明的材质替换阴影 某些版本…