相信大家在写服务端代码的时候都遇到过登陆权限校验的问题:没登陆的时候没法操作某些命令。
通用的解决方案就是通过session来控制。可大多数人对session一知半解,对于session在客服端与服务器端交互过程中的变化更是不明所以。下面就通过实例(chrome浏览器、tomcat服务器)来解析:客服端和服务器交互过程中session的变化,以及登陆权限校验。
第一部分:客服端和服务器交互过程中session的变化(注意 Request Headers 和 Response Headers)
1.浏览器客服端第一次请求tomcat服务器端,没有带sessionid。请求到了服务器,服务器返回一个sessionid给浏览器客服端
Remote Address:127.0.0.1:9922
Request URL:http://127.0.0.1:9922/saasapi/saasapi
Request Method:POST
Status Code:200 OK
Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Content-Length:90
Content-Type:text/plain;charset=UTF-8
Host:127.0.0.1:9922
Origin:chrome-extension://fhjcajmcbmldlhcimfajhfbgofnpcjmb
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Response Headers
view source
Content-Type:application/json;charset=UTF-8
Date:Wed, 06 May 2015 02:53:24 GMT
Server:Apache-Coyote/1.1
Set-Cookie:JSESSIONID=72FAE585F7AE0642206BE0500317E4F4; Path=/saasapi/; HttpOnly
Transfer-Encoding:chunked
2.浏览器再次请求服务器端,请求的时候带上之前服务器返回的sessionid,服务器端不再返回sessionid
Remote Address:127.0.0.1:9922
Request URL:http://127.0.0.1:9922/saasapi/saasapi
Request Method:POST
Status Code:200 OK
Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Content-Length:90
Content-Type:text/plain;charset=UTF-8
Cookie:JSESSIONID=72FAE585F7AE0642206BE0500317E4F4
Host:127.0.0.1:9922
Origin:chrome-extension://fhjcajmcbmldlhcimfajhfbgofnpcjmb
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Response Headers
view source
Content-Type:application/json;charset=UTF-8
Date:Wed, 06 May 2015 02:56:21 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked
好,通过上面的2个步骤,就应该清楚的知道session在客服端与服务器端的变化了。既然知道session的变化了,就可以通过它,就想校验了。可校验的过程是怎样的呢?
第二部分:通过session进行登录权限校验
1.第一次请求,没有带sessionid。HttpServletRequest没有session数据。
(1)如果是登陆操作(不做用户id等信息校验):此时服务器自己生成了session,服务器自动把session的sessionid返回给了客服端。进行登录操作,并需要手动把用户id等信息写入session中。
(2)如果是非登陆操作(做用户id等信息校验):因为没有sessionid传过来,直接返回错误。此时服务器端仍然自己生成了session,并自动把sessionid返回给了客服端。
2.第二次请求,带上了sessionid。通过sessionid读取session中的用户id等信息。
(1)如果是登陆操作(不做用户id等信息校验):进行登录操作,并把用户id等信息写入session中。
(2)如果是非登陆操作(做用户id等信息校验):
如果此sessionid中能读到用户id等信息,说明已经登录过,通过验证,进行业务操作。
如果没有得到用户id相关信息,说明即使带上了sessionid,可没有进行过登录,属于非法操作,返回错误。
ok,讲解完毕。
这篇文章发了4次才发出来,期间账号被锁定3次。原因就是标题中包含服务器等等词汇,被列为了敏感词,然后账号就被锁了,被封之前也没任何提示!有敏感词点发布的时候你提醒呀,你别等发布之后锁账号删文章呀!