1 Cookie
Cookie 意为“甜饼”,是 由 W3C 组织提出,最早由 Netscape 社区倒退的一种机制。
Cookie 实际上是一小段的文本信息。客户端申请服务器,如果服务器须要记录该用户状态,就应用 response 向客户端浏览器颁发一个 Cookie。客户端浏览器会把 Cookie 保存起来。当浏览器再申请该网站时,浏览器把申请的网址连同该 Cookie 一起提交给服务器。服务器查看该 Cookie,以此来识别用户状态。服务器还能够依据须要批改 Cookie 的内容。
单点登录中可利用 cookie 设置实现。
可在浏览器中查看 cookie,cookie 不能跨域。一对一的关系。
1.1 设置 Cookie
Cookie 常识介绍:
1.cookie.setPath("/") 代表根目录无效
url1:www.jt.com/addUser
url2:www.jt.com/user/addUser
2.cookie.setDomain("域名地址") cookie 在哪些域名中共享
例子 1:cookie.setDomain("www.jt.com");// 只有在 www.jt.com 中共享
cookie.setDomain("jt.com");// 在 jt.com 中共享
3.cookie.setMaxAge(30*24*60*60);// 让 cookie30 天无效。4.Cookie cookie = new Cookie("JT_TICKET",uuid);
设置 cookie 的 name 和值
例如:
@RestController
public class UserController {@RequestMapping("/login")
public String login(String username, HttpServletResponse response) {
// 创立 cookie
Cookie cookie = new Cookie("username", username);
// 把 cookie 返回给浏览器
response.addCookie(cookie);
return "设置 cookie";
}
}
1.2 读取 Cookie
@RestController
public class OrderController {@RequestMapping("/getOrder")
public String getOrder(HttpServletRequest request) {
// 读取所有 cookie
Cookie[] cookies = request.getCookies();
String string = "";
if (cookies != null) {
// 遍历 cookie
for (Cookie cookie : cookies) {
// 取 cookie 名
String cookieName = cookie.getName();
// 取 cookie 值
String cookieValue = cookie.getValue();
string = string + cookieName + cookieValue;
}
}
return string;
}
1.3“删除”Cookie
cookie 不能被动删除,如需删除 cookie,可从新设置 cookie,将无效工夫改为 0 即可。
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(0);// 让 cookie 生效
// 把 cookie 返回给浏览器
response.addCookie(cookie);
2 Session
Session 是另一种记录客户状态的机制,不同的是 Cookie 保留在客户端浏览器中,而 Session 保留在服务器上。客户端浏览器拜访服务器的时候,服务器把客户端信息以某种模式记录在服务器上。这就是 Session。
Session 对应的类为 javax.servlet.http.HttpSession 类。
- Session 是将会话中产生的数据保留在服务器端,是服务器端技术
- Session 是一个域对象,session 中也保留了一个 map 汇合,往 session 中存数 据,其实就是将数据保留到 session 的 map 汇合中。
- 通过 session.setAttribute()办法能够将数据保留到 session 中,通过 session.getAttribute()办法能够将数据从 session 中取出来。
创建对象:
HttpSession session = request.getSession();
调用办法:
String getAttribute(String attribute)读客户状态信息
void setAttribute(String attribute, Object value)办法写客户状态信息
void setMaxInactiveInterval(int second) 设置 Session 的超时工夫。单位为秒
2.1 设置 Session
@RestController
public class CartController {@RequestMapping("/insert")
public String insert(String itemName, HttpSession session) {
//session 外部是有 hashmap, 用来存放数据
// 找到购物车
ArrayList<String> cart = (ArrayList<String>) session.getAttribute("cart");
// 判断购物车是否为空
if (cart == null) {
// 创立购物车
cart = new ArrayList();
// 保留购物车
session.setAttribute("cart", cart);
}
// 向购物车添置商品
cart.add(itemName);
return itemName + "增加到购物车";
}
}
2.2 获取 Session
@RequestMapping("/list")
public String list(HttpServletRequest request, HttpSession session) {
String string = "";
// 找到购物车
ArrayList<String> cart = (ArrayList<String>) session.getAttribute("cart");
// 判断购物车是否为空
if (cart != null) {
// 遍历商品
for (String itemName : cart) {string = string + "itemName:" + itemName;}
}
return string;
}
2.3 销毁 session
- 超时销毁:默认状况下,当超过 30 分钟没有拜访 session,session 就会超时 销毁。(30 分钟是默认工夫,能够批改,但不举荐批改)
- 他杀:调用 session 的 invalidate 办法时,会立刻销毁 session。
- 意外身亡:当服务器非正常敞开时(硬件损坏,断电,内存溢出等导致服 务器非正常敞开),session 会随着服务器的敞开而销毁;当服务器失常敞开,在敞开之前,服务器会将外部的 session 对象序列化保 存到服务器的 work 目录下,变为一个文件。这个过程叫做 session 的钝化(序列化);再次将服务器启动起来,钝化着的 session 会再次回到服务 器,变为服务器中的对象,这个过程叫做 session 的活化(反序列化)。
(2)作用范畴:在一次会话范畴内(获取到的都是同一个 session 对象)
(3)次要性能:在整个会话范畴内实现数据的共享
cookie 和 session 的区别
Cookie 和 session 都属于会话技术,都能够保留会话中产生的数据,但因为 cookie 和 session 的工作原理和特点不同,因而两者的利用场景也不一样。
Cookie 的特点:
- cookie 是将会话中产生的数据保留在浏览器客户端, 是客户端技术(JS 能够 拜访 cookie)
- cookie 是将数据保留在客户端浏览器,容易随着用户的操作导致 cookie 失落或者被窃取,因而 cookie 中保留的数据不太稳固,也不太平安。
- 但 cookie 将数据保留在客户端,对服务器端没有太多影响,能够将数据保留很长时间。
- 总结:因而 cookie 中适宜存储须要长时间保留、但对安全性要求不高的数 据
- 浏览器对 cookie 的大小和个数都有限度,个别举荐每一个站点给浏览器发送的 cookie 数量不超过 20 个,每一个 cookie 的大小不超过 1kb。
- Cookie 的利用:实现购物车、记住用户名、30 天内主动登录等。
Session 的特点:
- session 是将会话中产生的数据保留在服务器端,是服务器端技术
- session 将数据存在服务器端的 session 对象中,绝对更加的平安,而且更加稳固。不容易随着用户的操作而导致 session 中的数据失落或者是被窃取。
- 但 session 是服务器端的对象,在并发量较高时每一个浏览器客户端在服务器端都要对应一个 session 对象,占用服务器的内存空间,影响效率。
- 总结:因而 session 中适宜存储对安全性要求较高,但不须要长时间保留的数据。
- Session 的利用:保留登录状态、保留验证码。
拦截器 Interceptor
性能分外围业务性能和扩大性能。
外围业务性能如登录,增加购物车,查问订单。
扩大性能如计算工夫,身份验证,日志,扩大性能放在 Interceptor 中,拜访 controller 时主动执行。不批改 controller 代码就实现了扩大性能。这种形式也叫无侵入性编码,动静代理。
自定义拦截器实现了 HandlerInterceptor 接口,并实现了接口中的三个办法:
- preHandle() 办法:该办法会在控制器办法前执行,其返回值示意是否中断后续操作。当其返回值为 true 时,示意持续向下执行;当其返回值为 false 时,会中断后续的所有操作(包含调用下一个拦截器和控制器类中的办法执行等)。
- postHandle()办法:该办法会在控制器办法调用之后,且解析视图之前执行。能够通过此办法对申请域中的模型和视图做出进一步的批改。
- afterCompletion()办法:该办法会在整个申请实现,即视图渲染完结之后执行。能够通过此办法实现一些资源清理、记录日志信息等工作。
实现身份验证性能
创立 AuthInterceptor 拦截器:
public class AuthInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {String url=request.getRequestURI();
System.out.println(url+"AuthInterceptor.preHandle()");
// 判断用户有没有登录
HttpSession session=request.getSession();
String username=(String) session.getAttribute("username");
if (StringUtils.isEmpty(username)) {response.sendRedirect("/login.html");
return false;// false 不执行 controller,postHandle()}
return true;// false 不执行 controller,postHandle()}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {System.out.println("AuthInterceptor.postHandle()");
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
}
在配置文件 config 中增加 authInterceptor:
将 config 对象交给 bean 容器进行治理。
@Component// 这是个组件,框架会主动创建对象
public class WebConfig implements WebMvcConfigurer{
@Override
public void addInterceptors(InterceptorRegistry registry) {AuthInterceptor authInterceptor=new AuthInterceptor();
registry.addInterceptor(authInterceptor).addPathPatterns("/getOrder","/list");
WebMvcConfigurer.super.addInterceptors(registry);
}
}