Java Spring-Auth+;JWT登录响应200,但缺少正文和标题

Java Spring-Auth+;JWT登录响应200,但缺少正文和标题,java,spring,jwt,fetch,Java,Spring,Jwt,Fetch,我在SpringSecurity的日子有点不好过。基本上,我有/auth/signup和/auth/login分别用于创建帐户和获取jwt令牌 这两种方法都可以通过失眠/邮递员在本地完美工作,但当使用fetch()从React.js前端向/auth/login发出请求时,它要么返回CORS飞行前请求错误,要么给出“不透明”或“CORS”200 OK响应,而没有正文。后者没有用,因为我需要代币。令人讨厌的是它对失眠有效 下面是从javascript本地通过fetch()触发时的响应。没有主体也没有

我在SpringSecurity的日子有点不好过。基本上,我有
/auth/signup
/auth/login
分别用于创建帐户和获取jwt令牌

这两种方法都可以通过失眠/邮递员在本地完美工作,但当使用
fetch()
从React.js前端向
/auth/login
发出请求时,它要么返回CORS飞行前请求错误,要么给出“不透明”或“CORS”200 OK响应,而没有正文。后者没有用,因为我需要代币。令人讨厌的是它对失眠有效

下面是从javascript本地通过
fetch()
触发时的响应。没有主体也没有标题。就像失眠症或邮差一样,这里有头和身体

在过去的几周里,我尝试了很多不同的事情,包括:

  • 添加自定义的
    addCorsMappings()
    调用
    webmvcconfiguer
  • CORS过滤器
    @组件
    覆盖
    doFiler()
    ,并具有一系列
    setHeader()
    调用
  • CORS配置类,具有
    corsConfigurer()
    作为
    @Bean
  • 另一个
    Bean
    内部自定义
    WebSecurityConfigurerAdapter
    返回
    corscoconfigurationsource
事实是,我不知道哪一个是最新的,最适合使用的。我读过很多没有帮助的东西(主要是堆栈溢出文章和教程)。在没有充分了解它是否有效或如何有效的情况下,仅仅粘贴代码片段感觉很不对。如果有人能描述配置CORS的正确方法,使其能够使用React而不仅仅是邮递员/失眠症发出的
fetch()
调用,我将不胜感激

我将尽可能多地包含源代码,但这里将排除像用户类这样的内容。据我所知,它们在很大程度上是相当标准的

WebMvcConfig.java

@配置
@EnableWebMvc
公共类WebMvcConfig实现WebMVCConfiguer{
私人最终最长时间=360;
@凌驾
公共作废添加公司标志(公司注册处){
registry.addMapping(“/**”)
.允许的来源(“*”)
.allowedHeaders(“内容类型”、“访问控制允许源”、“访问控制允许头”、“授权”、“X-Requested-With”、“requestId”、“关联Id”)
.exposedHeaders(“内容类型”、“访问控制允许源”、“访问控制允许头”、“授权”、“X-Requested-With”、“requestId”、“关联Id”)
.allowedMethods(“HEAD”、“OPTIONS”、“GET”、“POST”、“PUT”、“PATCH”、“DELETE”)
.maxAge(MAX_AGE_SECS);
}
}
SimpleCORSFilter.java

@组件
公共类SimpleCORSFilter实现过滤器{
公共SimpleCORSFilter(){
}
@凌驾
public void doFilter(ServletRequest-req、ServletResponse-res、FilterChain-chain)抛出IOException、ServletException{
HttpServletRequest请求=(HttpServletRequest)请求;
HttpServletResponse=(HttpServletResponse)res;
response.setHeader(“访问控制允许原点”),request.getHeader(“原点”);
setHeader(“访问控制允许凭据”,“true”);
setHeader(“访问控制允许方法”、“POST、GET、OPTIONS、DELETE”);
setHeader(“访问控制最大年龄”,“3600”);
response.setHeader(“访问控制允许标头”、“来源、访问控制允许来源、访问控制允许标头、授权、请求Id、关联Id、内容类型、接受、X请求的带有、记住我”);
链式过滤器(要求、恢复);
}
@凌驾
public void init(FilterConfig FilterConfig){
}
@凌驾
公共空间销毁(){
}
}
CorsConfig.java

@配置
公共级CorsConfig{
@豆子
公共WebMVCConfiguer corscoonfiguer(){
返回新的WebMVCConfigureAdapter(){
@凌驾
公共作废添加公司标志(公司注册处){
registry.addMapping(“/**”).allowedMethods(“选项”、“获取”、“发布”、“放置”、“删除”).AllowedOriginations(“*”)
.允许的标题(“*”);
}
};
}
}
下面是使用
WebSecurityConfigureAdapter
SecurityConfig.java
类。请注意
configure(HttpSecurity http)
CorsConfigurationSource CorsConfigurationSource()
方法

@配置
@启用Web安全性
@启用全局方法安全性(
securedEnabled=true,
jsr250Enabled=true,
preprestenabled=true
)
公共类SecurityConfig扩展了WebSecurity配置适配器{
@自动连线
CustomUserDetails服务CustomUserDetails服务;
@自动连线
私有JwtAuthenticationEntryPoint未经授权的处理程序;
@豆子
公共JwtAuthenticationFilter JwtAuthenticationFilter(){
返回新的JwtAuthenticationFilter();
}
@凌驾
public void configure(AuthenticationManagerBuilder AuthenticationManagerBuilder)引发异常{
authenticationManagerBuilder。
userDetailsService(customUserDetailsService)
.passwordEncoder(passwordEncoder());
}
@Bean(BeanIds.AUTHENTICATION\u管理器)
@凌驾
公共AuthenticationManager authenticationManagerBean()引发异常{
返回super.authenticationManagerBean();
}
@豆子
公共密码编码器PasswordEncoder(){
返回新的BCryptPasswordEncoder();
}
受保护的无效配置(HttpSecurity http)引发异常{
http
.cors()
.及()
.csrf()
.disable()
.授权请求()
@Configuration
@EnableWebMvc
@ComponentScan
public class MainAppConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("*");
    }
}
@Bean
public CorsFilter corsFilter() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    final CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowCredentials(true);
    configuration.addAllowedOrigin("*");
    configuration.addAllowedHeader("*");
    configuration.addAllowedMethod("OPTIONS");
    configuration.addAllowedMethod("HEAD");
    configuration.addAllowedMethod("GET");
    configuration.addAllowedMethod("PUT");
    configuration.addAllowedMethod("POST");
    configuration.addAllowedMethod("DELETE");
    configuration.addAllowedMethod("PATCH");
    source.registerCorsConfiguration("/**", configuration);
    return new CorsFilter(source);
}