1 . 用户首次访问应用端,未携带cookie数据. 应用端会让用户重定向到服务器.
请求: http://192.168.10.110:8080/ITSSSOClient/index.jsp
重定向: http://192.168.10.110:8080/ITSSSO/SSOAuth?action=preLogin&setCookieURL= http://192.168.10.110:8080/ITSSSOClient/setCookie&gotoURL= http://192.168.10.110:8080/ITSSSOClient/
请求: http://192.168.10.110:8080/ITSSSOClient/index.jsp
重定向: http://192.168.10.110:8080/ITSSSO/SSOAuth?action=preLogin&setCookieURL= http://192.168.10.110:8080/ITSSSOClient/setCookie&gotoURL= http://192.168.10.110:8080/ITSSSOClient/
2.服务器端收到用户的请求,先取得 action=preLogin.判断cookie为null,然后转发到login.jsp
用户的浏览器显示服务器端的login.jsp页面
注:服务端代码133行,地址栏上的URL不改变
3.用户填写表单,登录.
登录时,
应用端会生成一个cookie值,用于传递给服务端处理.
服务器端会获取action=login(来至login页面表单里的action的name)
并进入doLogin, 读取username和password做校验
生成一个唯一码进行加密,且服务端将储存用户登录信息(用户名,登录时间,过期时间),并将加密后的cookie信息返回给应用端.
让浏览器将执行:
out.print("<script type='text/javascript'>");
out.print("document.write(\"<form id='url' method='post'
action='" + setCookieURL + "'>\");");
out.print("document.write(\"<input type='hidden' name='gotoURL' value='" + gotoURL + "' />\");");
out.print("document.write(\"<input type='hidden' name='ticket' value='" + encodedticketKey + "' />\");");
out.print("document.write(\"<input type='hidden' name='expiry' value='" + expiry + "' />\");");
out.print("document.write('</form>');");
out.print("document.getElementById('url').submit();");
out.print("</script>");
setCookieURL : http://127.0.0.1:8080/ITSSSOClient/setCookie
gotoURL :http://127.0.0.1:8080/ITSSSOClient/
encodedticketKey :079482AC1F897530ED61D7B0C891A3EFBE2A3A6F2BAA762036E97E9F5415E625AD6A88B4FA37833D
expiry :604800
4.应用端执行setCookie方法,保存服务器端返回的数据参数.
页面跳转到
http://127.0.0.1
:8080/ITSSSOClient/
此次页面跳转,携带了服务器返回的cookie
5. 应用端拦截跳转链接,进入authCookie方法,填充action值为authTicket.
携带{{
action,
authTicket},{SSOID,
079482AC1F897530ED61D7B0C891A3EFBE2A3A6F2BAA762036E97E9F5415E625AD6A88B4FA37833D
}
}信息去访问认证系统=>
http://127.0.0.1
:8088/ITSSSO/SSOAuth
6.服务端再次接受到应用端的请求,判断action=
authTicket
,并做相应处理(将步骤5中的SSOID值
进行解密判断是否正确
)
判断正确:
返回信息: {"error":false,"username":XXXX}
7.应用端此刻还在 authCookie方法中, 取得服务端返回的信息(主要是在resp中填充username的值).在 http://127.0.0.1 :8088/ITSSSOClient/ ,将页面返回给浏览器.(最初请求的页面)