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 是什么 ...
随机推荐
- mybatis 初步使用(IDEA的Maven项目, 超详细)
目录 创建 Maven 项目 Maven配置 pom.xml 创建数据库 配置Mybatis 配置mybatis的XML文件 创建实体类和对应的Mapper.xml 测试 源码 @ 创建 Maven ...
- 设计模式 笔记 中介者模式 Mediator
//---------------------------15/04/27---------------------------- //Mediator 中介者模式----对象行为型模式 /* 1:意 ...
- python3绝对路径,相对路径
from __future__ import absolute_import的作用: 直观地看就是说”加入绝对引入这个新特性”.说到绝对引入,当然就会想到相对引入.那么什么是相对引入呢?比如说,你的包 ...
- 2014.9.11 Research Meeting Report
Dear All: Yesterday when we read INFOCOM papers, you have seen how damage it is to have careless wri ...
- 关于UGUI不拦截射线的方法
起因:开发游戏,要在设置界面里给一个设置项添加一个东西解释这个项是干啥的,要求鼠标移到文字上的时候显示一个弹窗差不多的东西,见动图,鼠标移开会消失.但是当我移动鼠标到弹窗上的时候,UGUI会发射一根射 ...
- From today 2019.02.27
HIT开设软件构造课程,需要在博客上分享记录学习体验,感觉还是挺好的. 以后会不定期更新一些关于学下java的笔记和实验相关的内容.
- hyperledger-fabirc1.2-ca-server的生产示例
hyperledger-fabirc1.2-ca-server的生产示例,带TLS 在fabirc-samples/first-network中启动网络,其ca证书是利用crypto的工具生成的,但是 ...
- 基于Air800+Arduino+ESP8266的混合物联网开发
流程图如下:
- iOS-copy与mutableCopy浅析
iOS-copy与mutableCopy浅析 iOS 浅谈:深.浅拷贝与copy.strong 总结:当不可变类型对象调用copy拷贝后,不会产生新的对象,属于浅拷贝,其他类型对象不管调用copy亦或 ...
- Alpha 冲刺八
团队成员 051601135 岳冠宇 051604103 陈思孝 031602629 刘意晗 031602248 郑智文 031602234 王淇 会议照片 项目燃尽图 项目进展 完善各自部分 项目描 ...