当前位置: 首页 > 知识库问答 >
问题:

角度post调用作为选项提交给springboot

耿星雨
2023-03-14

我正在使用JWT令牌开发端到端应用程序UI Angular、后端Spring Boot。

它达到了我的方法jwtFilter从邮递员和角度。

在jwtFilter之后,我的postman请求到达createJWTtoken方法

从角度来看,它没有到达创建令牌方法,它返回200 OK响应。

Angular将我的请求作为选项提交

角度计程仪

config.JwtRequestFilter    : JWT Token does not begin with Bearer String
DispatcherServlet        : ***OPTIONS*** "/myapp/authenticate", parameters={}
RequestMappingHandlerMapping : Mapped to com.myapp.controller.JwtAuthenticationController#createAuthenticationToken(JwtRequest)
DispatcherServlet        : Completed 200 OK

来自邮递员日志的请求

config.JwtRequestFilter    : JWT Token does not begin with Bearer String
DispatcherServlet        : ***POST*** "/myapp/authenticate", parameters={}
RequestMappingHandlerMapping : Mapped to com.myapp.controller.JwtAuthenticationController#createAuthenticationToken(JwtRequest)
RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [com.myapp.model.security.JwtRequest@8d233a8]
JwtAuthenticationController      : Creating jwt token
StatisticsImpl         : HHH000117: HQL: select generatedAlias0 from Users as generatedAlias0 where generatedAlias0.userName=:param0, time: 297ms, rows: 1
HttpEntityMethodProcessor  : Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/json, application/*+json, application/x-jackson-smile, application/cbor]
HttpEntityMethodProcessor  : Writing [com.myapp.model.security.JwtResponse@2127c1d5]
DispatcherServlet        : Completed 200 OK

**@覆盖受保护的void doFilterInternal(HttpServletRequest请求、HttpServletResponse响应、FilterChain链)引发ServletException、IOException{

    final String requestTokenHeader = request.getHeader("Authorization");

    String username = null;
    String jwtToken = null;
    if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) {
        jwtToken = requestTokenHeader.substring(7);
        try {
            username = jwtTokenUtil.getUsernameFromToken(jwtToken);
        } catch (IllegalArgumentException e) {
            System.out.println("Unable to get JWT Token");
        } catch (ExpiredJwtException e) {
            System.out.println("JWT Token has expired");
        }
    } else {
        logger.warn("JWT Token does not begin with Bearer String");
    }
    if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
        UserDetails userDetails = this.jwtUserDetailsService.loadUserByUsername(username);
        if (jwtTokenUtil.validateToken(jwtToken, userDetails)) {
            UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
                    userDetails, null, userDetails.getAuthorities());
            usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
            SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
        }
    }
    chain.doFilter(request, response);//Both postman and angular reach this point.
}**
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.csrf().disable()
                .authorizeRequests().antMatchers("/authenticate", "/myapp/authenticate").permitAll().antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
.anyRequest().authenticated().and().
                exceptionHandling().authenticationEntryPoint(jwtAuthenticationEntryPoint).and().sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    
    httpSecurity.addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
        }

角度post调用

public baseUrl = 'http://localhost:8081/myapp/authenticate';

  public callService(userInfo:User){
    var username=userInfo.username;
    var password = userInfo.password;
    return this.http.post(this.baseUrl,
    {
      'username': username,
    'password': password
    },
    { headers: new HttpHeaders({
    'Content-Type': 'application/json',
    'Access-Control-Allow-Credentials': 'true',
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': 'POST',
    'Access-Control-Allow-Headers': 'Origin, Content-Type, Accept, Access-Control-Allow-Origin',
    }), observe: 'response'}
    ).pipe(
      map(userData => {
        sessionStorage.setItem("username", username);
        let tokenStr = "Bearer " + '';
        console.log(tokenStr);
        sessionStorage.setItem("token", tokenStr);
        return userData;
      })
    );
  }

代理配置。json

{
"/api": {
  "target": "http://localhost:8080/",
  "changeOrigin": true,
  "secure": false,
  "pathRewrite": {
  "^/api": ""
}
 }
}

共有1个答案

连正信
2023-03-14

发布飞行前选项请求的不是角度,而是您的浏览器。检查此Angular$超文本传输协议正在发送选项而不是PUT/POST

结论:您必须在spring boot中修复CORS策略,以及spring boot如何处理安全配置中的选项请求。你能在你的问题中添加这部分代码吗。

 类似资料:
  • 我是Angular的新手,我来自灰烬社区。尝试使用基于Ember-CLI的新Angular-CLI。 我需要知道在一个新的项目中处理SASS的最佳方法。我尝试使用repo来查看它是否可以继续使用,因为Angular-CLI的许多核心组件是从Ember-CLI模块运行的。 它没有工作,但再次不确定是否我只是配置错误的东西。 另外,在一个新的有角度的项目中,组织样式的最佳方法是什么?如果将sass文件

  • 用AngularJS按回车键提交表单这个问题使用html5按钮,但我使用角度材质按钮作为 但是如何使用它呢

  • 问题内容: 我有一个简单的形式,像这样: 与我的控制器如下: 我想做的是在提交后清除文本输入,因此我只需清除模型值: 除了现在,因为“需要”表单输入,所以在表单输入周围出现了红色边框。这是正确的行为,但不是我在这种情况下想要的……所以,我想清除输入,然后模糊输入元素。这导致我: 现在,我知道从这样的控制器修改DOM在Angular文档中是很陌生的-但是还有更多的Angular方式可以做到这一点吗?

  • 我有一个表单,其中我将bands表的de id放在一个选择选项中。当我在dropdownlist中选择一个id并尝试提交表单时,该值始终保持为空。如何检索我选择的值? 创造刀身php文件: 我的BandControlers在我的商店行动:

  • 允许用户通过提供选项页面来自定义扩展的行为。 用户可以通过右键单击工具栏中的扩展图标,然后选择选项,或访问 chrome://extensions 的扩展管理页面,找到所需的扩展,点击“详细信息”,然后选择选项链接来查看扩展的选项。 编写选项页面 下面是一个选项页面示例。 <!DOCTYPE html> <html> <head><title>My Test Extension Options</

  • 问题内容: 有人知道如何清除angular中的ui-select框的选定值吗? 我想要select2的功能,其中selectbox中有一个小x。看起来好像没有select2获得的allow-clear方法。 问题答案: 如果您使用的是select2主题,则指令上有一个选项可以为您执行此操作。您将在右侧看到x,可以通过单击将其清除。 https://github.com/angular-ui/ui-