文章目录
在SpringBoot中使用验证登录
Cookie 和 Session
实际上,验证用户名与密码都需要查数据库。
在“登录”这个位置,通常还会使用到会话控制(免登陆),再延伸一下还涉及到用户权限等。
先了解最基本的Cookie和Session
- Cookie存在客户端,有时效性,被包含在Http请求中,不安全可被模拟。
- Session存在服务端,有时效性,不会被窃取,查Session比反复查库快。
Cookie
Cookie存在客户端内,对于服务器而言能减小压力,但其内容十分容易窃取、伪造,单纯的靠Cookie来验证用户登录状态或者权限是极不安全的。
不过还是先写一个demo(不包括前端),学习嘛。
经过实验,终于弄清楚了在接口上正确获取 HttpServletRequest
方式。
先上总结:
使用来自javax.servlet
下,这点导入时看清楚。
接口上,GET
和POST
方式接收都可以,不过要相应地改变发送方式。
(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对服务器上的所有目录可见/目录.