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);}}
点击刷新按钮,再次请求服务器,此时就可以看到浏览器再请求服务器时,会把存储到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);}}
- JavaWeb学习心得之session
- JavaWeb学习心得之Cookie
- JavaWeb学习心得之Web简介
- JavaWeb学习心得之Http协议
- JavaWeb学习心得之HttpServletResponse对象
- JavaWeb学习心得之HttpServletRequest对象
- JavaWeb学习心得之JSP原理
- JavaWeb学习心得之JSP指令
- JavaWeb学习心得之JSP标签
- JavaWeb学习心得之EL表达式
- JavaWeb学习心得之JDBC入门
- JavaWeb学习心得之JDBC批处理
- JavaWeb学习心得之JDBC事务
- JavaWeb学习心得之数据库连接池
- JavaWeb之Session技术
- JavaWeb之Session笔记
- JavaWeb 之 Session 详解
- JavaWeb之Session
- 剑指offer-64题 滑动窗口的最大值
- 安卓的基础介绍
- java web读取显示图片
- Linux 基础命令(十三)—— SHELL脚本编程进阶(二)
- ISO2626学习笔记
- JavaWeb学习心得之session
- Redis命令学习
- Discuz!数据库操作DB类和C::t类介绍
- Python在win系统下对文件操作时文件路径问题
- Error: JAVA_HOME is not set and could not be found 启动hadoop报错
- 技术面试技巧
- Linux内核、驱动深度剖析与编程4天线下课(送驱动书+双核ARM板) 11月15-18日上海见
- 分数化小数保留多位(思路)
- 51nod 1004:n^n的末位数字