JavaWeb应用如何实现保持登录状态

做JavaWeb开发,难免会遇到登录系统保持登录状态的问题?比如说我登录过后关闭浏览器,下次再访问相同的网站,默认会显示已登录状态,一段时间内就不必再重新登录了;再比如站在后台接口设计的角度去考虑,用户登录后,做了一系列的用户操作接口,那么这些接口不可能都带上一个userid的字段吧,这样不仅开发麻烦,而且容易被黑客攻击。那么如何解决这些问题呢?那就是通过代理服务对客户端请求的拦截来实现,经过验证后才开始执行业务逻辑。

如何搭建代理服务的过程,这里就不详细介绍了,我们以实现保持登录状态为例,实现原理大概是这样子的:

1.客户端请求后台登录接口。

2.后台验证通过后,将用户的登录状态保存至cookie并写入客户端。

3.客户端再次登录网站,请求login接口时,后台直接从客户端获取到该用户写入cookie的登录状态。

4.通过对该状态的验证,确认用户是否需要再次登录。

5.如cookie过期,则跳转至登录页;如未过期,则直接显示为已登录状态。

这里前端js用ajax请求即可,如请求一个url地址:



我们要注意一点,在请求成功后的Response Headers中,有Set-Cookie一项,设置一个key为java,value为myJavaData的Map值,这个是重点,有这个值客户端就会自动把这个Map值设为cookie值,这就是我们所说的登录状态loginState,如下图所示:


那么这个Set-Cookie一项数据怎么来呢?是通过Java后台设置的,源码如下:

[javascript] view plain copy
print ?
  1. // 设置格式  
  2. response.setHeader(”Access-Control-Allow-Origin”“*”);  
  3. response.setHeader(”Access-Control-Allow-Methods”“POST”);  
  4. response.setHeader(”Access-Control-Allow-Headers”,“x-requested-with,content-type”);  
  5. response.setContentType(”text/html;charset=utf-8”);  
  6. response.setCharacterEncoding(”utf-8”);  
  7.   
  8. // 创建Cookie  
  9. Cookie cookie = new Cookie(“java”“myJavaData”);  
  10. // 有效期,秒为单位  
  11. cookie.setMaxAge(3600);  
  12. // 设置cookie  
  13. response.addCookie(cookie);  
  14. response.getWriter().print(”cookie创建成功”);  
// 设置格式
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST");
response.setHeader("Access-Control-Allow-Headers","x-requested-with,content-type");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");

// 创建Cookie
Cookie cookie = new Cookie("java", "myJavaData");
// 有效期,秒为单位
cookie.setMaxAge(3600);
// 设置cookie
response.addCookie(cookie);
response.getWriter().print("cookie创建成功");
这样一来,就实现了在后台服务端为客户端设置cookie的功能,用户在下次请求相同域的接口时,java后台只需
[javascript] view plain copy
print ?
  1. // 获取客户端cookie  
  2. request.setCharacterEncoding(”utf-8”);  
  3. Cookie[] cookies = request.getCookies();  
  4. if (cookies != null) {  
  5.     for (Cookie c : cookies) {  
  6.         System.out.println(c.getName() + ”—>” + c.getValue());  
  7.     }  
  8. }  
// 获取客户端cookie
request.setCharacterEncoding("utf-8");
Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie c : cookies) {
        System.out.println(c.getName() + "--->" + c.getValue());
    }
}
即可获取客户端的登录状态,从而做出响应操作。
(注)此处的cookie值无需客户端专门带入,会随请求自动传输到后台。上例中的setMaxAge即为登录状态的有效期设置点。

还有一种业务状态是希望,用户只要关闭了浏览器,该登录状态就会清除,下次打开浏览器必须重新登录,如CSDN博客登录即使如此。

这种情况我们可以使用session会话实现:

java后台设置session代码

[javascript] view plain copy
print ?
  1. // 设置格式  
  2. response.setHeader(”Access-Control-Allow-Origin”“*”);  
  3. response.setHeader(”Access-Control-Allow-Methods”“POST”);  
  4. response.setHeader(”Access-Control-Allow-Headers”,“x-requested-with,content-type”);  
  5. response.setContentType(”text/html;charset=utf-8”);  
  6. response.setCharacterEncoding(”utf-8”);  
  7.   
  8. // 使用request对象的getSession()获取session,如果session不存在则创建一个  
  9. HttpSession session = request.getSession();  
  10. // 将数据存储到session中  
  11. session.setAttribute(”java”“myJavaData”);  
  12. // 获取session的Id  
  13. String sessionId = session.getId();  
  14. // 判断session是不是新创建的  
  15. if (session.isNew()) {  
  16.     response.getWriter().print(”session创建成功,session的id是:” + sessionId);  
  17. else {  
  18.     System.out.println(session.getAttribute(”java”)); // 值myJavaData  
  19.     response.getWriter().print(  
  20.             ”服务器已经存在该session了,session的id是:” + sessionId);  
  21. }  
// 设置格式
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "POST");
response.setHeader("Access-Control-Allow-Headers","x-requested-with,content-type");
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("utf-8");

// 使用request对象的getSession()获取session,如果session不存在则创建一个
HttpSession session = request.getSession();
// 将数据存储到session中
session.setAttribute("java", "myJavaData");
// 获取session的Id
String sessionId = session.getId();
// 判断session是不是新创建的
if (session.isNew()) {
    response.getWriter().print("session创建成功,session的id是:" + sessionId);
} else {
    System.out.println(session.getAttribute("java")); // 值myJavaData
    response.getWriter().print(
            "服务器已经存在该session了,session的id是:" + sessionId);
}
客户端请求后,Set-Cookie一项同样具备了值:


当然,上面只是举了一些简单的例子,在实际应用中不可能只保存一个loginState这么简单,还会保存如OSS_COOKIES等安全验证字段,以上实现都是在请求与页面同域的情况下。如果想要跨域实现,即客户端与后台不在同一个域名下,则通过JSONP实现。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值