Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

  1. /*******************************************************************************
  2. * session的几个相关问题:
  3. * 1.服务器实现session共享是基于cookie技术,服务器在创建session时,会自动把sessionID号以cookie的形式写回给浏览器,只是cookie有效期没有设置。
  4. * 2.如果要实现多窗口购买,这时程序就要手工以cookie的形式发送sessionID号给浏览器,并设置cookie有效期,以及有效路径(/test)
  5. * 3.如果用户禁用 cookie后,服务器程序还能实现session共享,那这时,就要把网站所有涉及会话的url地址全部要重写
  6. *
  7. *
  8. ******************************************************************************/
  9. public class SessionDemo1 extends HttpServlet {
  10. public void doGet(HttpServletRequest request, HttpServletResponse response)
  11. throws ServletException, IOException {
  12. HttpSession session = request.getSession();
  13. String data = "xxxxx";
  14. session.setAttribute("data", data);
  15. }
  16. public void doPost(HttpServletRequest request, HttpServletResponse response)
  17. throws ServletException, IOException {
  18. doGet(request, response);
  19. }
  20. }

用session来防止表单重复提交

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html>
  3. <head>
  4. <title>form2.html</title>
  5. <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
  6. <meta http-equiv="description" content="this is my page">
  7. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  8. <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->
  9. </head>
  10. <body>
  11. <form action="/test/servlet/FormServlet"  method="post">
  12. 用户名:<input type="text" name="username"><input type="submit" value="登陆">
  13. </form>
  14. </body>
  15. </html>
  1. //负责输出一个表单给用户
  2. public class FormServlet extends HttpServlet {
  3. public void doGet(HttpServletRequest request, HttpServletResponse response)
  4. throws ServletException, IOException {
  5. response.setCharacterEncoding("UTF-8");
  6. response.setContentType("text/html;charset=UTF-8");
  7. PrintWriter out = response.getWriter();
  8. String token = TokenProccessor.getInstance().makeToken();
  9. request.getSession().setAttribute("token", token);
  10. out.println("<form action='/test/servlet/DoSubmitServlet' method='post'>");
  11. out.write("<input type='hidden' name='token' value='"+token+"'>\r\n");
  12. out.write("<input type='text' name='username'>\r\n");
  13. out.write("<input type='submit' value='提交'>\r\n");
  14. out.write("</form>\r\n");
  15. System.out.println("token"+token);
  16. }
  17. public void doPost(HttpServletRequest request, HttpServletResponse response)
  18. throws ServletException, IOException {
  19. doGet(request, response);
  20. }
  21. }
  22. //随机数生成器   保证随机数的唯一性,所有随机数都由这一个对象产生。这样产生相同的随机数的几率较小。
  23. class TokenProccessor{
  24. //1.把构造函数私有
  25. //2.自己创建一个类的对象
  26. //3.提供方法获取类的对象
  27. private TokenProccessor(){}
  28. private static TokenProccessor instance = new TokenProccessor();
  29. public static TokenProccessor getInstance(){
  30. return instance;
  31. }
  32. public String makeToken(){
  33. // 28378232323 232323   9239283983292 11
  34. String token = System.currentTimeMillis() + new Random().nextInt(1000000) + "";
  35. //得到数据指纹  //md5  消息摘要
  36. try {
  37. MessageDigest digest = MessageDigest.getInstance("md5");
  38. byte result[] = digest.digest(token.getBytes());  //128    16  固定长度。
  39. BASE64Encoder encoder = new BASE64Encoder();  //Base64将三字节变成四字节(由原来的8位截前6位然后在前面补00,所以取值范围0-63)
  40. token = encoder.encode(result);
  41. } catch (NoSuchAlgorithmException e) {
  42. throw new RuntimeException(e);
  43. }
  44. return token;
  45. }
  46. }
    1. //处理表单提交请求,要防表单重复提交
    2. public class DoSubmitServlet extends HttpServlet {
    3. public void doGet(HttpServletRequest request, HttpServletResponse response)
    4. throws ServletException, IOException {
    5. boolean b = isToken(request);   //b
    6. if(b){
    7. System.out.println("重复提交");
    8. return;
    9. }
    10. System.out.println("处理表单提交请求!!");
    11. request.getSession().removeAttribute("token");
    12. }
    13. private boolean isToken(HttpServletRequest request) {
    14. String c_token = request.getParameter("token");
    15. System.out.println("c_token"+c_token);
    16. if(c_token==null){
    17. return true;
    18. }
    19. String s_token = (String) request.getSession().getAttribute("token");
    20. if(s_token==null){
    21. return true;
    22. }
    23. if(!c_token.equals(s_token)){
    24. return true;
    25. }
    26. return false;
    27. }
    28. public void doPost(HttpServletRequest request, HttpServletResponse response)
    29. throws ServletException, IOException {
    30. doGet(request, response);
    31. }
    32. }

【JavaWeb】Session(转)的更多相关文章

  1. Javaweb Session机制(有待补充)

    Javaweb Session机制 一.前言 session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个ses ...

  2. JavaWeb—Session与Cookie

    概念 会话:指从一个浏览器窗口打开到关闭期间的一系列动作(可简单理解为用户开一个浏览器,点击多个链接,访问服务器多个web资源,然后关闭浏览器). HTTP协议是无状态协议:每次连接(比如同一个网站的 ...

  3. JavaWeb Session

    1. Session概述 1.1. 什么是Session Session一般译为会话,是解决Http协议的无状态问题的方案,可以将一次会话中的数据存储在服务器端的内存中,保证在下一次的会话中可以使用. ...

  4. JavaWeb Session详解

    代码地址如下:http://www.demodashi.com/demo/12756.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + ## Session的由来 上一篇博文介绍 ...

  5. JavaWeb Session 状态管理

    引言 HTTP 协议是一个无状态的协议,简单理解就是两次请求/响应无法记录或保存状态信息.但是动态 Web 项目开发是需要保存请求状态的,比如用户的登录状态,但 HTTP 协议层不支持状态保存,所以需 ...

  6. JavaWeb -- Session应用实例 -- 随机中文验证码 检验

    注册页面 login.html <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html ...

  7. JavaWeb -- Session实例 -- 自动登录 和 防止表单重复提交(令牌产生器) MD5码

    1. 自动登录 http://blog.csdn.net/xj626852095/article/details/16825659 2. 防止表单重复提交 表单Servlet //负责产生表单 pub ...

  8. javaWeb学习-----session

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

  9. JavaWeb学习总结(十二)——Session

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

  10. (转)JavaWeb学习总结(十三)——使用Session防止表单重复提交

    如何防止表单重复提交 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复 ...

随机推荐

  1. Omi教程-通讯通讯攻略大全

    组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 (支持复杂数据类型的映射) 父容器设 ...

  2. rips中如何使用PHP虚拟机自带函数--token_get_all

    这两天在看rips源码,发现,它在审计php代码时调用了php虚拟机自带的token_get_all此函数. 这一函数会将php源码按照内置的规则进行归纳,并输出成数组格式. 如: <?php ...

  3. show_you_my_codes 001

    program 001 第 0001 题:做为 Apple Store App 独立开发者,你要搞限时促销,为你的应用生成激活码(或者优惠券), 使用 Python 如何生成 200 个激活码(或者优 ...

  4. Mysql动态sql语句,用当前时间做表名

    在mysql备份操作中, 我们可能要使用表名和当前时间来做为备份表的名称,但是MySQL在存储过程中不支持使用变量名来做表名或者列名. 例如:有一个表"user",我需要备份一份, ...

  5. Alamofire源码解读系列(二)之错误处理(AFError)

    本篇主要讲解Alamofire中错误的处理机制 前言 在开发中,往往最容易被忽略的内容就是对错误的处理.有经验的开发者,能够对自己写的每行代码负责,而且非常清楚自己写的代码在什么时候会出现异常,这样就 ...

  6. UITableView多层展开与收起

    规则要求: tableview 有多层,类似于xcode文件目录的层级关系,每一个最开始展示的层姑且称之为根目录吧,并且,每个根目录下的层数不定. 与文件目录类似,每个目录下可以有不同层级的目录同时展 ...

  7. asp.net EF+MVC+Bootstrap 通用后台管理系统

    需要源码,请加QQ:858-048-581 开发环境: VS2012或以上 数据库: SQL Server 2008R2或以上   基于EF+MVC+Bootstrap构建通用后台管理系统,集成轻量级 ...

  8. HTTP和HTTPS协议

    网络协议为计算机网络中进行数据交换而建立的规则.标准或约定的集合. URL:就是网址.http://www.hcios.com/archives/1547 URL就是资源的地址,位置.互联网上的每一个 ...

  9. 全文搜索 Contains 与like 的区别

    全文搜索:是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式. ...

  10. Laravel路由

    Laravel安装,这里使用一键安装包. 使用PHP内置的Web服务器,在PHP文件夹下运行命令行 php -S 0.0.0.0:1024 一.设置路由 路由文件在app\HTTP\routes.ph ...