Servlet - 会话
servletRequest、servletRespones作用于链接
servletContext作用于全局
Cookie客户端技术,大家都知道的。
Session服务器端技术--为每一个客户端创造一个独享的Session对象
Session
关键点是,在getSession时,如果不存在当前会话,会自动创建,以后再getSession的时候,用的就是这个了。
Cookie
response.addCookie(),为会话加入一个cookie;
request.getCookies(),获取当前会话的cookies;
Cookie.setMaxAge(),设置生存周期,默认值为浏览器页面时间
Cookie.setPath(),设置有效目录,默认值为当前程序所在目录
Cookie.setDomian,设置域,例如(.sina.com.cn),记得前面加点(.)。浏览器一般会禁止写入第三方域。
example:
显示用户上次访问时间示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | public void doGet(.....){ //解决乱码 response.setCharacterEncoding( "UTF-8" ); response.setContentType( "text/html;charset=UTF-8" ); //获得一个writer PrintWriter out=response.getWriter(); out.write( "上次访问时间" ); //获得cookies Cookie cookies[]=request.getCookies(); //遍历所有cookie并进行非空判断 for ( int i= 0 ;cookies!= null && i<cookies.length;i++){ Cookie cookie=cookies[i]; //取得存取最后访问时间的cookie if (cookie.getName().equals( "lastAccessTime" )){ //取得cookie值 String value=cookie.getValue(); //将毫秒时间转换格式化 Date d= new Date(Long.parseLong(value)); out.writer(d.toLocaleString()); } //更新cookie的最后访问时间 Cookie cookie= new Cookie( "lastAccessTime" ,System.currentTimeMills()+ "" ); //设置cookie存活时间,这里是一周。 cookie.setMaxAge( 60 * 60 * 24 * 7 ); //设置cookie目录,只要访问当前目录下,无论存不存在页面,都会携带此cookie访问 cookie.setPath( "/***" ); //写入这个cookie response.addCookie(cookie); } |
注意,浏览器一般只允许存放300个Cookie,每个站点最多20个,每个Cookie最大4kb。
example:
删除cookie
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public void doGet(.....){ //首先新建一个cookie,名称为要删除cookie的名字 Cookie cookie= new Cookie( "lastAccessTime" , "" ); //将存活时间设置为0 cookie.setMaxAge( 0 ); //访问目录要与目标cookie一样 cookie.setPath( "/***" ); //写入cookie,就会替换原始cookie,并删除 response.addCookie(cookie); } |
判断表单重复提交的事例:
判断重复提交的流程,一般是这样的,在提交的表单中,加入一个随机数,提交表单的时候,一起提交,然后与服务器端session中的随机数(令牌)对比,如果存在,则提交,并且从session中删除这个令牌(随机数)。如果重复提交,提交的随机数与session中无法匹配,则对提交内容不作处理。
一个通用的令牌生成关键代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | class TokenProcessor{ //令牌 /* * 1.把构造方法私有 * 2.自己创建一个 * 3.对外暴露一个方法,允许获取上面创建的对象 */ private TokenProcessor(){} private static final TokenProcessor instance = new TokenProcessor(); public static TokenProcessor getInstance(){ return instance; } public String generateToken(){ //这样获得的随机数长短不一 String token = System.currentTimeMillis() + new Random().nextInt() + "" ; try { //所以,对他们进行一次md5,取得固定长度的摘要 MessageDigest md = MessageDigest.getInstance( "md5" ); byte [] md5 = md.digest(token.getBytes()); //base64编码,这样做的目的是,避免字节码偶然出现通讯中的结束位,误判断并提前结束传输 //base64是每6位前补00,形成一个字节,然后根据码表转换为键盘上的可见字符。 BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(md5); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述