servlet session 跟踪用户上次访问时间

1、是什么? 上次访问时间;即用户最近一次登录时间; 

2、为什么? 为了提示用户登录或访问记录,提高安全性,如qq登录提示; 

3、怎么做? 通过cookie 实现; 用户第1次登录, 服务器把访问时间放入cookie 并作为响应报文返回浏览器,浏览器将cookie 存入磁盘,每次(除第一次外)访问都带上她;

补充: 本文在cookie中存储了访问时间,若业务场景需要,可以存储其他数据;  

【荔枝】(转自张孝祥)


// 跟踪上次客户访问时间 
public class AccessTimeServlet extends HttpServlet
{public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{response.setContentType("text/html;charset=gb2312");PrintWriter out = response.getWriter();//获取记录用户上次访问站点时间的CookieCookie [] cks = request.getCookies();String lastAccessTime = getCookie(cks,"access_time");if(lastAccessTime == null){out.println("没有您上次的访问记录");}else{BASE64Decoder decoder = new BASE64Decoder();String decodedAccessTime = new String(decoder.decodeBuffer(lastAccessTime),"GB2312");out.println("您上次的访问时间为" + decodedAccessTime);}//将用户开始本次访问的时间存储到客户端Cookie中HttpSession session = request.getSession();if(session.isNew()){long createTime = session.getCreationTime();Date dateCreateTime = new Date(createTime);SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd HH点mm分ss秒");String formatedCreateTime = sdf.format(dateCreateTime);BASE64Encoder encoder = new sun.misc.BASE64Encoder();String base64CreateTime = encoder.encode(formatedCreateTime.getBytes("GB2312"));Cookie ckAccessTime = new Cookie("access_time",base64CreateTime);ckAccessTime.setMaxAge(365*24*3600);out.println(formatedCreateTime);response.addCookie(ckAccessTime);}}private String getCookie(Cookie [] cks,String cookieName){String cookieValue = null;for(int i=0; cks!=null && i<cks.length; i++){if(cookieName.equals(cks[i].getName())){cookieValue = cks[i].getValue();break;} } return cookieValue;}
}

4、访问效果

第1次, cookie中没有储存 最近一次访问的记录; 

第2次访问,及其以后 ; 因为第1次服务器已经把 访问时间存入cookie, 浏览器将cookie存入本地文件了;所以后续的访问,浏览器请求报文头都会带上服务器返回的cookie 数据;

 

5、为什么 访问时间access_time 看起来不对劲呢。

因为 access_time 字段值包含中文,如果不经过BASE64编码,那经过网络传输,可能会丢数据; 

所以 该字段经过 BASE64 编码过,这里要注意,  BASE64 不是加密算法,而是编码格式,如UTF-8 GBK 编码格式,两者有本质区别

base64 是什么? Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。目前 Base64 已经成为网络上常见的传输 8 位二进制字节代码的编码方式之一。

base64 为什么?

我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。
而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,
由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。
所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。

base64 怎么做?  

它的编码过程如下:
步骤1:将待转换的字符串每三个字节分为一组,每个字节占 8 个二进制位,那么共有 24 个二进制位。
步骤2:将第(1)步得到的每 24 个二进制位分为每 6 个一组,则每 3 个字节可分为 4 组。
步骤3:在每组前面添加两个 0 ,每组由 6 个二进制位变为 8 个二进制位,总共 32 个二进制位,即四个字节。根据 Base64编码对照表(见下表)获得对应的值。

关于 base64 更多信息,可以参考  https://blog.csdn.net/PacosonSWJTU/article/details/109955148 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring MVC表单防重复提交

转载自 Spring MVC表单防重复提交 利用Spring MVC的过滤器及token传递验证来实现表单防重复提交。 创建注解 Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface Token {boolean create() default false;boolean remove() default f…

SpringMvc @RequestParam、 @RequestBody、@RequestPart 的区别

注解RequestParam接收的参数是来自requestHeader中&#xff0c;即请求头。 RequestParam可以接受简单类型的属性&#xff0c;也可以接受对象类型。 RequestParam有三个配置参数&#xff1a; required 表示是否必须&#xff0c;默认为 true&#xff0c;必须。defaultValue 可…

利用session防止表单重复提交

1、是什么&#xff1f;一个表单不能多次提交&#xff1b; 2、为什么&#xff1f; 在网络不好或者并发请求时会导致多次重复提交数据的问题。防止重复提交&#xff0c;可以维护数据一致性&#xff1b; 3、怎么做&#xff1f; 把 session的编号和当前时间戳经过 MD5 加密得到to…

Druid-目前最好的连接池

转载自 Druid-目前最好的连接池 Druid是什么 Druid是阿里开源的连接池&#xff0c;是Java语言中最好的数据库连接池.Druid能够提供强大的监控和扩展功能&#xff0c;是为监控而生的数据库连接池&#xff01; GitHub&#xff1a;https://github.com/alibaba/druid/ 添加依赖 &l…

Nginx 部署 Vue 项目刷新页面出现404

问题 使用Vue.框架&#xff0c;利用vue-route编写了一个单页路由项目&#xff0c;运维协助在服务器端配置nginx。部署完成后&#xff0c;访问首页没问题&#xff0c;从首页里打开二级页面没问题&#xff0c;但是所有的二级页面打开后&#xff0c;再次刷新&#xff0c;就会出现…

repost: intro2token

repost 4 https://blog.csdn.net/Jason_Fangh/article/details/55113627 对于初学者来说&#xff0c;对Token和Session的使用难免会限于困境&#xff0c;开发过程中知道有这个东西&#xff0c;但却不知道为什么要用他&#xff1f;更不知道其原理&#xff0c;今天我就带大家一…

vue - resource 使用过程的坑

一. get 传参的坑&#xff1a;加params对象传参&#xff08;不能直接get(url, params)!!!&#xff09; this.$http.get(url, {params: { offset: this.offset, label: this.categray }})二. 使用post请求&#xff1a; 知识点 post参数的形式 form data(表单&#xff0c;通过url…

repo-关于URL编码

repost 4 http://www.ruanyifeng.com/blog/2010/02/url_encoding.html 一、问题的由来 URL就是网址&#xff0c;只要上网&#xff0c;就一定会用到。 一般来说&#xff0c;URL只能使用英文字母、阿拉伯数字和某些标点符号&#xff0c;不能使用其他文字和符号。比如&#xff0c…

Spring零配置之@Configuration注解详解

转载自 Spring零配置之Configuration注解详解 Configuration介绍 Spring3.0之前要使用Spring必须要有一个xml配置文件&#xff0c;这也是Spring的核心文件&#xff0c;而Spring3.0之后可以不要配置文件了&#xff0c;通过注解Configuration完全搞定。 Configuration即用来代替S…

session实现购物车

1、是什么&#xff1f; session 可以存储会话级变量&#xff0c;基于其实现购物车&#xff1b; 2、为什么&#xff1f; session是会话级变量&#xff0c;可以吧多次请求的数据串联起来&#xff0c;放到会话里&#xff1b; 3、怎么做&#xff1f; 【荔枝】转自 张孝祥 登录…

commons-logging,log4j,logback,slf4j之间的关系详解

转载自 commons-logging,log4j,logback,slf4j之间的关系详解commons-logging是apache最早提供的日志的门面接口。它的主要作用是提供一个日志门面&#xff0c;使用者可以使用不同的日志实现。用户可以自由选择第三方的日志组件作为具体实现&#xff0c;像log4j&#xff0c;或者…

Vue代理配置

在 package.json 的同级目录&#xff08;项目根目录&#xff09;下创建 vue.config.js在 vue.config.js 写入下列内容 module.exports {devServer: {proxy: http://localhost:8080}}这会告诉开发服务器将任何未知请求 (没有匹配到静态文件的请求) 代理到 http://localhost:40…

@Resource,@Autowired,@Inject3种注入方式详解

转载自 Resource,Autowired,Inject3种注入方式详解 概况 Resource,Autowired,Inject 这3种都是用来注入bean的&#xff0c;它们属于不同的程序中。 ANNOTATIONPACKAGESOURCEResourcejavax.annotationJava JSR-250Injectjavax.injectJava JSR-330Autowiredorg.springframework.b…

repost-微信小程序入门教程之一:初次上手

repost 4 http://www.ruanyifeng.com/blog/2020/10/wechat-miniprogram-tutorial-part-one.html 微信是中国使用量最大的手机 App 之一&#xff0c;日活跃用户超过3亿&#xff0c;月活跃用户超过11亿&#xff08;2019年底统计&#xff09;&#xff0c;市场极大。 2017年&#x…

Spring MVC : 概念模型 HandlerMethod(转载)

Spring MVC 应用启动时会搜集并分析每个 Web 控制器方法&#xff0c;从中提取对应的"<请求匹配条件,控制器方法>“映射关系&#xff0c;形成一个映射关系表保存在一个 RequestMappingHandlerMapping bean 中。然后在客户请求到达时&#xff0c;再使用 RequestMappin…

repo-话说软件详细设计工具

repost 4 https://blog.csdn.net/tang_huan_11/article/details/8043481 在软件设计是需要写软件详细说明书,设计此文档的时候,肯定少不了工具.现在我们就来了解一下软件详细设计的 工具. 1)程序流程图 程序流程图又称为程序框图,它是最古老,应用最广泛且最有争议描述详细设计的…

你必须了解Spring的生态

转载自 你必须了解Spring的生态 Spring不止是提供了IOC、AOP的功能&#xff0c;还提供了大量的基于Spring的项目&#xff0c;拿来用就行了&#xff0c;用于一站式开发&#xff0c;大大降低了开发的难度。 下面列举下主要的一些Spring的生态项目&#xff1a; Spring Boot&#…

Vue 使用 token

vue 解析 token 引入jwt-decode 包 npm install jwt-decode --save在 vue 中引入jwt-decode import jwtDecode from jwt-decodejs 中使用 const decode jwtDecode(token); console.log(decode);//解析后的对象vue-resource 设置请求头&#xff0c;带上token 第一种方法&a…

vmware安装centos6-步骤小结

【README】安装了很多次&#xff0c;但没有记录过&#xff0c;经常忘记&#xff0c;所以就记录一下 【1】 vm15 install centos8 at 2020/12/12 完成。

Ehcache介绍及整合Spring实现高速缓存

转载自 Ehcache介绍及整合Spring实现高速缓存 Ehcache介绍 EhCache 是一个纯Java的进程内缓存框架&#xff0c;具有快速、精干等特点&#xff0c;是Hibernate中默认的CacheProvider。它使用的是JVM的堆内存&#xff0c;超过内存可以设置缓存到磁盘&#xff0c;企业版的可以使用…