JAVA-Servlet高级应用
会话只是指一段指定的时间间隔。
会话跟踪是维护用户状态(数据)的一种方式。它也被称为servlet中的会话管理。
Http协议是一个无状态的,所以我们需要使用会话跟踪技术来维护用户状态。 每次用户请求服务器时,服务器将请求视为新请求。 所以需要保持一个用户的状态来识别特定的用户。
HTTP是无状态的,这意味着每个请求被认为是新的请求。如下图所示:
为什么使用会话跟踪?
- 因为需要用于识别特定的用户。
会话跟踪技术
会话跟踪中使用的技术有四种:
- Cookies
- 隐藏表格域
- 网址重写
- HttpSession
Cookie是在多个客户端请求之间持久存储的一小段信息。
Cookie具有名称,单个值和可选属性,例如注释,路径和域限定符,生存周期和版本号。
Cookie工作原理
默认情况下,每个请求都被视为新的请求。在cookie技术中,servlet响应可以添加cookie。 所以cookie存储在浏览器的缓存中。之后,如果用户发出请求,默认情况下会带上cookie。 因此,我们就可以知道用户旧用户。
Cookie类型
Servlet中有2
种类型的Cookie。
- 非持久性cookie
- 持久性Cookie
非持久性cookie
- 它仅适用于单个会话。当用户关闭浏览器时都会删除它。
持久性Cookie
- 它对多个会话有效。当用户关闭浏览器时也不会删除它。只有在用户注销或注销时才被删除。
Cookie的优点
- 维持状态最简单的技术。
- Cookie在客户端维护。
Cookie的缺点
- 如果从浏览器中禁用Cookie,则无法正常工作。
- 只能在Cookie对象中设置文本信息。
Cookie类
javax.servlet.http.Cookie
类提供了使用Cookie的功能。它为Cookie提供了很多有用的方法。
Cookie类的构造方法
构造方法 | 描述 |
---|---|
Cookie() |
构建一个cookie。 |
Cookie(String name, String value) |
构造具有指定名称和值的cookie。 |
Cookie类的方法
下面中给出了一些常用的Cookie类方法。
方法 | 描述 |
---|---|
public void setMaxAge(int expiry) |
设置cookie的最大生命周期(以秒为单位)。 |
public String getName() |
返回cookie的名称。创建后无法更改名称。 |
public String getValue() |
返回cookie的值。 |
public void setName(String name) |
更改cookie的名称。 |
public void setValue(String value) |
更改cookie的值。 |
使用Cookies所需的其他方法
要添加cookie或从cookie获取值,需要其他接口提供的一些方法。它们分别是:
public void addCookie(Cookie ck)
:HttpServletResponse
接口的方法用于在响应对象中添加cookie。public Cookie[] getCookies()
:HttpServletRequest
接口的方法用于从浏览器返回所有的cookie。
如何创建Cookie?
下面来看看创建cookie的简单代码。
Cookie ck=new Cookie("user","maxsu jaiswal");//creating cookie object
response.addCookie(ck);//adding cookie in the response
如何删除Cookie?
下面来看看删除cookie的简单代码。它主要用于注销或注销用户。
Cookie ck=new Cookie("user","");//deleting value of cookie
ck.setMaxAge(0);//changing the maximum age to 0 seconds
response.addCookie(ck);//adding cookie in the response
如何获取Cookie?
下面来看看简单的代码用来获取所有的cookies。
Cookie ck[]=request.getCookies();
for(int i=0;i<ck.length;i++){
out.print("<br>"+ck[i].getName()+" "+ck[i].getValue());//printing name and value of cookie
}
Cookie是存储在客户端的一种信息技术。
在上一页中,我们学到了很多关于cookie的内容 如何创建cookie,如何删除cookie,如何获取cookie等
在这里,我们将使用servlet cookie创建一个登录和注销示例。
在这个例子中,我们创建了3
个链接:登录,注销和用户资料。用户在未登录之前不能进入个人资料页面。如果用户已经注销,则需要再次登录才能访问个人资料。
在这个应用程序中,创建了以下文件。
- index.html - Web应用程序首页。
- link.html - 链接页面。
- login.html - 登录页面。
- LoginServlet.java - 登录Servlet处理。
- LogoutServlet.java - 注销Servlet处理。
- ProfileServlet.java - 用户个人资料Servlet。
- web.xml - Servlet配置文件。
打开Eclipse,创建一个动态Web项目:LoginWithCookies,其完整的项目结构如下图所示 -
按以下顺序,分别编写每个文件的源代码。
文件:index.html -
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>使用Cookie登录应用程序</title>
</head>
<body style="text-algin: center;">
<h2>欢迎使用Cookie登录应用程序</h2>
<a href="login.html">登录</a>|
<a href="logout">注销</a>|
<a href="profile">个人信息</a>
</body>
</html>
文件:link.html -
<a href="login.html">登录</a>|
<a href="logout">注销</a>|
<a href="profile">个人信息</a>
<hr>
文件:login.html -
<div style="text-algin: center; padding-top:12px;">
<form action="login" method="post">
用户名:<input type="text" name="name"> 密码:<input type="password"
name="password"><input type="submit" value="登录">
</form>
</div>
</body>
</html>
文件:LoginServlet.java -
package com.yiibai;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
request.getRequestDispatcher("link.html").include(request, response);
String name = request.getParameter("name");
String password = request.getParameter("password");
// 用户名和密码分别为:admin , 123456
if (name.equals("admin") && password.equals("123456")) {
out.print("您已成功登录系统!");
out.print("<br>欢迎您, " + name);
Cookie ck = new Cookie("name", name);
response.addCookie(ck);
} else {
out.print("<font style='color:red;'>用户名或密码错误!</font>");
request.getRequestDispatcher("login.html").include(request, response);
}
out.close();
}
}
文件:LogoutServlet.java -
package com.yiibai;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LogoutServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
request.getRequestDispatcher("link.html").include(request, response);
Cookie ck = new Cookie("name", "");
ck.setMaxAge(0);
response.addCookie(ck);
out.print("您已成功注销!");
}
}
文件:ProfileServlet.java -
package com.yiibai;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ProfileServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
request.getRequestDispatcher("link.html").include(request, response);
Cookie ck[] = request.getCookies();
if (ck != null) {
String name = ck[0].getValue();
if (!name.equals("") || name != null) {
out.print("<b>欢迎您来到个人信息中心</b>");
out.print("<br>您好, " + name);
}
} else {
out.print("<font style='color:red;'>请先登录!</font>");
request.getRequestDispatcher("login.html").include(request, response);
}
out.close();
}
}
文件: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>LoginWithCookies</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!-- 登录Servlet -->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.yiibai.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!-- 注销Servlet -->
<servlet>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>com.yiibai.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>
<!-- 用户资料Servlet -->
<servlet>
<servlet-name>ProfileServlet</servlet-name>
<servlet-class>com.yiibai.ProfileServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ProfileServlet</servlet-name>
<url-pattern>/profile</url-pattern>
</servlet-mapping>
</web-app>
在编写所有上面文件代码之后,部署这个Web应用程序,打开浏览器访问URL: http://localhost:8080/LoginWithCookies/ ,如果代码没有错误,应该会看到以下结果 -
点击“登录”链接,输入用户名和密码:admin 和 123456 ,应该会看到以下结果 -
提交登录成功后,看到以下结果 -
查看个人信息 -
其它如注销,登录密码错误请自己尝试一下。
JAVA-Servlet高级应用的更多相关文章
- java servlet 几种页面跳转的方法及传值
java servlet 几种页面跳转的方法及传值 java web 页面之间传值有一下这几种方式1.form 表单传递参数2.url地址栏传递参数3.session4.cookie5.appli ...
- Java Servlet与Web容器之间的关系
自从计算机软件开发进入网络时代,就开始涉及到通讯问题.在客户/服务器(也叫C/S应用)时期,每个软件都有自己的客户端和服务器端软件.并且客户端和服务器端之间的通讯协议差别也很大.后来随着互联网的发展, ...
- java servlet调用带有多个返回结果集的存储过程
一.mysql存储过程 这里我先说下我这个功能实现的逻辑及途中遇到的一些问题.这个存储过程一共带两个输入参数,一共关联到两张表的查询,每个参数都对应查询表中的一个判断,所以一共返回了两个结果集(当然要 ...
- java servlet+mysql全过程(原创)
前段时间写过一篇 servlet+oracle的文章,但是那是因为公司有可能接那么一个项目,然后我当时也比较闲,所以随便学了下,那玩意是白去研究了,因为公司后面并没接到那项目. 这次学servlet用 ...
- java servlet+oracle 新手可看
最近公司领导告诉接下去接的一个产品,可能会涉及到oracle数据库,以前用得最多的是mssql,前些时间学了下mysql也算少许用过.oracle没接触过.应为我之前做过.net开发,所以数据访问接口 ...
- Java Servlet完全教程
Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求.尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求. Servle ...
- Java Servlet系列之Servlet生命周期
Servlet生命周期定义了一个Servlet如何被加载.初始化,以及它怎样接收请求.响应请求,提供服务.在讨论Servlet生命周期之前,先让我们来看一下这几个方法: 1. init()方法 在Se ...
- JAVA SERVLET专题(上)
SERVLET简介 ·Java Servlet 是和平台无关的服务器端组件,它运行在Servlet容器中.Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和 ...
- Java Servlet——改进的CGI
一.关于Servlet 在上一篇随笔中,我们看到了CGI存在的不足,其每次请求都需加载和运行一个CGI程序.若使用Java编写CGI程序,需要为每个请求都启动一个系统进程以及JVM,其执行效率大大降低 ...
- Java Servlet 技术简介
Java Servlet 技术简介 Java 开发人员兼培训师 Roy Miller 将我们现有的 servlet 介绍资料修改成了这篇易于学习的实用教程.Roy 将介绍并解释 servlet 是什么 ...
随机推荐
- NodeJs学习一NodeJs初识
一.前言 按照惯例,先扯淡,就因为这货,现在才有了各大公司招聘的全栈工程师,正是因为它,让以前只会写前端的人也能写起后端服务器代码来了.所以呢,你招一个会NodeJs的前端,它都能把后端干了,一个人干 ...
- C语言中指针占据内存空间问题
以前一直有个疑问,指向不同类型的指针到底占用的内存空间是多大呢? 这个问题我多次问过老师,老师的答案是"指向不同类型的指针占据的内存空间大小不同",我一直很之一这个答案,今天我就做 ...
- linux AB web 性能测试工具
ab(选项)(参数) 选项 -A:指定连接服务器的基本的认证凭据: -c:指定一次向服务器发出请求数: -C:添加cookie: -g:将测试结果输出为“gnuolot”文件: -h:显示帮助信息: ...
- Azure : 通过 SendGrid 发送邮件
SendGrid 是什么? SendGrid 是架构在云端的电子邮件服务,它能提供基于事务的可靠的电子邮件传递.并且具有可扩充性和实时分析的能力.常见的用例有:1. 自动回复用户的邮件2. 定期发送信 ...
- jmeter的开启
先申明我以jmeter的3.2版本来描述本文内容,通常不要选择太新的版本,因为新版本容易出现不稳定和不兼容因素.启动jmeter的前提是JDK已经安装和配置,具体的JDK已经安装和配置自行查资料,此处 ...
- 用HackRF和Gqrx来听FM广播
本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 HackRF链接:https://item.taobao.com/item.htm?spm=a1z10.1- ...
- IE=edge 让浏览器使用最新的渲染模式
Bootstrap不支持IE的兼容模式.为了让IE浏览器运行最新的渲染模式,建议将此 <meta> 标签加入到你的页面中: <metahttp-equiv="X-UA-Co ...
- Linux第一周学习总结——计算机是如何工作的
第一周学习总结--计算机是如何工作的 作者:刘浩晨 一.存储程序计算机工作模型 冯诺依曼体系结构:核心思想为存储程序计算机.两个层面: (1)硬件的角度(计算机主板):一个CPU,一块内存,之间有总线 ...
- C语言和go语言之间的交互 - C语言中使用go语言,使用的go语言又使用了c语言
一.go语言中使用C语言 go代码中使用C代码,在go语言的函数块中,以注释的方式写入C代码,然后紧跟import “C” 即可在go代码中使用C函数 代码示例: go代码:testC.go 1 pa ...
- Python的数据结构
目录 Python内置的数据结构 序列Sequence 映射Mapping 集合Sets Python内置的数据结构 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python内置的 ...