JavaWeb学习心得之session

来源:互联网 发布:贵金属交易软件 编辑:程序博客网 时间:2024/06/05 05:57

一、session简介

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


二、session实现原理

       服务器创建session后,会把session的id号,以cookie的形式回写给客户端,只要客户端的浏览器不管,再去访问服务器时都会带着session的Id,服务器发现哭护短带着session id过来,就会使用内存中与之对应的session为之服务。

import java.io.IOException;import java.io.PrintWriter;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 SessionDemo01 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setCharacterEncoding("utf-8");response.setHeader("content-type", "text/html;charset=utf-8");PrintWriter pw = response.getWriter();HttpSession session = request.getSession();session.setAttribute("data", "韩信");String sessionId = session.getId();if(session.isNew()){pw.print("session创建成功,sessionId是:"+sessionId);}else{pw.print("服务器已经存在该session,sessionID是:"+session);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}


第一次访问时,服务器会创建一个新的sesion,并且把session的Id以cookie的形式发送给客户端浏览器。

点击刷新按钮,再次请求服务器,此时就可以看到浏览器再请求服务器时,会把存储到cookie中的session的Id一起传递到服务器端了。


三、Session对象的创建和销毁时机

1.创建

在程序中第一次调用request.getSession()方法时就会创建一个新的Session,可以用isNew()方法来判断Session是不是新创建的。

//使用request对象的getSession()获取session,如果session不存在则创建一个HttpSession session = request.getSession();//获取session的IdString sessionId = session.getId();//判断session是不是新创建的if (session.isNew()) {    response.getWriter().print("session创建成功,session的id是:"+sessionId);}else {    response.getWriter().print("服务器已经存在session,session的id是:"+sessionId);}

2.销毁

session对象默认30分钟没有使用,则服务器会自动销毁session,在web.xml文件中可以手工配置session的失效时间。

<?xml version="1.0" encoding="UTF-8"?><web-app version="2.5"     xmlns="http://java.sun.com/xml/ns/javaee"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  <display-name></display-name>    <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list>  <!-- 设置Session的有效时间:以分钟为单位-->    <session-config>        <session-timeout>15</session-timeout>    </session-config></web-app>

当需要在程序中手动设置Session失效时,可以手工调用session.invalidate方法,摧毁session。

1 HttpSession session = request.getSession();2 //手工调用session.invalidate方法,摧毁session3 session.invalidate();

四、利用session防止表单重复提交

       具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。

Token生成类

import java.security.MessageDigest;import java.util.Random;import sun.misc.BASE64Encoder;/** * Token工具类,单例模式(保证内存中只有一个实例对象) *  * @author hanxin * */public class TokenUtil {private static TokenUtil instance;private TokenUtil(){}/* * 返回实例对象,如果没有对象就新建一个对象 */public static TokenUtil getInstance(){if(instance==null){instance = new TokenUtil();}return instance;}/* * 生成token */public String getToken(){String token =String.valueOf(System.currentTimeMillis()+new Random().nextInt(999999999));//数据指纹   128位长   16个字节  md5try{MessageDigest md = MessageDigest.getInstance("md5");byte[] md5 = md.digest(token.getBytes());//base64编码--任意二进制编码明文字符BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(md5);}catch(Exception e){e.printStackTrace();}return null;}}
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class SessionDemo02 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String token = TokenUtil.getInstance().getToken();//创建令牌request.getSession().setAttribute("token", token);//保存到session中request.getRequestDispatcher("/form.jsp").forward(request, response);//跳转到form.jsp中}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}

表单

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>form表单</title></head><body>    <form action="${pageContext.request.contextPath}/SessionDemo03.do" method="post">        <%--使用隐藏域存储生成的token--%>        <%--            <input type="hidden" name="token" value="<%=session.getAttribute("token") %>">        --%>        <%--使用EL表达式取出存储在session中的token--%>        <input type="hidden" name="token" value="${token}"/>         用户名:<input type="text" name="username">         <input type="submit" value="提交">    </form></body></html>

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class SessionDemo03 extends HttpServlet{@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String token_client = request.getParameter("token");//1、如果用户提交的表单数据中没有token,则用户是重复提交了表单if(token_client==null){return;}String token_server = (String)request.getSession().getAttribute("token");//2、如果当前用户的Session中不存在Token(令牌),则用户是重复提交了表单if(token_server==null){return;}//3、存储在Session中的Token(令牌)与表单提交的Token(令牌)不同,则用户是重复提交了表单if(!token_client.equals(token_server)){return;}request.getSession().removeAttribute("token");//移除session中的tokenSystem.out.println("处理用户提交请求!!");}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}}



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 抗链0高关节疼怎么办 近视800度老了怎么办 军检体重不达标怎么办 到交房租没有钱怎么办 房租没到期房东要收回怎么办 客户指定发快递我要怎么办? 跨境汇款被退回怎么办 汇款途径写错了怎么办 快递被菜鸟驿站退回怎么办 电脑登录账户已锁定怎么办 被外管局查到境外汇款买房怎么办 军校生复检被刷怎么办 企业私刻章拿去挂项目怎么办? 中通快递被退回怎么办 网易邮箱提示被修复怎么办 小孩屁股烫红了怎么办 8岁近视400度怎么办 部队体能差的人怎么办 上环5天同房了怎么办 肾结石有3mm了怎么办 4*3mm肾结石好痛怎么办 做完肾结石积水后迟续发烧怎么办 血糖高有肾结石反复发高烧怎么办 肾里面有小结石怎么办 大于2厘米的结石怎么办 双肾结石肾盏扩张怎么办 边防消防警卫部队改革义务兵怎么办 汽车年检尾气复检不合格怎么办 车辆年检尾气不合格复检怎么办? 在瓜子上买车复检有问题怎么办 更换车壳车架号怎么办 吸完甲醛的绿萝怎么办 如果公务员复检不合格有异议怎么办 国考公务员政审没有毕业证怎么办 打针硬块4年不消怎么办 外墙补起来难看不好卖怎么办 杠精现实中应该怎么办 发现记者报道假新闻怎么办 2018消防兵转制到期士官怎么办 小孩睡觉老想着军训怎么办 1岁宝宝太老实了怎么办