测试环境搭建

使用Springboot构建web server, 在测试方法中打印接收的cookie。

  1. @RestController
  2. @RequestMapping("/register/test/service")
  3. public class TestService {
  4. private Log logger = LogFactory.getLog(TestService.class);
  5. // 使用HttpServletRequest 获取cookie
  6. @RequestMapping(value = "/ping", method = RequestMethod.GET)
  7. public Response ping(HttpServletRequest httpRequest, HttpServletResponse httpServletResponse) throws IOException {
  8. Cookie[] cookies = httpRequest.getCookies();
  9. logger.info("cookies info"+JsonUtils.toJson(cookies));
  10. //Mice
  11. return new Response().setData("OK!!!");
  12. }
  13. }

Postman开起Interceptor,在如下图所示

输URL: http://localhost:8080/register/test/service/ping

Header:Cookie:test=hello(name= test, value=hello的cookie)

测试结果

返回cookie, Cookie在使用期限内,一值存在,在服务器端可以修改cookie的生命周期

Cookie的几点常识

//文本数据明文,登陆分配,用于后台校验识别不同的用户

简单地说,cookie就是浏览器储存在用户电脑上的一小段文本文件。cookie 是纯文本格式,不包含任何可执行的代码。一个web页面或服务器告知浏览器按照一定规范来储存这些信息,并在随后的请求中将这些信息发送至服务器,Web服务器就可以使用这些信息来识别不同的用户。大多数需要登录的网站在用户验证成功之后都会设置一个cookie,只要这个 cookie 存在并可以,用户就可以自由浏览这个网站的任意页面。再次说明,cookie 只包含数据,就其本身而言并不有害。

//区分访问web服务器的来源,维护状态

为什么需要Cookie?

因为HTTP协议是无状态的,对于一个浏览器发出的多次请求,WEB服务器无法区分是不是来源于同一个浏览器。所以,需要额外的数据用于维护会话。 Cookie 正是这样的一段随HTTP请求一起被传递的额外数据。

//存储大小受限

Cookie 的限制。 大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。 浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。

详细描述见下文

http://bubkoo.com/2014/04/21/http-cookies-explained/

Java Spring Read Cookie

使用CookieVlaue标签来获取指定name的Cookie

  1. // 使用HttpServletRequest 获取cookie
  2. @RequestMapping(value = "/ping", method = RequestMethod.GET)
  3. public Response ping(@CookieValue("test") String fooCookie) throws IOException {
  4. //Mice
  5. return new Response().setData("OK, cookieValue=!!!" + fooCookie);
  6. }

在上面的的代码中如果CooKie不存在,会抛出返回异常:

  1. {
  2. "timestamp": 1466584427218,
  3. "status": 400,
  4. "error": "Bad Request",
  5. "exception": "org.springframework.web.bind.ServletRequestBindingException",
  6. "message": "Missing cookie 'majun' for method parameter of type String",
  7. "path": "/register/test/service/ping"
  8. }

可以通过设置默认值来解决这个异常,如果业务上不呈现这个异常的话!!

使用HttpServletRequest可以获取Cookie列表

Java Spring Create Cookie

使用HttpServletResponse, Cookie类,

  1. // 使用HttpServletResponse增加cookie, cookie会返回给前端
  2. @RequestMapping(value = "/getCookie", method = RequestMethod.GET)
  3. public Response getCookie(HttpServletResponse httpServletResponse) throws IOException {
  4. Cookie cookie = new Cookie("majun", "xiaoya");
  5. cookie.setMaxAge(10); //设置cookie的过期时间是10s
  6. httpServletResponse.addCookie();
  7. return new Response().setData("allocate cookie success!!!");
  8. }

如果创建的Cookie (name相同)已经存在,那么新的Cookie会覆盖老的cookie。

可以在Postman看到Cookie的返回信息

拦截器和Cookie

**拦截器是什么? **

拦截器的作用在于对处理器进行预处理和后处理,类似于filter。拦截器的原理详见:

http://www.cnblogs.com/fangjian0423/p/springmvc-interceptor.html

拦截器的使用场景

1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。

2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;

3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);

4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。

5、OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。

…………本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现。

Springboot实现拦截器

定义拦截面类

  1. package com.im.server.Interceptor;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.Cookie;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. /**
  8. * Created by majun on 16/6/22.
  9. */
  10. public class MyInterceptor implements HandlerInterceptor {
  11. @Override
  12. public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
  13. System.out.println(">>>MyInterceptor>>>>>>>在请求处理之前进行调用(Controller方法调用之前)");
  14. Cookie[] cookies = httpServletRequest.getCookies();
  15. if (cookies == null || cookies.length == 0) {
  16. throw new Exception("illegal Login");
  17. }
  18. try {
  19. for (Cookie cookie : cookies) {
  20. if (cookie.getName().equals("USER_TOKEN")) {
  21. //User user =
  22. httpServletRequest.setAttribute("USER_TOKEN", "{name: GUHUA, age: 20}");
  23. return true;
  24. }
  25. }
  26. throw new Exception("illegal Login");
  27. } catch (Exception exp) {
  28. throw exp;
  29. }
  30. }
  31. @Override
  32. public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
  33. System.out.println(">>>MyInterceptor>>>>>>>请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)");
  34. }
  35. @Override
  36. public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
  37. System.out.println(">>>MyInterceptor>>>>>>>在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)");
  38. }
  39. }

配置拦截器:继承WebMvcConfigurerAdapter类即可

  1. package com.im.server.conf;
  2. import com.im.server.Interceptor.MyInterceptor;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
  6. @Configuration
  7. public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
  8. @Override
  9. public void addInterceptors(InterceptorRegistry registry) {
  10. registry.addInterceptor(new MyInterceptor()).addPathPatterns("/register/test/service/**");
  11. super.addInterceptors(registry);
  12. }
  13. }

控制器中获取USER_TOKEN对应的用户内容

  1. // 使用HttpServletResponse增加cookie, cookie会返回给前端
  2. @RequestMapping(value = "/getUserInfo", method = RequestMethod.GET)
  3. public Response getUser(HttpServletRequest httpServletRequest) throws IOException {
  4. Object user_token = httpServletRequest.getAttribute("USER_TOKEN");
  5. return new Response().setData(user_token);
  6. }

测试结果

下面的链接详细讲了Spring mvc拦截器的实现原理:

http://www.cnblogs.com/fangjian0423/p/springmvc-interceptor.html

Spring cookie 实战的更多相关文章

  1. Spring cookie 实战(山东数漫江湖)

    Cookie是什么 简单来说,cookie就是浏览器储存在用户电脑上的一小段文本文件.cookie 是纯文本格式,不包含任何可执行的代码.一个web页面或服务器告知浏览器按照一定规范来储存这些信息,并 ...

  2. Spring Security 实战干货:使用 JWT 认证访问接口

    (转载)原文链接:https://my.oschina.net/10000000000/blog/3127268 1. 前言 欢迎阅读Spring Security 实战干货系列.之前我讲解了如何编写 ...

  3. Spring Security 实战干货:实现自定义退出登录

    文章目录 1. 前言 2. 我们使用 Spring Security 登录后都做了什么 2. 退出登录需要我们做什么 3. Spring Security 中的退出登录 3.1 LogoutFilte ...

  4. [Spring Cloud实战 | 第六篇:Spring Cloud Gateway+Spring Security OAuth2+JWT实现微服务统一认证授权

    一. 前言 本篇实战案例基于 youlai-mall 项目.项目使用的是当前主流和最新版本的技术和解决方案,自己不会太多华丽的言辞去描述,只希望能勾起大家对编程的一点喜欢.所以有兴趣的朋友可以进入 g ...

  5. Spring Cloud实战 | 最终篇:Spring Cloud Gateway+Spring Security OAuth2集成统一认证授权平台下实现注销使JWT失效方案

    一. 前言 在上一篇文章介绍 youlai-mall 项目中,通过整合Spring Cloud Gateway.Spring Security OAuth2.JWT等技术实现了微服务下统一认证授权平台 ...

  6. 5w 字 | 172 图 | 超级赛亚级 Spring Cloud 实战

    一.PassJava 项目简介 PassJava-Learning 项目是 PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. PassJava 是一款 Java 面试刷题 的 ...

  7. Spring AOP 实战运用

    Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...

  8. spring boot实战(第十三篇)自动配置原理分析

    前言 spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷,本篇讲利用RabbitMQ的自动配置为例讲分析下Spring Boot中的自动配置原理. 在上一篇末尾讲述了Spring ...

  9. spring boot实战(第十二篇)整合RabbitMQ

    前言 最近几篇文章将围绕消息中间件RabbitMQ展开,对于RabbitMQ基本概念这里不阐述,主要讲解RabbitMQ的基本用法.Java客户端API介绍.spring Boot与RabbitMQ整 ...

随机推荐

  1. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

  2. 基于OpenCV的车辆检测与追踪的实现

    最近老师布置了一个作业,是做一个基于视频的车辆检测与追踪,用了大概两周的时间做了一个简单的,效果不是很理想,但抑制不住想把自己的一些认识写下来,这里就把一些网络上的博客整理一下分享给大家,希望帮助到大 ...

  3. 逆天Kali带你游遍大江南北~安全之前人铺路!

    0.Linux基础学习(基本指令) http://www.cnblogs.com/dunitian/p/4822807.html 1.Kali安装到移动硬盘或者U盘中~Linux系列通用方法(包括An ...

  4. Vue + Webpack + Vue-loader 系列教程(1)功能介绍篇

    原文地址:https://lvyongbo.gitbooks.io/vue-loader/content/ Vue-loader 是什么? vue-loader 是一个加载器,能把如下格式的 Vue ...

  5. 从netty-example分析Netty组件

    分析netty从源码开始 准备工作: 1.下载源代码:https://github.com/netty/netty.git 我下载的版本为4.1 2. eclipse导入maven工程. netty提 ...

  6. so 问题来了,你现在值多少钱?

    年底了一大帮人都写着年底总结,总结一年做过的事.错过的事和做错的事.增长了多少本事,找没找到女朋友……来年做好升职加薪,要么做跳槽的准备,程序猿又开始浮躁了……. so 问题来了,你现在值多少钱? 这 ...

  7. 分享两种实现Winform程序的多语言支持的解决方案

    因公司业务需要,需要将原有的ERP系统加上支持繁体语言,但不能改变原有的编码方式,即:普通程序员感受不到编码有什么不同.经过我与几个同事的多番沟通,确定了以下两种方案: 方案一:在窗体基类中每次加载并 ...

  8. SAP CRM 性能小技巧

    导言 本页面打算收集SAP CRM实施中可以用于避免性能问题的注意事项,重要的事项会由图标标识. 如果你有其他的技巧想要说出来,别犹豫! 性能注意事项 通用 缓存读取类访问,特别是在性能关键的地方,比 ...

  9. git图像化界面GUI的使用

    GIT学习笔记 一.        基础内容 1.git是一个版本控制软件,与svn类似,特点是分布式管理,不需要中间总的服务器,可以增加很多分支. 2.windows下的git叫msysgit,下载 ...

  10. 第11章 Linux服务管理

    1. 服务分类 (1)Linux的服务 ①Linux中绝大多数的服务都是独立的,直接运行于内存中.当用户访问时,该服务直接响应用户,其好处是服务访问响应速度快.但不利之处是系统中服务越多,消耗的资源越 ...