我正在开发一个需要登录和注册的 Android 应用程序。我已经使用 java spring boot 框架创建了服务器端。注册效果很好,但我无法登录。我该如何解决?我写的代码如下:
注册服务器代码:
@PostMapping("/register")
public Person addUser(@RequestBody Person user) {
user.setPassword(encoder.encode(user.getPassword()));
return userService.saveUser(user);
}
登录服务器代码:
@PostMapping("/login")
public UserDetails authenticate(@RequestBody Person principal) throws Exception {
return authService.authenticate(principal);
}
这很好用。因为如果我尝试使用 postman ,我可以很好地登录。
此外,在 andorid 上注册也很有效。如果我从 android 注册一个用户,它将被保存到我的数据库中,我可以使用 postman 登录该用户。
这是我的andorid注册码:
class HttpRequestTask extends AsyncTask<Void, Void, Person> {
@Override
protected Person doInBackground(Void... params) {
try {
final String url = "myurl/register";
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Person person= new Person();
person.setNome(myname);
person.setCognome(myusername);
person.setUsername(mynickname);
person.setPassword(mypassword);
person.setProfileType(myprofileType);
return restTemplate.postForObject(url, person, Person.class);
}
catch(Exception e){
Log.e("MainActivity", e.getMessage(), e);
}
return null;
}
}
而且效果很好。
这是我的安卓登录代码:
class HttpRequestTask extends AsyncTask<Void, Void, Person> {
@Override
protected Person doInBackground(Void... params) {
try {
final String url = "myurl/login";
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
Person person= new Person();
person.setUsername(myusername);
person.setPassword(mypassword);
return restTemplate.postForObject(url, person, Person.class);
}
catch(Exception e){
Log.e("MainActivity", e.getMessage(), e);
}
return null;
}
}
登录无效。
我应该为 Android 使用 Spring Boot 吗?
谁有例子吗?
提前致谢!
最佳答案
我认为您必须在 header 中发送您的身份验证 token 。这应该用这样的拦截器来完成
public class AuthInterceptor implements ClientHttpRequestInterceptor {
public static final String TAG = "INTERCEPTOR";
@Bean
EgomniaLoginManager loginManager;
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
HttpHeaders headers = request.getHeaders();
headers.set(ACCESS_TOKEN, loginManager.getAccessToken());
// logga request
if (BuildConfig.DEBUG) {
this.logRequest(request, body);
}
ClientHttpResponse response = execution.execute(request, body);
// logga response
if (BuildConfig.DEBUG) {
// this.logResponse(response);
// execute second time because logging consume response body
// response = execution.execute(request, body);
}
return response;
}
}
您必须将此拦截器添加到您的RestTemplate
,我使用Android Annotations 来做到这一点,所以我不记得它是如何完成的
关于java - 使用 Spring 启动服务器的 Android 登录身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50098265/