【框架学习(6.1)-- SpringBoot登录验证之认识Cookie】

在SpringBoot中使用验证登录

Cookie 和 Session

实际上,验证用户名与密码都需要查数据库。
在“登录”这个位置,通常还会使用到会话控制(免登陆),再延伸一下还涉及到用户权限等。

先了解最基本的Cookie和Session

  • Cookie存在客户端,有时效性,被包含在Http请求中,不安全可被模拟。
  • Session存在服务端,有时效性,不会被窃取,查Session比反复查库快。

Cookie

Cookie存在客户端内,对于服务器而言能减小压力,但其内容十分容易窃取、伪造,单纯的靠Cookie来验证用户登录状态或者权限是极不安全的。

不过还是先写一个demo(不包括前端),学习嘛。

经过实验,终于弄清楚了在接口上正确获取 HttpServletRequest方式。
先上总结:

使用来自javax.servlet下,这点导入时看清楚。
在这里插入图片描述

接口上,GETPOST方式接收都可以,不过要相应地改变发送方式。

(1)Get方式

@RequestMapping指定路径、指定Get方式这是基本的。

@RequestMapping(value = "/login",method = RequestMethod.GET)
public String cookieLogin(HttpServletRequest request, 
						HttpServletResponse response) {
...
}

在这里插入图片描述
Postman中发送数据:

必须在Params里填写数据,也就是在路径后拼接参数才行。
在这里插入图片描述

(2)Post方式
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String cookieLogin(HttpServletRequest request, 
						HttpServletResponse response) {
...
}

而post方式,必须要传参时是application/x-www-form-urlencoded类型。
在这里插入图片描述

在这里插入图片描述

(3)简单的免验证登录

HttpServletRequest 获取到后,判断有没有Cookie,没有就给它创建一个Cookie,在comment里可以设置一些内容,然后返回登录状态。

Cookie的话,存在登录标识isLogin就使其免验证登录(只是举例,并不能这么做)。

这个Comment内也可以填写session的id,比较sessionId保持会话内的免验证登录。可以填写用户的唯一id、生成的uuid等。

但终归是存放在客户端内,并不安全。容易被窃取、伪造。

实例代码:

@RequestMapping(value = "/login",method = RequestMethod.POST)
    public String cookieLogin(HttpServletRequest request, HttpServletResponse response) {//
        // 获取此次客户端请求中是否携带了Cookie
        Cookie[] cookies = request.getCookies();
        String info = null;
        request.getParameter("username");
        request.getParameterMap();
        if (cookies != null && cookies.length > 0) { //客户端携带了Cookie
            for (Cookie cookie : cookies) {
                if (cookie.getComment().equals("isLogin")) {
                    info = "免登陆!";
                }
            }
        }else{ //客户端没有携带Cookie,第一次请求生成一个Cookie返回
            Cookie cookie = new Cookie("username","root");
            cookie.setMaxAge(24*60*60);
            cookie.setComment("isLogin");
            response.addCookie(cookie);
            info = "登录成功!";
        }
        return info;
    }
(4)关于Cookie类

别看它的包路径是javax.servlet.http,但却不是JDK内含的,而是存在于Tomcat内。
在这里插入图片描述

下载Tomcat文档
在Tomcat官网选一个版本往下拉就能看到下载文档的选项:
在这里插入图片描述(迅雷下载能快一丁丁点)

解压打开后寻找Cookie:

index侧边栏往下翻就找到Servlet的Java文档说明:
在这里插入图片描述
可以直接搜索:

在这里插入图片描述

我直接把官方文档的解释粘贴出来:

name
  • name cookie名称

创建Cookie后就不能修改了,而且必须由Cookie名称校验器校验规范。

value
  • value cookie的值

实例化对象时,跟cookie名称一起创建,可以通过set方法修改。
值不应包含空白、括号、圆括号、等号、逗号、双引号、斜线、问号、at符号、冒号和分号。
根据浏览器不一样,可能支持程度不一样。

CookieNameValidator
  • CookieNameValidator;

Cookie名称校验器,作用是检验Cookie名称是否符合规范。

必须符合RFC 2109。
这意味着它只能包含ASCII字母数字字符
不能包含逗号、分号或空格,也不能以$字符开头。
cookie的名称在创建后不能更改。
该值可以是服务器选择发送的任何内容。它的值可能只对服务器有意义。cookie的值可以在创建后用setValue方法。

secure
  • secure 安全协议是否开启

flag
如果true,仅当使用安全协议时,才从浏览器向服务器发送cookie
如果false,通过任何协议都可以发送cookie

version
  • version 版本号默认0

设置此cookie符合的cookie协议的版本。
版本0符合最初的Netscape cookie规范,版本1符合RFC 2109。
因为RFC 2109还是有点新,所以认为版本1是实验性的;不要在生产现场使用它。

comment
  • comment 用途注释

指定描述cookie用途的注释。
如果浏览器向用户显示cookie,则注释是有用的。
Netscape版cookies不支持注释。

domain
  • domain 域名

指定应在其中显示此cookie的域。
RFC 2109规定了域名的形式。
域名以点开始(.foo.com)并意味着cookie指定域名系统(DNS)区域中的服务器可见
(例如,www.foo.com,但不是a.b.foo.com).
默认情况下,cookies只返回给发送它们的服务器。

httpOnly
  • httpOnly

cookie是否对客户端脚本隐藏。

maxAge
  • maxAge cookie的生命周期

以秒为单位设置cookie的最长期限。
正值表示cookie将在经过这么多秒后过期。
负值表示cookie不会永久存储,并将在Web浏览器退出时被删除。
零值将导致cookie被删除

path
  • path cookie路径

指定客户端应将cookie返回到的路径
cookie对指定的目录中的所有页面以及该目录的子目录中的所有页面都是可见的
cookie的路径必须包括设置cookie的servlet,例如,/目录,这使得cookie对服务器上的所有目录可见/目录.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

上岸撒尿的鱼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值