Java Spring-Auth+;JWT登录响应200,但缺少正文和标题
我在SpringSecurity的日子有点不好过。基本上,我有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()触发时的响应。没有主体也没有
/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
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);
}