Cookie意为“甜饼”,是由W3C组织提出,最先由Netscape社区发展的一种机制。html
Cookie其实是一小段的文本信息。客户端请求服务器,若是服务器须要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还能够根据须要修改Cookie的内容。java
单点登陆中可利用cookie设置完成。跨域
可在浏览器中查看cookie,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"; } }
@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; }
cookie不能主动删除,如需删除cookie,可从新设置cookie,将有效时间改成0便可。cookie
Cookie cookie = new Cookie("username", username); cookie.setMaxAge(0);//让cookie失效 //把cookie返回给浏览器 response.addCookie(cookie);
Session是另外一种记录客户状态的机制,不一样的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。session
Session对应的类为javax.servlet.http.HttpSession类。并发
建立对象:app
HttpSession session = request.getSession();
调用方法:
String getAttribute(String attribute)读客户状态信息 void setAttribute(String attribute, Object value)方法写客户状态信息 void setMaxInactiveInterval(int second) 设置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 + "添加到购物车"; } }
@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)做用范围:在一次会话范围内(获取到的都是同一个session对象)
(3)主要功能:在整个会话范围内实现数据的共享
Cookie和session都属于会话技术,均可以保存会话中产生的数据,但因为cookie 和session的工做原理和特色不一样,所以二者的应用场景也不同。
Cookie的特色:
Session的特色:
功能分核心业务功能和扩展功能。
核心业务功能如登陆,添加购物车,查询订单。
扩展功能如计算时间,身份验证,日志,扩展功能放在Interceptor中,访问controller时自动执行。不修改controller代码就实现了扩展功能。这种方式也叫无侵入性编码,动态代理。
自定义拦截器实现了HandlerInterceptor接口,并实现了接口中的三个方法:
建立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); } }