在编写客服端时,为实现用户会话跟踪常常使用session和 cookie 相结合的方法
首先服务其生成session 和身份凭证token
HttpSession session= request.getSession();
String token=UUID.randomUUID().toString().toUpperCase();
session.setAttribute("token", token);
向客服端写入cookie
Cookie tokenCokie=new Cookie("token",token);
tokenCokie.setMaxAge(1000);
String Membertag="memberId";
Cookie memberCookie=new Cookie("Membertag",Membertag);
memberCookie.setMaxAge(1000);
response.addCookie(tokenCokie);
response.addCookie(memberCookie);
服务端验证与会话跟踪
String cMembertag=null;
String cToken=null;
Cookie[] cookies= request.getCookies();
if(cookies!=null){
for(Cookie cookie:cookies){
if(cookie.getName().equals("cookie")){
cToken=cookie.getValue();
}else if(cookie.getName().equals("Membertag")){
cMembertag=cookie.getValue();;
}
}
}
HttpSession Session = request.getSession(true);
if(cToken.equals(session.getAttribute("token"))){
//验证通过
}else{
//验证不通过
}
这样便实现的客服端的回话跟踪的实现
但是存在安全风险,
在客服端登入后由于token是不变的故可以使用Fidder等工具构建请求,重而实现不用使用客服端也可访问服务。
为解决这样的问题,可以通过构建动态tonken实现具体如下
首先服务其生成session 和身份凭证token不变
HttpSession session= request.getSession();
String token=UUID.randomUUID().toString().toUpperCase();
session.setAttribute("token", token);
向客服端写入cookie
获取系统时间戳
String time= String.valueOf(System.currentTimeMillis());
设置客服端tokenCokie为token+";"+time
token=token+";"+time
//对token进行加密自密钥为123456 之后将结果设置给客户端的cokie
token=Decoder(token,"123456")
Cookie tokenCokie=new Cookie("token",token);
tokenCokie.setMaxAge(1000);
String Membertag="memberId";
Cookie memberCookie=new Cookie("Membertag",Membertag);
memberCookie.setMaxAge(1000);
response.addCookie(tokenCokie);
response.addCookie(memberCookie);
客户端对收到的结果进行的 tokenCokie进行解密将的得到时间戳和token
并将 token+";"+客服端时间戳 的结果进过加密后设置在cookie 作为下一次访问使用
String cMembertag=null;
String cToken=null;
Cookie[] cookies= request.getCookies();
if(cookies!=null){
for(Cookie cookie:cookies){
if(cookie.getName().equals("cookie")){
//取出cToken
cToken=cookie.getValue();
//取出cToken中的token cToken的值为(Token+";"+时间戳)
cToken=Token
}else if(cookie.getName().equals("Membertag")){
cMembertag=cookie.getValue();;
}
}
}
HttpSession Session = request.getSession(true);
if(cToken.equals(session.getAttribute("token"))){
//验证通过
。。。。。。
为客服端设置新的cookie 值为 token =ession.getAttribute("token")+";"+时间戳
}else{
//验证不通过
}
首先服务其生成session 和身份凭证token
HttpSession session= request.getSession();
String token=UUID.randomUUID().toString().toUpperCase();
session.setAttribute("token", token);
向客服端写入cookie
Cookie tokenCokie=new Cookie("token",token);
tokenCokie.setMaxAge(1000);
String Membertag="memberId";
Cookie memberCookie=new Cookie("Membertag",Membertag);
memberCookie.setMaxAge(1000);
response.addCookie(tokenCokie);
response.addCookie(memberCookie);
服务端验证与会话跟踪
String cMembertag=null;
String cToken=null;
Cookie[] cookies= request.getCookies();
if(cookies!=null){
for(Cookie cookie:cookies){
if(cookie.getName().equals("cookie")){
cToken=cookie.getValue();
}else if(cookie.getName().equals("Membertag")){
cMembertag=cookie.getValue();;
}
}
}
HttpSession Session = request.getSession(true);
if(cToken.equals(session.getAttribute("token"))){
//验证通过
}else{
//验证不通过
}
这样便实现的客服端的回话跟踪的实现
但是存在安全风险,
在客服端登入后由于token是不变的故可以使用Fidder等工具构建请求,重而实现不用使用客服端也可访问服务。
为解决这样的问题,可以通过构建动态tonken实现具体如下
首先服务其生成session 和身份凭证token不变
HttpSession session= request.getSession();
String token=UUID.randomUUID().toString().toUpperCase();
session.setAttribute("token", token);
向客服端写入cookie
获取系统时间戳
String time= String.valueOf(System.currentTimeMillis());
设置客服端tokenCokie为token+";"+time
token=token+";"+time
//对token进行加密自密钥为123456 之后将结果设置给客户端的cokie
token=Decoder(token,"123456")
Cookie tokenCokie=new Cookie("token",token);
tokenCokie.setMaxAge(1000);
String Membertag="memberId";
Cookie memberCookie=new Cookie("Membertag",Membertag);
memberCookie.setMaxAge(1000);
response.addCookie(tokenCokie);
response.addCookie(memberCookie);
客户端对收到的结果进行的 tokenCokie进行解密将的得到时间戳和token
并将 token+";"+客服端时间戳 的结果进过加密后设置在cookie 作为下一次访问使用
String cMembertag=null;
String cToken=null;
Cookie[] cookies= request.getCookies();
if(cookies!=null){
for(Cookie cookie:cookies){
if(cookie.getName().equals("cookie")){
//取出cToken
cToken=cookie.getValue();
//取出cToken中的token cToken的值为(Token+";"+时间戳)
cToken=Token
}else if(cookie.getName().equals("Membertag")){
cMembertag=cookie.getValue();;
}
}
}
HttpSession Session = request.getSession(true);
if(cToken.equals(session.getAttribute("token"))){
//验证通过
。。。。。。
为客服端设置新的cookie 值为 token =ession.getAttribute("token")+";"+时间戳
}else{
//验证不通过
}