跨域资源共享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以上版本
1 2 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注解配置
1 2 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
1 2 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>
|
1 2 3 4 5
| allowed-origins : 接受哪个域名的请求,* 表示接受任意域名的请求 allowed-methods : 接受哪些方法 allow-credentials : 表示是否允许发送Cookie,默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。 exposed-headers : 响应头中允许访问的header,默认为空,这里设置了 'Set-Cookie' ,这里与配合前端,即可实现保持会话
|
前端
AJAX请求中设置withCredentials属性,设置为 true
1 2
| var xhr = new XMLHttpRequest(); xhr.withCredentials = true;
|
angular vue 这类框架,都有拦截器,在拦截器中统一处理就行了.
这样前端每次请求,后端都知道是谁了,其实也就是利用cookie,前后协作完成