一、Cookie
cookie和session的区别
cookie是一种浏览器保存数据的技术,有大小限制,通常最大限度是4KB,因此cookie不适合用来存储大量的数据。
常用方法:
cookie.setMaxAge(); - 设置cookie的过期时间,如果不设置的话,cookie默认过期时间是浏览器关闭的时候
cookie.setPath(); - 设置cookie的有效路径,简单来说,当浏览器发送给服务器的请求路径中携带改路径,cookie才能发送给服务器,否则服务器收不到该cookie。温馨提示,在设置cookie时,通常将这个属性设置为“/”
cookie.setDomain(); - 设置cookie有效的域名地址,如果访问的服务器地址,域名不同,则不会携带cookie到服务器。因此这个属性通常设置为二级域名共享的模式(比如 .jd.com)注意:cookie只能二级域名共享,一级域名不能共享cookie
cookie.setHttpOnly(); - 该属性用来设置cookie是否只能通过http请求获取。如果设置为true之后,服务器仍然可以获得cookie值,但是浏览器的js(document.cookie)就没办法再获得该cookie,增加cookie的安全性
cookie.setSecure(); - 该属性设置为true之后,只有https请求才会携带该cookie,极大的提高了cookie安全性。
xss - 跨域脚本攻击
crsf - 跨域方法攻击
问题:cookie没办法进行一级域名的跨域,一级域名如何进行单点登录?
二、请求跨域问题
什么是请求跨域?
如果控制台打印以上内容,就说明发生了请求跨域。请求跨域是浏览器的一种安全限制行为,当前页面只能发送请求给同源的服务器。如果发送请求给非同源服务器,那么就会发送所谓的跨域问题。
什么是同源?
同协议、同ip、同端口,就称之为同源
跨域的特点:
· 跨域是浏览器的行为,不是服务器的行为
· 浏览器规定了一些标签,不受跨域限制(<from>、<img>、<script>、<link>....)
· 浏览器跨域限制是为了安全起见
如何解决跨域问题?
· 所有页面只访问同源的服务器,然后由服务器内部调用其他服务器获得数据返回给页面
· jQuery - jsonp
jsonp的实现:
jsonp的特点:通过jsonp跨域访问,会携带浏览器的cookie
· SpringMVC的跨域解决方案
原理:SpringMVC的方法添加该注解后,会自动的在响应头上,添加一个属性
一旦浏览器,发现响应头中包含该属性,就不会限制该请求的跨域了
三、自定义注解
如何自定义一个注解:
public @interfae 注解名 {
//N个抽象方法
}
了解自定义注解的4个元注解(标记注解的注解):
@Documented:当前注解能够被JavaDoc标记
@Target:标记当前注解的作用范围
ElementType.ANNOTATION_TYPE - 表示当前注解可以标记在其他注解之上
ElementType.CONSTRUCTOR - 表示当前注解可以标记在构造方法之上
ElementType.FIELD - 表示当前注解可以标记在属性(成员变量)之上(常用)
ElementType.LOCAL_VARIABLE - 表示当前注解可以标记在局部变量之上
ElementType.METHOD - 表示当前注解可以标记在方法上(常用)
ElementType.PACKAGE - 标记在包上
ElementType.PARAMETER - 标记在方法的形参列表上(常用)
ElementType.TYPE - 标记在类、接口、内部类以及枚举类上(常用)
@Retention:标记当前注解的有效范围
RetentionPolicy.SOURCE - 当前范围表示注解只能作用在源码上,一旦编译成.class文件,注解会丢失
RetentionPolicy.CLASS - 当前范围表示注解只能在源码和字节码文件上,一旦运行就会丢失
RetentionPolicy.RUNTIME - 当前注解可以作用在源码、字节码以及运行时状态。简单来说,如果需要通过反射操作注解,则注解的有效范围必须是RUNTIME
自定义注解的方法声明:
语法:
返回值 方法名() [default 默认值];
注意:
1、注解中的方法不能有形参列表
2、如果注解中的方法没有设定默认值,则标记注解时,必须指定该方法的返回值
3、如果一个方法名是value,则标记方法时可以省略方法名
4、如果标记注解需要设置两个以上的方法返回值,则value不能省略
5、方法返回值可以是数组,如果只给数组一个值,那么可以省略大括号
四、AOP
什么是AOP?
面向切面编程
AOP的底层原理:动态代理
AOP的运用场景:
1、分布式环境下,判断当前业务是否已经登录
2、事务管理(Spring自带)
3、用户轨迹记录
SpringBoot如何使用AOP
1)添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2)准备一个切面类(方法增强)