权限认证解决方案——Cookie和Session

589 阅读3分钟

环境:Java Servlet

1 Session的工作原理

​ 在服务器中系统会为每个会话维护一个Session,不同的会话对应不同的Session

(1)写入Session列表

​ 服务器对当前应用中的Session是以Map的形式进行管理的,这个Map称为Session列表。该Map的key为一个32位长度的随机串,这个随机串称为JSessionID,value则为Session对象的引用。 ​ 当用户第一次提交请求时,服务端Servlet中执行到request.getSession()方法后,会自动生成一个Map.Enty对象,key为一个根据某种算法新生成的JSessionID,value则为新创建的HttpSession对象。

Key value
D329C89C88DEC2189888FDF365961A87 HttpSession的引用1
94C9C89C88DEC21898199FDF36591F82 HttpSession的引用2
...... ......

(2)服务器生成并发送Cookie

​ 在将Session信息写入Session列表后,系统还会自动将"JSESSIONID"作为name,这个32位长度的随机串作为value,以Cookie的形式存放到响应报头中,并随着响应,将该Cookie发送到客户端。

(3)客户端接收并发送Cookie

​ 客户端接收到这个Cookie后会将其存放到浏览器的缓存中。即,只要客户端浏览器不关闭,浏览器缓存中的Cookie就不会消失。 ​ 当用户提交第二次请求时,会将缓存中的这个Cookie,伴随着请求的头部信息,一块发送到服务端。

(4)从Session列表中查找

​ 服务端从请求中读取到客户端发送来的Cookie,并根据Cookie的JSESSIONID的值,从Map中查找相应key所对应的value,即Session对象。然后,对该Session对象的域属性进行读写操作。

2 Cookie禁用后使用Session进行会话跟踪

解决方案:URL重写

response.encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。 **response.encodeURL(java.lang.String url)**用于对表单action和超链接的url地址进行重写

使用URL重写之后会在浏览器地址栏之后拼写

××××;jsessionid=××××

因此禁用Cookie是非常危险的行为

因为一旦在服务器端使用了URL重写技术,则会使JSessionID直接暴露在浏览器地址栏,造成用户信息泄露

3 域属性空间范围对比

  • ServletContext,即application,置入其中的域属性是整个应用范围的,可以完成跨会话共享数据
  • HttpSession,置入其中的域属性是会话范围的,可以完成跨请求共享数据
  • HttpServletRequest,置入其中的域属性是请求范围的,可以完成跨Servlet共享数据,但这些Servlet必须在同一请求中

​ 对于这三个域属性空间对象的使用原则是,在可以保证功能需求的前提下,优先使用小范围的。这样不仅可以节省服务器内存,还可以保证数据的安全性