跨域资源共享Cors
Cors介绍 : http://www.ruanyifeng.com/blog/2016/04/cors.html
问题 : 前后端分离会话如何保持?
- 无非就是登录后,server返还一个token,服务器端token存放在redis中获取其他中间件中,然后前端存到cookie中,或者每次请求携带token,获取放在请求头中.
- 还可以更加简便些用Cors,登录后,登录信息存放到session,服务器端session用spring-session管理,或者直接用tomcat的session;然后前端每次ajax请求设置withCredentials属性,设置为 true ,具体如下
Spring 对Cors的支持 : https://spring.io/blog/2015/06/08/cors-support-in-spring-framework
后端
Spring MVC
这里使用的是Spring,Spring 需要4.2以上版本
| 12
 3
 4
 5
 6
 7
 8
 
 | <mvc:cors><mvc:mapping
 path="/**"
 allowed-origins="http://127.0.0.1"
 allowed-methods="GET,PUT,DELETE,POST"
 allow-credentials="true" exposed-headers="Set-Cookie"
 />
 </mvc:cors>
 
 | 
如果是基于Java注解配置
| 12
 3
 4
 5
 6
 7
 
 |  public void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")
 .allowedOrigins( "*" )
 .allowedMethods("GET,PUT,DELETE,POST")
 .exposedHeaders("Set-Cookie")
 .allowCredentials(true);
 }
 
 | 
Spring MVC + Spring Security
Spring Security的配置还不一样,Spring Security因为需要配置DelegatingFilterProxy过滤器则会先进入过滤器
Spring Security : http://www.jianshu.com/p/27060722843b
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 
 | <bean id="corsSource" class="org.springframework.web.cors.UrlBasedCorsConfigurationSource"><!--<property name="pathMatcher" ref="pathMatcher" />-->
 <property name="corsConfigurations">
 <map>
 <description>设置cors</description>
 <entry key="/**" value-ref="configuration"/>
 </map>
 </property>
 </bean>
 <bean id="configuration" class="org.springframework.web.cors.CorsConfiguration">
 <property name="allowedOrigins">
 <list>
 <value>http://127.0.0.1</value>
 </list>
 </property>
 <property name="allowedMethods">
 <list>
 <value>GET</value>
 <value>POST</value>
 <value>PUT</value>
 <value>DELETE</value>
 </list>
 </property>
 <property name="allowedHeaders">
 <list>
 <value>*</value>
 </list>
 </property>
 <property name="exposedHeaders">
 <list>
 <value>Set-Cookie</value>
 </list>
 </property>
 <property name="allowCredentials">
 <value>true</value>
 </property>
 </bean>
 
 | 
| 12
 3
 4
 5
 
 | allowed-origins   : 接受哪个域名的请求,* 表示接受任意域名的请求
 allowed-methods   : 接受哪些方法
 allow-credentials : 表示是否允许发送Cookie,默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。
 exposed-headers   : 响应头中允许访问的header,默认为空,这里设置了 'Set-Cookie' ,这里与配合前端,即可实现保持会话
 
 | 
前端
AJAX请求中设置withCredentials属性,设置为 true
| 12
 
 | var xhr = new XMLHttpRequest();xhr.withCredentials = true;
 
 | 
angular vue 这类框架,都有拦截器,在拦截器中统一处理就行了.
这样前端每次请求,后端都知道是谁了,其实也就是利用cookie,前后协作完成