06.HttpSession

2023-12-28 13:38
文章标签 06 httpsession

本文主要是介绍06.HttpSession,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HttpSession

回话跟踪

为什么需要会话跟踪?

  • HTTP协议是一种无状态的协议(一般情况下,在响应客户后,服务器就与客户断开连接)

  • 需要对用户在访问同一WEB应用时对用户进行跟踪(如:是否登录)

HttpSession

HttpSession是javaWeb对用户进行会话跟踪的一个接口。

HttpSession由Servlet容器的提供者实现。

HttpSession通过HttpServletRequest的getSession()或getSession(boolean b)方法获取:

  • getSession():如果会话没有被创建则创建并返回。

  • getSession(boolean b):如果参数时false,如果会话存在则返回,否则返回null。

常用方法

  • String getId():返回包含分配给此会话的唯一标识符的字符串。

  • void invalidate():使会话无效,然后取消任何绑定到此会话的对象的绑定。

  • void setAttribute(String name, Object value):使用指定名称将对象绑定到此会话。

  • Object getAttribute(String name):返回此会话中的指定名称绑定在一起的对象(经常需要进行类型转换)。

  • void removeAttribute(String name):从此会话汇总移出与指定名称绑定在一起的对象。

  • void setMaxInactiveInterval(int interval):设置servlet容器在客户端访问之间保持此会话的最大时间间隔。

  • int getInactiveInterval():返回servlet容器在客户端访问之间将使此会话保持打开状态的最大时间间隔。

  • ServletContext getServletContext():返回此会话的ServletContext。

  • boolean isNew():如果客户端还不知道该会话,或者客户端选择不加入该会话,则返回true。例如,如果服务器仅适用基于cookie的会话,而客户端已经禁用了cookie的使用,则每个请求上的会话都将是新的会话。

使用HttpSession完成登录验证

用户没有登录则不能访问除登录之外的Servlet。

  • 创建index.html

  • 创建login.html

  • 创建LoginServlet和TestServlet(TestServlet需要登录之后才能访问)

  • web.xml

示例代码

首页:index.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><p><a href="pages/login.html">登录</a></p><p><a href="control/test">访问TestServlet(需要登录之后才能访问)</a></p></body>
</html>

登录页面:login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><fieldset><legend>用户登录</legend><!-- 注意login.html文件的路径,这里访问的是该路径下的login服务 --><!-- 也可以使用"../login"(返回上一级)表示访问根路径下的login服务 --><!-- 另外一种方式,在头标签里面加此标签<base  href="/SessionTrack/">,表示此页面所有的访问都是相对于该位置下的页面或服务--><form action="login" method="post"><p>用户名:<input type="text" name="name" /></p><p><!-- 不要使用普通空格,中间使用一个全角空格字符,间隔刚好是一个中文文字 -->密 码:<input type="password" name="password" /></p><p><input type="submit" value="登录" />&nbsp;&nbsp;&nbsp;&nbsp;<input type="reset" value="取消" /></p></form></fieldset>
</body>
</html>

登录服务验证页面:LoginServlet.java

package com.li.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class LoginServlet extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");String name=req.getParameter("name");String password=req.getParameter("password");if("admin".equals(name) && "123456".equals(password)) {//获取会话HttpSession session=req.getSession();session.setAttribute("uesr", name);resp.setContentType("text/html;charset=UTF-8");resp.getWriter().write("<strong>欢迎"+name+"!</strong><br/><a href='../index.html'>返回首页</a>");}else {//登录失败,通过重定向的方式重新返回登录页面/*由于我们在配置文件中已经把服务配置到pages文件下,*所以,此处我们使用的是相对路径,不在需要加重定向位置所在的文件夹。*/resp.sendRedirect("login.html");}}
}

访问服务测试页面:TestServlet.java

package com.li.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class TestServlet extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//注意参数,session可以为null, 也可以不使用参数从而判断session是否为新的HttpSession session=req.getSession(false);if(session==null || session.getAttribute("uesr")==null) {//如果没有登录,则重定向到登录页(该Servlet配置在control路径下,也可以使用绝对路径)resp.sendRedirect("../pages/login.html");//System.out.println(getContextPath());}else {resp.setContentType("text/html; charset=UTF-8");resp.getWriter().write("<h3>欢迎"+session.getAttribute("uesr")+"访问TestServelt</h3><a href='../index.html'>返回首页</a>");}}
}

配置文件:web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>SessionTrack</display-name><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list><servlet><servlet-name>LoginServlet</servlet-name><servlet-class>com.li.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>LoginServlet</servlet-name><!-- 将服务配置到pages文件下,否则将直接针对工程的根路径而配置到根路径下 --><url-pattern>/pages/login</url-pattern></servlet-mapping><servlet><servlet-name>TestServlet</servlet-name><servlet-class>com.li.servlet.TestServlet</servlet-class></servlet><servlet-mapping><servlet-name>TestServlet</servlet-name><!-- 将服务直接配置到根路径下的control路径下 --><url-pattern>/control/test</url-pattern></servlet-mapping></web-app>

这篇关于06.HttpSession的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/546124

相关文章

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

前端-06-eslint9大变样后,如何生成旧版本的.eslintrc.cjs配置文件

目录 问题解决办法 问题 最近在写一个vue3+ts的项目,看了尚硅谷的视频,到了配置eslintrc.cjs的时候我犯了难,因为eslint从9.0之后重大更新,跟以前完全不一样,但是我还是想用和老师一样的eslintrc.cjs文件,该怎么做呢? 视频链接:尚硅谷Vue项目实战硅谷甄选,vue3项目+TypeScript前端项目一套通关 解决办法 首先 eslint 要

C++入门(06)安装QT并快速测试体验一个简单的C++GUI项目

文章目录 1. 清华镜像源下载2. 安装3. 开始菜单上的 QT 工具4. 打开 Qt Creator5. 简单的 GUI C++ 项目5.1 打开 Qt Creator 并创建新项目5.2 设计界面5.3 添加按钮的点击事件5.4 编译并运行项目 6. 信号和槽(Signals and Slots) 这里用到了C++类与对象的很多概念 1. 清华镜像源下载 https://

F12抓包06-4:导出metersphere脚本

metersphere是一站式的开源持续测试平台,我们可以将浏览器请求导出为HAR文件,导入到metersphere,生成接口测试。 metersphere有2种导入入口(方式),导入结果不同:         1.导入到“接口定义”:自动生成接口API和单接口case(接口自动去重;每个请求生成不同case,重复的请求生成重复的case,名称自动加数字后缀,自动与接口关联)。

java基础总结06-面向对象2

1 JAVA类的定义 JAVA里面有class关键字定义一个类,后面加上自定义的类名即可。如这里定义的person类,使用class person定义了一个person类,然后在person这个类的类体里面定义person这个类应该具有的成员变量(即属性)和方法,如这里定义的int id和int age这个两个成员变量,或者叫属性,这个id表示人的身份证号码,人应该具有这个属性,age表示人

【SpringMVC学习06】SpringMVC中实现文件上传

1. 环境准备 springmvc上传文件的功能需要两个jar包的支持,如下 2. 单个文件的上传 2.1 前台页面 简单的写一下前台页面,注意一点的是form表单中别忘了写enctype=”multipart/form-data”属性: <tr><td>商品图片</td><td><c:if test="${itemsCustom.pic !=null}"><img src="/f

【视频教程】手把手AppWizard轻松制作一个emWin滑动主界面控制框架,任意跳转控制(2024-09-06)

现在的新版AppWizard已经比较好用,用户可以轻松的创建各种项目常规界面。 比如早期创建一个支持滑动的主界面框架,并且可以跳转各种子界面,仅仅界面布局和各种图片格式转换都要花不少时间,而现在使用AppWizard,可以说轻轻松松,毫不费力。 用户唯一要做的就是根据自己的芯片性能做一定的速度优化。 视频: https://www.bilibili.com/video/BV17Rp3eLE

javaweb-day02-2(00:40:06 XML 解析 - Dom4j解析开发包)

导入dom4j开发包:dom4j-1.6.1.jar   在工程下建一个文件夹lib,将dom4j-1.6.1.jar拷到里边。右键add to build path。  dom4j-1.6.1\lib文件夹下还有一些jar包,是开发过程中dom4j所需要依赖的jar包,如开发过程中报错,则需导入。   用dom4j怎么做呢? 只要是开源jar包提供给你的时候,它会在开源包里面提供

【大数据Java基础-JAVA 面向对象06】类成员(二)类结构 方法(三) JAVA的值传递机制

java的值传递机制 1.针对于方法内变量的赋值举例: System.out.println("***********基本数据类型:****************"); int m = 10; int n = m; System.out.println("m = " + m + ", n = " + n); n = 20; System.out.println("m = " + m + ",

五星级可视化页面(06):城市鸟瞰页面,居高临下,高屋建瓴。

本期分享城市鸟瞰图的可视化大屏幕,这类场景一般在智慧城市和城市治理可视化中常用。