猿问

带有代理的reactjs无法从Spring Boot后端获取匿名会话

我正在尝试使用create-react-app启动我的spring-boot项目的前端。


我使用redis来存储会话。


由于某些原因,我实际上需要为匿名用户启用会话生成。


以下代码是我用于春季启动的安全性配置:


@Configuration

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Override

    protected void configure(HttpSecurity http) throws Exception {

        //@formatter:off

        http

            .formLogin()

                .loginPage("/login")

                    .permitAll()

                .loginProcessingUrl("/form-login")

                .and()

            .cors()

                .and()

            .csrf()

                .disable()

            .authorizeRequests()

                .antMatchers("/restricted/**")

                    .authenticated()

                .antMatchers("/**")

                    .permitAll()

                .and()

           .sessionManagement()

                .sessionCreationPolicy(SessionCreationPolicy.ALWAYS);

        //@formatter:on

    }

}

我已经通过在spring-boot项目下的“ static”文件夹中有一个非常简单的index.html进行了测试。然后我转到“ http:// localhost:8080 ”,然后看到了会话cookie。


然后,我删除了“ index.html”文件,并使用代理配置启动react应用。默认情况下,新的URL为“ http:// localhost:3000 ”。我确实看到了默认的reactjs启动页面,但是我再也没有得到任何会话cookie。


我的create-react-app在“ package.json”中的代理设置如下:


"proxy": "http://localhost:8080"

我还测试了仅当我直接转到“ http:// localhost:8080 ”而不是端口3000时,仍然可以获取会话cookie 。


任何帮助表示赞赏。提前非常感谢。


慕姐8265434
浏览 140回答 1
1回答

Cats萌萌

好的,在等待了几天没有任何答案之后,我自己进行了一些研究并找到了答案。我决定在这里发布答案,以防其他人遇到同样的问题。create-react-app代理的问题在于它是一个转发代理。因此,会话cookie不能与正向代理一起很好地工作。遗憾的是,没有解决此问题的简便方法,但是有一种解决方法。如上所述,我可以肯定地通过直接访问后端URL来获取会话cookie。因此,如果我想使用代理获取会话cookie,则应在前端放置一些代码以首先访问后端,然后在应用程序启动时将会话cookie放置在标头中。然后继续监视前端,并在会话到期时重新获取该会话。为了最佳实践,后端应该真正具有一个模拟服务,该模拟服务不具有会话,登录名和令牌,但具有模拟数据。由于前端并不真正在乎会话,访问令牌或登录的工作方式,因此这些都是后端工作。前端只需要获取数据,然后显示数据。但是实际上拥有一台模拟服务器可能会花费一些时间,因此在每种情况下都不值得这样做。因此,如果您不想编写模拟服务器,则可以使用代理服务器,但前端要有一些技巧以实际获取会话。或者,您构建整个前端应用程序并将其放在spring boot应用程序中的“ static”文件夹下。对我来说,我宁愿将前端和后端分开,也不愿将它们放在一起。
随时随地看视频慕课网APP

相关分类

Java
我要回答