Spring Boot是一个简化Spring开发的框架。用来监护spring应用开发,约定大于配置,去繁就简,just run 就能创建一个独立的,产品级的应用。
我们在使用Spring Boot时只需要配置相应的Spring Boot就可以用所有的Spring组件,简单的说,spring boot就是整合了很多优秀的框架,不用我们自己手动的去写一堆xml配置然后进行配置。从本质上来说,Spring Boot就是Spring,它做了那些没有它你也会去做的Spring Bean配置。
使用Cookie原因
首先本来是准备用Session,但是Session在会话断开后就消失了,考虑到老师们可能会中途因为一个紧急消息就先跳转出去种植会话,所以我选择使用Cookie
创建
首先创建一个cookie类 CookieUtil
1 | public static void setCookie(HttpServletResponse response, String key, String value, int expiry){ |
2 | Cookie cookie = new Cookie(key, value); //key 为cookie内容名字,value为cookie 类型 |
3 | cookie.setMaxAge(expiry); //cookie过期时间 |
4 | cookie.setSecure(true); |
5 | cookie.setHttpOnly(true); |
6 | response.addCookie(cookie); |
7 | } |
什么是HttpOnly?
HttpOnly是Set-Cookie HTTP响应头中包含的附加标志。生成cookie时使用HttpOnly标志有助于降低客户端脚本访问受保护cookie的风险(如果浏览器支持它)。
如果HTTP响应头中包含HttpOnly标志,只要浏览器支持HttpOnly标志,客户端脚本就无法访问cookie。因此,即使存在跨站点脚本(XSS)缺陷,且用户意外访问利用此漏洞的链接,浏览器也不会向第三方透露cookie。
如果浏览器不支持HttpOnly并且网站尝试设置HttpOnly cookie,浏览器会忽略HttpOnly标志,从而创建一个传统的,脚本可访问的cookie。
大多数XSS攻击的目的都是盗窃cookie。服务端可以通过在它创建的cookie上设置HttpOnly标志来缓解这个问题,指出不应在客户端上访问cookie。
客户端脚本代码尝试读取包含HttpOnly标志的cookie,如果浏览器支持HttpOnly,则返回一个空字符串作为结果。这样能够阻止恶意代码(通常是XSS攻击)将cookie数据发到攻击者网站。
综上所述:
设置HttpOnly可以防止一些最基础的xss,但是不能防止页面跳转后获取cookie
没有绝对的安全
什么是Secure?
当设置Cookie中Secure为true,则指示浏览器仅通过 HTTPS 连接传回 cookie。这可以确保 cookie ID 是安全的,且仅用于使用 HTTPS 的网站。如果启用此功能,则 HTTP 上的会话 Cookie 将不再起作用。
控制器中进行配置
返回Set-Cookie
1 | public String index(HttpServletRequest request, HttpServletResponse response, String username, String password){ //传入后端 |
2 | User user = userMapper.selectByPrimaryKey(username); |
3 | if(user.getPassword().equals(password)){ |
4 | System.out.println(user); |
5 | CookieUtil cookie = new CookieUtil(); |
6 | int expire = 60 * 60 * 24 * 7; //cookie时间为90天 |
7 | cookie.setCookie(response,"logUsername",user.getUsername(),expire); //给他们cookie |
8 | cookie.setCookie(response,"logPassword",user.getPassword(),expire); |
9 | return JSON.toJSONString(user); //返回教师名字以及权力的json |
10 | } |
11 | else{ |
12 | return "fail"; |
13 | } |
14 | } |
PS:request为请求头,response为响应头
这段代码为,当登陆传入账号和密码,以及响应头后,确认账号密码存在,服务器返回响应报文给客户端,响应的Response Header中的Set-Cookie就是告诉客户端为当前页面设置Cookie,当客户端接收到Set-Cookie后下次请求会自动带上Cookie
我这边Cookie时间设置成3个月,因为项目中对快捷登陆要求较高,能方便点就方便点。
利用Cookie
1 | public String logFilling(HttpServletRequest request, HttpServletResponse response){ |
2 | Map<String, String> map = CookieUtil.getCookies(request); |
3 | String username = map.get("logUsername"); |
4 | List<useClass> useClassList = useClassMapper.selectUseClass(username); |
5 | System.out.println(useClassList.size()); |
6 | return JSON.toJSONString(useClassList); |
7 | } |
大致为当页面访问logFilling页面时,我获取他request请求头带来的Cookie的信息,来进行信息的预查询
简单访问:
发现可以访问成功,并且Cookies还多出了两项。
因为某种原因我还为设置Httponly,以及Secure。
附Cookie类代码(全)
1 | package com.example.logSystem.pojo; |
2 | |
3 | import javax.servlet.http.Cookie; |
4 | import javax.servlet.http.HttpServletRequest; |
5 | import javax.servlet.http.HttpServletResponse; |
6 | import java.util.HashMap; |
7 | import java.util.Iterator; |
8 | import java.util.Map; |
9 | |
10 | public class CookieUtil { |
11 | //设置Cookie |
12 | public static void setCookie(HttpServletResponse response, String key, String value, int expiry){ |
13 | Cookie cookie = new Cookie(key, value); //key 为cookie内容名字,value为cookie 类型 |
14 | cookie.setMaxAge(expiry); //cookie过期时间 |
15 | // cookie.setSecure(true); //安全的cookie是仅可以通过加密的HTTPS连接发送到服务器的cookie。无法通过未加密的HTTP连接将cookie发送到服务器。也就是说,如果设置了setSecure(true),该Cookie将无法在Http连接中传输,只能是Https连接中传输。 |
16 | // cookie.setHttpOnly(true); //不能被js访问的Cookie |
17 | response.addCookie(cookie); |
18 | } |
19 | |
20 | //获取所有Cookie |
21 | public static Map<String, String> getCookies(HttpServletRequest request){ |
22 | Map<String, String> map = new HashMap<>(); |
23 | Cookie cookies[] = request.getCookies(); |
24 | if (cookies != null){ |
25 | for(int i = 0; i < cookies.length; i++){ |
26 | if(!"JSESSION".equals(cookies[i].getName())) |
27 | map.put(cookies[i].getName(), cookies[i].getValue()); |
28 | } |
29 | } |
30 | return map; |
31 | } |
32 | |
33 | //清空所有的Cookie 点击退出按钮后 |
34 | public static void clear(HttpServletRequest request, HttpServletResponse response){ |
35 | Map<String, String> map = getCookies(request); |
36 | Iterator<Map.Entry<String, String>> iter = map.entrySet().iterator(); |
37 | while(iter.hasNext()){ |
38 | Map.Entry<String, String> me = iter.next(); |
39 | Cookie cookie = new Cookie(me.getKey(), ""); |
40 | cookie.setMaxAge(0); |
41 | response.addCookie(cookie); |
42 | } |
43 | } |
44 | } |