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);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。