服务器以 403 (Forbidden) 状态响应

Posted

技术标签:

【中文标题】服务器以 403 (Forbidden) 状态响应【英文标题】:the server responded with a status of 403 (Forbidden) angular 【发布时间】:2020-05-29 22:36:08 【问题描述】:

当我尝试使用this.http.get@GetMapping 拨打电话时,我可以将电话发送到弹簧控制器,

当我尝试从this.http.get 更改为this.http.post 以及从@GetMapping 更改为@PostMapping 时,我无法调用弹簧控制器/api/v1/basicauth 方法。

因为我有用户名和密码,所以我只想使用PostMapping

我的代码如下:-

角度

var formData: any = new FormData();
formData.append("userName", username);
formData.append("password", password);

let params = new HttpParams();
params = params.append('username', username);
params = params.append('password', password);
return this.http.post<any>('/api/v1/basicauth',  formData ).pipe(map((res) => 
    this.username = username;
    this.password = password;
));

春季启动:-

@PostMapping(path = "/basicauth")
public AuthenticationBean helloWorldBean(@RequestBody UserDetails user) 
log.info("Start helloWorldBean method");

UserDetails.java

    public class UserDetails 

        private int userId;
        private String userName;
        private String password;
   

【问题讨论】:

试试“username, password”而不是“formData”作为“body”参数怎么样? @happyZZR1400 我可以通过 this.http.get 使用 body 参数来调用 spring 控制器 如果你尝试对“this.http.post”做同样的事情会发生什么? 你休息是为 GET 实现的,而不是你为什么从 angular 发送帖子? @happyZZR1400 我无法使用this.http.post拨打电话 【参考方案1】:

不要使用FormData (Angular),因为您的控制器正在接受@RequestBody

你的formData 应该是这样的

var formData = "username": username, "password": password;

Rest 会自动将其反序列化为 UserDetails

【讨论】:

【参考方案2】:

客户端

login(username: string, password: string) 
        return this.http.post<any>('/api/v1/basicauth',  username, password )
            .pipe(map(user => 
                // eg.
                // localStorage.setItem('currentUser', JSON.stringify(user));
                return user;
            ));

示例来自:https://jasonwatmore.com/post/2019/06/22/angular-8-jwt-authentication-example-tutorial

服务器端

您正在使用@RequestParam 检索参数,这意味着您正在将参数作为http://host:8080/api/auth?password=abc&amp;... 进行检索。

请查看https://www.baeldung.com/spring-request-response-body

【讨论】:

我想将用户名和密码作为json对象传递,我可以单独接收uname和pwd,我什至想在java中作为对象接收 你如何在服务器端接收这两个? ...而且我认为您错过了使用管道以及在客户端和服务器上发布 & get(?@GetMapping) 方法。 @RequestParam(name = "username") String username,@RequestParam(name = "password") String password @Codelover 更新了答案,我认为这不是正确的方法。了解更多信息:https://www.baeldung.com/spring-request-param。 我会检查那个链接,但我现在说我正在使用作为参数,因为我无法作为对象发送。我已经更新了正确的代码

以上是关于服务器以 403 (Forbidden) 状态响应的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让 AuthorizeAttribute 响应状态码 403 Forbidden 而不是重定向?

加载资源失败:服务器响应状态为 403(禁止),包括 css 文件和 js 库

打开网页显示403-forbidden啥意思啊

getpost响应状态

403错误怎么解决

如何在全球范围内以最佳方式处理来自服务器的 401/403 响应