0%

由一个问题:String和包装类型为何同基本数据类型一样在作为参数时不会感知函数内的改变,思考到Java的参数传递类型,所对应的求值策略。

阅读全文 »

参考博客:https://blog.csdn.net/yztezhl/article/details/19081235?utm_source=blogxgwz0

因博客主未标明不可转载,若内容涉及侵权请及时告知,我会尽快修改和删除相关内容

BUG[1]: 因为URL包含jsessionid而导致服务异常

日期:

2018/11/14

问题描述:

  客户端发送请求消息时,第一次的请求总会在请求服务前加上jsessionid,之后则是正常路径。导致了某个服务第一次总不能正常调用,需要刷新一次页面。

捕获如下类似请求:

log - [URI]: {/XXX/;jsessionid=6501CED1739FB38773E3F8AB023769F3/layui/lay/modules/upload.js}
log - [URI]: {/XXX/;jsessionid=6501CED1739FB38773E3F8AB023769F3xxx/xxx?xxx}

  很明显的发现,因为写服务时URL格式为XXX/XXX导致服务器认为xxx是sessionid的一部分,而第二次访问时url未写入jsessionid所以可以正常使用。

解决方法:

  只要在请求地址前老实的加一个“/”即可

相关基础知识复习:

  Cookie机制,就是浏览器保存一些数据参数,记录状态。
  Session机制,就是服务器保存数据参数来控制状态。

会话cookie和持久cookie:

  若不设置存活时间,cookie的生命周期就是浏览器打开到关闭过程,即会话cookie,一般保存在内存中。

  若设置了存活时间,cookie会被存到硬盘中,不会因浏览器关闭而失去状态,不会因不同窗口而失去状态,即持久cookie。

如何实现自动登陆?

  用户完成注册过程后,浏览器记录一个用户唯一ID的cookie,当客户以后连接时,会自动返回该ID,服务器检查此ID,确认是否为正确用户,决定是否允许登陆。

发送cookie

  创建cookie对象,设置最大时效,将cookie放入响应消息头部中,此过程为创建新的消息头,要在文档内容等发送回客户端前进行。

读取cookie

  读取消息cookie对象数组,循环取出对应cookie。

Session机制

  Session是服务器端机制,服务器通常用散列表来保存信息,当程序为某个请求创建session时(比如登陆),服务器首先检查此请求中是否包含一个session标识,即sessionid。若包含sessionid,表示已为此用户创建过session,服务器就依照这个sessionid把session检索出来使用,检索不到可能会新建一个。

  若客户请求中不含sessionid,服务器为客户创建一个session并返回sessionid给客户端保存。

客户端保存sessionid的方式

  1. cookie保存sessionid

  2. cookie可能被禁止,所以有其他机制来实现同样的功能,其中常用的叫URL重写,就是把sessionid附加在URL路径后面,附加方式有两种:一个是作为URL路径的附加信息,一个是作为查询字符串附加在URL后面,所以每次请求路径都要包含sessionid

  3. 还有一种技术叫表单隐藏字段,服务器自动修改表单,添加一个隐藏字段,当表单提交时把sessionid返回给服务器。

Session什么时候创建?

  当服务器端执行相关创建代码时。

Session何时被删除?

  1. 程序调用HttpSession.invalidate()
  2. 超过有效时间
  3. 服务器进程停止

  注意:关闭浏览器只会让浏览器内存内存储sessionid的cookie失效,不会影响服务器session对象。

URL重写的缺点

  需要对所有的URL使用URL重写,都要添加额外的信息,所有界面都要通过服务器后端的处理,不然就会导致会话信息丢失sessionid过期。

隐藏表单域的缺点

  只有当每个页面都有表单提交时才可以使用这种方法,所以没有表单提交时就无法跟踪会话。