状态管理之Cookie和Session

延申上一篇的2周自动登录功能java登录验证码、2周内自动登录例题、注销

一、现有问题

  1. HTTP协议是无状态的,不能保存每次提交的信息
  2. 如果用户发来一个新的请求,服务器无法知道它是否与上次的请求有联系
  3. 比如登录:点击登录进入首页,而每一次的跳转都是一个新的请求,无法得知是否登录过,跳转到首页,我只知道你点击登录按钮,发送的请求是访问首页,而这个时候,是不知道你之前登录过的数据的
  4. 状态管理就是将你web服务器和浏览器交互过程中,所涉及的涉及(即状态)保存下来

二、状态管理分类

  1. 客户端状态管理技术:将状态保存在客户端。代表性的是Cookie技术
  2. 服务器状态管理技术:将状态保存在服务器端。代表性的是Session技术

三、2周内免登录问题

  1. 就是在Servlet页面:UserController的login方法里面,把用户登录的username和password存在客户端,注意将状态保存在客户端,所以我们要用Cookie
  2. 登录数据是保存在客户端的,所以我们在Web服务器端写一个filter页面,对login.jsp页面进行过滤,
  3. 该filter页面就是获取客户端的Cookie,如果没有数据,说明没有登录过,有数据,那就获取数据(username和password)并实现自动登录
  4. filter页面:AutoFilter,implements了Filter,@WebFilter(value="/login.jsp")
  5. 在下一次客户端再次访问login登录页面的时候
  6. 有filter页面对login.jsp进行过滤
  7. 如果有数据直接自动登录并跳转到首页

四、Cookie的使用

4.1 Cookie的创建
Cookie ck = new Cookie(name,value);
  1. 实现自动登录
  2. 用户填写的username和password
  3. String content= username+":"+password
  4. 把content保存在cookie里,name命名为autoLoginUser(自动登录用户)
  5. 创建Cookie如下
 Cookie ck = new Cookie("autoLoginUser",content);
4.2 设置Cookie的访问路径
  1. 可以指定某个Servlet可以访问这个Cookie
  2. 代码如下
ck.setPath("/user");
  1. 将来可以访问上面定义的autoLoginUser的只能是/user或者的/user下面的资源
  2. 给个“/”就是所有路径都可以访问
4.3 设置Cookie的生命周期
  1. 取值有3种:>0会认为单位为秒,比如给2*24*60*60,就是2天
  2. =0 浏览器关闭
  3. <0 浏览器关闭就没有了,临时存储
  4. 实现2周自动登录代码如下
ck.setMaxAge(14*24*60*60);//这里设置生命周期为2周
4.4 添加ck到response对象,响应时发送给客户端(就是浏览器)
response.addCookie(ck);

全部代码

String content = username+":"+password;
Cookie ck = new Cookie("autoLoginUser",content);
ck.setPath("/");//所有路径都可以访问
ck.setMaxAge(14*24*6*60);//生命周期为14天
response.addCookie(ck);

五、AutoFilter页面获取Cookie

  1. 重点就是request.getCookies();获取的是一个cookie数组
  2. Cookie[] cookies = request.getCookies();
  3. foreach遍历上面的数组
  4. 找到name=autoLoginUser的cookie,获取其value值
if(ck.getName().equals("autoLoginUser")){
	content = ck.getValue();
}
  1. 然后对获取的value(赋值给了content),也就是content进行操作
  2. 因为刚刚给的是username+":"+passwrod,所以还需要对这个字符串进行分割成字符数组
if (content != null) {
	String[] str = content.split(":");
	String username = str[0];
	String passwrod = str[1];
}
  1. 接下来就是通过cookie获取的username和password实现登录
  2. 调用业务逻辑层UserServiceImpl的login方法
UserService userService = new UserServiceImpl();
User user = userService.login(username,password);
if(user!=null){
	
}
  1. 如果这个查到的user不为空,就把user保存到web服务器端,所以用到Session保存user;如果为空,就是没有登录过,直接pase就行了
  2. HttpSession session =request.getSession()
  3. 这里还有个重点,Filter的doFilter方法的参数:req和resp 是ServletRequest、ServletResponse类型,所以还有强转为HttpServletRequest、HttpServletResponse 类型
if(user!=null){
	HttpServletRequest request = (HttpServletRequest)req;
	HttpServletResponse response = (HttpServletResponse)resp;
	HttpSession session = request.getSession();
	session.setAttribute("autoLoginUser",user);
	response.sendRedirect(request.getContextpath()+"/index.jsp");//跳转到首页
}else{
//没有登录过
chain.doFilter(req,resp);
}

六、AutoFilter页面完整代码


import com.itqf.entity.User;
import com.itqf.service.UserService;
import com.itqf.service.impl.UserServiceImpl;
import com.itqf.utils.Constants;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

@WebFilter("/Login.jsp")
public class AutoFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            String content = null;
            for (Cookie cookie : cookies) {
                //如果获取到cookie的名字对于Constants.AUTO_NAME
                if (cookie.getName().equals(Constants.AUTO_NAME)) {
                    //就获取这个cookie的value值
                    content = cookie.getValue();
                }
            }
            if (content != null) {
                String[] split = content.split(Constants.FLAG);
                String username = split[0];
                String password = split[1];

                UserService userService = new UserServiceImpl();
                User user=userService.login(username, password);
                if (user != null) {
                    HttpSession session = request.getSession();
                    session.setAttribute("loginUser",user);
                    HttpServletResponse response = (HttpServletResponse)resp;
                    response.sendRedirect(request.getContextPath()+"/index.jsp");
                }else{
                    chain.doFilter(req, resp);
                }
            }
        } else {
            chain.doFilter(req, resp);
        }
    }

    public void init(FilterConfig config) throws ServletException {

    }

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

素心如月桠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值