会话可以简单的理解为客户端用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器的整个过程称为一个会话。即一个客户端用户和服务器端进行通讯的过程,也是客户端和服务器端之间的数据传输过程。

HTTP协议的无状态性导致web服务器无法区分一个HTTP请求是否为第一次访问,因此需要程序必须能管理会话,并为每个用户保存其与服务器交互过程中产生的数据。

会话管理就是管理浏览器客户端和服务器端之间会话过程中产生的数据。

Servlet有4中不同的状态保持技术:

-- URL重写(token-based会话跟踪技术)

-- 表单隐藏域(仅当网页中有表单时使用)  <input type="hidden" name="field_name" value="value">

-- cookies(客户端技术,数据保存在客户端)

-- HTTPSession(服务器端技术,数据保存在服务器端)


URL重写 (token-based会话跟踪技术)

将一个或多个token添加到URL的查询字符串中,每个token通常为 key=value 的形式。其中,URL和token之间用 ? 分隔,token之间用 & 分隔。

URL重写仅适合于信息仅在少量页面间传递,且信息本身不敏感的情况

数据通过URL后面的token传递到下一个页面,在下一个页面(即下一个http请求)中,通过获取request.getParameter(name)获取tonken的值,从而保证了数据在不同页面间的传递 。

请表单的提交方式为get时,表单中的参数也会显示的出现在URL后面

package app02a.urlrewriting;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Servlet implementation class Top10Servlet*/
@WebServlet(name = "Top10Servlet", urlPatterns = { "/top10" })
public class Top10Servlet extends HttpServlet {private static final long serialVersionUID = 1L;private List<String> londonAttractions;private List<String> parisAttractions;public Top10Servlet() {super();}@Overridepublic void init() throws ServletException {  // 用户第一次访问时,Tomcat初始化Servlet,init()方法被调用。londonAttractions = new ArrayList<String>(10);  // 赋值类的成员变量londonAttractions.add("1.Buckingham Palace");londonAttractions.add("2.Lodon Eye");londonAttractions.add("3.British Museum");londonAttractions.add("4.National Gallery");londonAttractions.add("5.Big Ben");londonAttractions.add("6.Tower of London");londonAttractions.add("7.Natural History Museum");londonAttractions.add("8.Canary Wharf");londonAttractions.add("9.2012 Olympic Park");londonAttractions.add("10.ST Paul's Cathedral");parisAttractions = new ArrayList<String>(10);  // 赋值类的成员变量parisAttractions.add("1.Eiffel Tower");parisAttractions.add("2.Notre Dame");parisAttractions.add("3.The Louver");parisAttractions.add("4.Champs Elysees");parisAttractions.add("5.Arc de Triomphe");parisAttractions.add("6.Sainte Chapelle Church");parisAttractions.add("7.Les Invalides");parisAttractions.add("8.Muess d'Orsay");parisAttractions.add("9.Montmarte");parisAttractions.add("10.Sacre Couer Basilica");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String city = request.getParameter("city");  // 获取token的值,该token随URL传递过来if (city != null && (city.equals("london") || city.equals("paris"))) {showAttractions(request, response, city);} else {showMainPage(request, response);}}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub
        doGet(request, response);}private void showMainPage(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html");PrintWriter writer = response.getWriter();  // 向客户端发送信息writer.println("<html>");writer.println("<head>");writer.println("<title>Top10 Tourist Atrractions</title>");writer.println("</head>");writer.println("<body>");writer.println("Please select a city:<br />");writer.println("<a href='?city=london'>London</a><br />");  // 相对url,由 http://localhost:8080/top10/top10writer.println("<a href='?city=paris'>Paris</a><br />");    //      变为  http://localhost:8080/top10/top10?city=london writer.println("</body>");                                  // 并将后者发送到服务器writer.println("</html>");}private void showAttractions(HttpServletRequest request, HttpServletResponse response, String city) throws ServletException, IOException {int page = 1;String pageParameter = request.getParameter("page");  // 获取token的值if (pageParameter != null) {try {page = Integer.parseInt(pageParameter);}catch(NumberFormatException e) {e.printStackTrace();}if (page > 2) {page = 1;}}List<String> attractions = null;if (city.equals("london")) {attractions = londonAttractions;} else {attractions = parisAttractions;}response.setContentType("text/html");PrintWriter writer = response.getWriter();writer.println("<html>");writer.println("<head>");writer.println("<title>Top 10 Tourist Attractions</title>");writer.println("</head>");writer.println("<body>");writer.println("<a href='top10'>Select City</a>");  // 相对url 由 http://localhost:8080/top10/top10?city=londonwriter.println("<hr />");                           //      变为  http://localhost:8080/top10/top10writer.println("Page " + page);writer.println("<hr />");int start = page * 5 -5;for (int i = start; i < start + 5; i++) {writer.println(attractions.get(i) + "<br />");}writer.print("<hr style='color:blue' />");writer.println("<a href='?city=" + city + "&page=1'>Page 1</a>");  // 由 localhost:8080/top10/top10?city=london 变为 localhost:8080/top10/top10?city=london&page=1writer.println("&nbsp;<a href='?city=" + city + "&page=2'>Page 2</a>");  // 由 localhost:8080/top10/top10?city=london 变为 localhost:8080/top10/top10?city=london&page=2writer.println("</body>");writer.println("</html>");}
}

表单隐藏域(仅当网页中有表单时有效)

使用隐藏域来保存会话过程中的数据是将值放到HTML表单的隐藏域中。当表单提交时,隐藏域的值也同时提交到服务器端。

<input type="hidden" name="field_name" value="value">

该技术较URL重写相比,没有字符的限制,同时无需额外编码,但也不适合跨越多个页面。

package app02a.hiddenfields;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet(name = "CustomerServlet", urlPatterns = { "/customer", "/editCustomer", "/updateCustomer" })
public class CustomerServlet extends HttpServlet {private static final long serialVersionUID = 1L;private List<Customer> customers = new ArrayList<Customer>();  // 类的成员变量public CustomerServlet() {super();}@Overridepublic void init() throws ServletException {  // 初始化两个数据,正常情况下,这些数据应该存储在数据库中Customer customer1 = new Customer();customer1.setId(1);customer1.setName("Donal D.");customer1.setCity("Miami");customers.add(customer1);Customer customer2 = new Customer();customer2.setId(2);customer2.setName("Micky M.");customer2.setCity("Orlando");customers.add(customer2);}private void sendCustomerList(HttpServletResponse response) throws IOException {response.setContentType("text/html");PrintWriter writer = response.getWriter();writer.println("<html>");writer.println("<head>");writer.println("<title>Customers</title>");writer.println("</head>");writer.println("<body>");writer.println("<h2>Customers</h2>");writer.println("<ul>");for (Customer customer : customers) {writer.println("<li>" + customer.getName() + " (" + customer.getCity() + ") (<a href='editCustomer?id=" + customer.getId() + "'>edit</a>)</li>");  // URL重写方式
        }writer.println("</ul>");writer.println("</body>");writer.println("</html>");}private Customer getCustomer(int customerId) {for (Customer customer : customers) {if (customer.getId() == customerId) {return customer;}}return null;}private void sendEditCustomerForm(HttpServletRequest request, HttpServletResponse response) throws IOException {response.setContentType("text/html");PrintWriter writer = response.getWriter();int customerId = 0;try {customerId = Integer.parseInt(request.getParameter("id")); // 将String类型装换成int类型} catch (NumberFormatException e) {e.printStackTrace();}Customer customer = getCustomer(customerId);if (customer != null) {writer.println("<html>");writer.println("<head>");writer.println("<title>Edit Customer</title>");writer.println("</head>");writer.println("<body>");writer.println("<h2>Edit Customer</h2>");writer.println("<form method='post' action='updateCustomer'>"); writer.println("<input type='hidden' name='id' value='" + customerId + "' />");  // 隐藏域 用于传递数据writer.println("<table>");writer.println("<tr>");writer.println("<td>Name:</td>");writer.println("<td><input name='name' value='" + customer.getName().replaceAll("'", "'") + "' /></td>");  //'编码单引号writer.println("</tr>");writer.println("<tr>");writer.println("<td>City:</td>");writer.println("<td><input name='city' value='" +customer.getCity().replaceAll("'", "'") + "' /></td>");writer.println("</tr>");writer.println("<tr>");writer.println("<td colspan='2' style='text-align:right'><input type='submit' value='Update' /></td>");writer.println("</tr>");writer.println("<tr>");writer.println("<td colspan='2'><a href='customer'>Customer List</a></td>");writer.println("</tr>");writer.println("</table>");writer.println("</form>");writer.println("</body>");writer.println("</html>");} else {writer.println("No customer found!");}}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String uri = request.getRequestURI();if (uri.endsWith("/customer")) {sendCustomerList(response);} else if (uri.endsWith("/editCustomer")) {sendEditCustomerForm(request, response);}}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {int customerId = 0;try {customerId = Integer.parseInt(request.getParameter("id"));  // 获取隐藏域中的值} catch (NumberFormatException e) {e.printStackTrace();}Customer customer = getCustomer(customerId);if (customer != null) {customer.setName(request.getParameter("name"));customer.setCity(request.getParameter("city"));}sendCustomerList(response);}
}

cookies(客户端技术,数据保存在客户端)

转载于:https://www.cnblogs.com/0820LL/p/9822398.html

Servlet会话管理一(URL重写和表单隐藏域)相关推荐

  1. java获取表单隐藏域的值,Servlet中使用表单隐藏域

    Servlet中使用表单隐藏域 表单隐藏域也是一种会话跟踪技术. 如果使用了"表单隐藏域",将使用一个隐藏(不可见)文本域来维护用户的状态. 在这种情况下,我们将信息存储在表单的隐 ...

  2. php修改隐藏域非法提交,PHP get、post变量放在表单隐藏域示例

    搜索热词 form里可以防止隐藏控件hidden,用来防止那些不希望让用户看到的信息,这个类可以把get和post里的变量放到hidden控件里,不用在单独遍历get和post了,PHP把get.po ...

  3. input值不可变、隐藏input(表单隐藏域)

    input标签值不可变.隐藏标签 一.值不可变 方法1:readonly 方法2:disabled readonly 和 disabled的区别: 二.隐藏\标签(表单隐藏域) 一.值不可变 在写前端 ...

  4. 【HTML】表单隐藏域hidden

    1.什么是隐藏域 隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的.当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上. 2.怎么创建隐藏域 HTML ...

  5. 表单中隐藏域的html代码是,JS中input表单隐藏域及其使用方法_心病_前端开发者...

    一.表单隐藏域 隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的.当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上. 代码格式: <input ...

  6. form表单隐藏域有什么作用

    隐藏域是用来收集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的.当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上. 代码格式:在form表单中写如下代码 < ...

  7. HttpServlet 会话管理(一)(URL重写 表单隐藏域 简单示例)

    本文代码转载自 <Servlet.JSP和Spring MVC初学指南> 会话管理的目的是记录用户访问的状态, 使得之前的Http访问状态可以被之后的应用直接使用,状态的记录即通过请求传值 ...

  8. JQuery validate验证表单隐藏域

    当我们提交表单时,往往需要做一些必填和数据格式校验,点击提交,doSubmit的 beforeSend方法即可做校验. <script type="text/javascript&qu ...

  9. 表单隐藏域与display:none

    有时候前端进行表单填写是分步骤的,每一步的时候其他步骤相关的表单视图不可见: 针对"不可见",以下有两种处理方式: ①display:none 这种方式呢,比较简单,就是将三个步骤 ...

最新文章

  1. 深度解析工业软件:研究框架(140页)
  2. 【JavaSE03】Java中分支语句-概念
  3. echarts里面的参数解释_Echarts适用小技巧:适用参数详细说明及示例-TS文件
  4. Angular项目中核心模块core Module只加载一次的实现
  5. 二叉树后序遍历_二叉树后序遍历非递归实现
  6. python while循环例题_【学习笔记】python:5for循环与while循环(上)
  7. python画三维图-Python使用matplotlib绘制三维图形示例
  8. 30秒您学会配置TomCat环境变量,并运行无错
  9. 多线程编程(16) - 多线程同步之 WaitableTimer (等待定时器对象)[续二]
  10. 2018/5/7~2018/5/11 周记
  11. PDMS Pipeline Tool 教程(五):汇料属性设置
  12. Easyui and mvc 项目3书籍管理功能
  13. yuv444转yuv422 matlab,最简单解释 YUV444,YUV422,YUV420中的4,2,0
  14. ps+背景缩放+内容缩放
  15. JSON_EXTRACT JSON_UNQUOTE以及json数组下标选择
  16. 写个单机版斗地主程序,复习c++面向对象
  17. widows 句柄HINSTANCE
  18. TortoiseSvn介绍(配置与管理)
  19. JDK1.8 下载与安装 Win11版 (完整图文安装教程)
  20. 题目6:求n阶方阵的和

热门文章

  1. android 判断2g 3g 4g,如何确定网络类型是2G,3G还是4G
  2. 修改SSL默认端口号
  3. 牛客网-剑指offer-树-第二部分
  4. 浏览器地址栏的完整URL都包含哪些内容都各代表什么?
  5. 算法笔记4.1习题_排序
  6. arcsde for java,java arcsde 联接oracle
  7. 明明自己刚转行,一毕业就拿下了5个offer
  8. OpenGL ES系列 之 提高-1:加载模型
  9. java中单精度浮点数和双精度浮点数_什么是浮点型?单精度浮点数(float)和双精度浮点数(double)介绍...
  10. 环境搭建--maven