目录
1.使用拦截器解决跨域的示例:
2.使用redis,不使用session
前后端不分离项目我们可以通过session存储数据,但是前后端分离时不存在会话,每次请求sessionid都会改变,当值我们储存的数据不能取出来。
前端代码:
fetch('http://localhost:8080/api/user', {
method: 'GET',
headers: {
'Content-Type': 'application/json;charset=UTF-8'
}
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error))
在上面的代码中,我们使用fetch函数向后端发送了一个GET请求,并设置了请求头中的Content-Type为application/json;charset=UTF-8。
后端代码:
首先,我们需要定义一个拦截器,在请求处理之前进行跨域处理:
public class CorsInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
return true;
}
}
在上面的拦截器中,我们设置了
Access-Control-Allow-Origin、
Access-Control-Allow-Methods、
Access-Control-Max-Age、
Access-Control-Allow-Headers、
Access-Control-Allow-Credentials等跨域请求头。
然后,在我们的配置类中注册拦截器:
@Configuration
public class CorsConfiguration implements WebMvcConfigurer {
@Bean
public CorsInterceptor corsInterceptor() {
return new CorsInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(corsInterceptor());
}
}
在上面的配置类中,我们创建了一个CorsInterceptor对象,并将其注册到InterceptorRegistry中,从而实现了使用拦截器解决跨域问题。
通过拦截器,我们可以在请求处理之前进行跨域处理,从而避免前后端分离中sessionid不同的问题。
把要存储到session的数据通过redis储存,思路一致
优点:
而Redis可以代替session是因为它具有快速、可靠的内存数据库特性,并且支持分布式存储,能够处理高并发的请求。在使用Redis代替session时,我们可以将session存储在Redis中,可以通过Redis提供的get和set方法来获取和设置session,从而实现前后端分离的状态管理。
使用Redis代替session的优点包括:
可以避免session共享带来的问题,如session劫持等安全问题。
可以提高系统的性能和可扩展性,因为Redis可以处理大量的请求,并且支持分布式存储。
可以提高系统的可靠性,因为Redis具有高可靠性和容错性,即使某个节点出现故障,也不会对整个系统造成影响。
总之,通过使用Redis代替session,可以在前后端分离的开发模式下,实现更加高效、可靠和安全的状态管理。