【问题标题】:Spring Boot returning error Content type 'text/plain;charset=UTF-8' not supportedSpring Boot 返回错误 Content type \'text/plain;charset=UTF-8\' not supported
【发布时间】:2023-02-06 22:53:58
【问题描述】:

我正在尝试将 POST 从我的 javascript 文件发送到将验证登录的服务器本地主机。

这是我的前端代码:

// Create a function to handle the login process
async function login(username, password) {
    try {
        const response = await fetch('http://localhost:8080/api/login/', {
            method: 'POST',
            mode: 'no-cors',
            headers: {
              'Content-Type': 'application/json'
            },
            body: JSON.stringify({
              username,
              password,
            })
        });
        
  
      // Check if the response was successful
      if (!response.ok) {
        throw new Error('Login failed. Please try again.');
      }
  
      // Parse the response JSON data
      const data = await response.json();
  
      // Check if the authentication was successful
      if (!data.authenticated) {
        throw new Error('Invalid username or password.');
      }
  
      // Store the authentication token in local storage
      localStorage.setItem('token', data.token);
  
      // Redirect the user to the loginPage.html page
      window.location.href = '/loginPage.html';
    } catch (error) {
      // Show an error message
      alert(error.message);
    }
  }

这是我的服务器代码:

@RestController
@RequestMapping("/api")
public class WSMController {

    private Map<String, UserSession> sessions = new HashMap<>();

    @Autowired
    private WSMService service;


    @PostMapping(value = "/login")
    public ResponseEntity<String> login(@RequestBody LoginRequest request) {
        User user = authenticate(request);
        if (user == null) {
            return ResponseEntity.badRequest().body("Invalid username or password");
        }
        String token = UUID.randomUUID().toString();
        UserSession session = new UserSession(user, token);
        sessions.put(token, session);
        return ResponseEntity.ok(token);
    }

    @PostMapping("/logoff")
    public ResponseEntity<String> logoff(@RequestHeader("Authorization") String token) {
        sessions.remove(token.substring(7));
        return ResponseEntity.ok("User logged off successfully");
    }

    @GetMapping("/user")
    public User getUser(@RequestHeader("Authorization") String token) {
        UserSession session = sessions.get(token.substring(7));
        if (session == null) {
            return null;
        }
        return session.getUser();
    }

    private User authenticate(LoginRequest request) {
        if(!service.getCredentials(request)) {
            return null;
        }

        return new User(request.getUsername(),request.getPassword());
    }

这是我的登录请求对象:

package com.worksoftmanager.WorkSoftManagerAuthenticator.model;

公共类登录请求{

private String username;
private String password;

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

}

这是来自服务器端的错误消息: 2023-02-06 10:43:10.674 WARN 20380 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver:已解决 [org.springframework.web.HttpMediaTypeNotSupportedException:内容类型 'text/plain;charset=UTF-8 ' 不支持]

我尝试设置标头以发送 application/json 内容并更改 RequestMapping 以使用 Application_JSON_Value 但它们都不起作用。

【问题讨论】:

  • 您的 LoginRequest 类是什么样的?
  • 让我通过添加 LoginRequest @AchoVasilev 来编辑我的问题

标签: javascript spring fetch


【解决方案1】:

我认为 JSON 不好。尝试

    body: JSON.stringify({
      'username' : username,
      'password': password
    })

【讨论】:

  • 嘿,这是一个很好的修复,但不幸的是错误仍然存​​在:(
  • 很确定问题出在客户端。您能否尝试将客户端指向 fetch('httpbin/post 并在 const data = await response.json(); 之后的行上执行 console.log('data', data); 将其粘贴到您的问题中。
【解决方案2】:

您应该在发送请求之前打印该请求,以便验证您是否拥有有效的 JSON。该请求似乎不是 JSON。

@PostMapping 或其他映射可以设置为特定的输入/输出 ContentTypes

@PostMapping(path = "/login", consumes = "application/json", produces = "application/json")
public ResponseEntity<String> login(@RequestBody LoginRequest request) {
    ...
    return ResponseEntity;
}

其他了解Spring @PostMapping的参考资料:

(Baeldung) @RequestMapping Consumes and Produces

(Stackoverflow) What is produce and consume in @Request Mapping

【讨论】:

  • 嘿,刚刚用你提到的值更改了 postMapping,但不幸的是我得到了同样的错误:2023-02-06 11:29:38.765 WARN 19340 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver:已解决 [ org.springframework.web.HttpMediaTypeNotSupportedException: 不支持内容类型 'text/plain;charset=UTF-8']
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 2023-02-15
  • 2021-06-22
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 2016-01-23
  • 2012-05-19
相关资源
最近更新 更多