Android Okhttp3令牌随每个请求get进行更改
我正在尝试使用库Okhttp3从android登录,但我无法保留csrf令牌而不进行更改。 我试图获取标题“X-CSRF-TOKEN”,但无法获取,我转向Jsoup库解析html并过滤_CSRF以发出post请求,但csrk令牌发生了变化。 我使用的是SpringBoot+SpringSecurity,在本地主机上运行。 我需要帮助,因为我在谷歌搜索,但还没有找到解决方案Android Okhttp3令牌随每个请求get进行更改,android,spring-boot,spring-security,okhttp3,Android,Spring Boot,Spring Security,Okhttp3,我正在尝试使用库Okhttp3从android登录,但我无法保留csrf令牌而不进行更改。 我试图获取标题“X-CSRF-TOKEN”,但无法获取,我转向Jsoup库解析html并过滤_CSRF以发出post请求,但csrk令牌发生了变化。 我使用的是SpringBoot+SpringSecurity,在本地主机上运行。 我需要帮助,因为我在谷歌搜索,但还没有找到解决方案 <form class="col s12" id="formlogin" action="#" th:action="
<form class="col s12" id="formlogin" action="#" th:action="@{/logincheck}" th:method="POST">
<div class="row">
<div class="input-field col s12">
<i class="material-icons prefix">account_circle</i>
<input id="username" name="username" type="text" class="validate" th:required="required"/>
<label for="usuario">username</label>
</div>
</div>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<div class="row">
<div class="input-field col s12">
<i class="material-icons prefix">lock</i>
<input id="password" name="password" type="password" class="validate" th:required="required"/>
<label for="password">password</label>
</div>
</div>
<div class="row">
<div class="input-field col s12">
<button class="btn waves-effect waves-light pink col s12 m4 l4 xl4 right " type="submit"
name="action">
sign in
<i class="material-icons left">send</i>
</button>
</div>
</div>
弹簧启动响应:
{"timestamp":1532156617366,"status":403,"error":"Forbidden","message":"Could not verify the provided CSRF token because your session was not found.","path":"/logincheck"}
有什么想法吗?多谢各位
Could not verify the provided CSRF token because your session was not found.
问题在于您的会话,您需要保存您的spring security cookie会话,下面是一个处理所有cookie的示例
OkHttpClient client = new OkHttpClient.Builder()
.cookieJar(new CookieJar() {
private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
@Override
public void saveFromResponse(@NonNull HttpUrl url, @NonNull List<Cookie> cookies) {
cookieStore.put(url.host(), cookies);
}
@Override
public List<Cookie> loadForRequest(@NonNull HttpUrl url) {
List<Cookie> cookies = cookieStore.get(url.host());
return cookies != null ? cookies : new ArrayList<Cookie>();
}
})
.build();
OkHttpClient=new OkHttpClient.Builder()
.cookieJar(新的cookieJar(){
private final HashMap cookieStore=新HashMap();
@凌驾
public void saveFromResponse(@NonNull HttpUrl url,@NonNull列表cookies){
cookieStore.put(url.host(),cookies);
}
@凌驾
公共列表loadForRequest(@NonNull HttpUrl url){
List cookies=cookieStore.get(url.host());
返回cookies!=null?cookies:new ArrayList();
}
})
.build();
谢谢您的帮助。我如何继续你分享的内容?我已经激活了csrf,普通用户可以通过浏览器和android使用该应用程序,非常感谢。您在客户端字段上设置了.cookieJar,istead of client=new OkHttpClient(),您可以放置我的代码。使用代码后,我继续使用:final RequestBody formBody=new formBody.Builder()。添加(“用户名”,“用户名”).add(“password”、“password”).add(“_csrf”,token).build();字符串urlpost=“”;Request request2=new Request.Builder().url(url).post(formBody.build();Call call2=client.newCall(request2);呼叫2.enq。。。。但我得到了同样的结果。你认为我应该停用csrf吗?感谢您的帮助。请尝试使用令牌在您的请求“X-CSRF-Token”中设置标题
OkHttpClient client = new OkHttpClient.Builder()
.cookieJar(new CookieJar() {
private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
@Override
public void saveFromResponse(@NonNull HttpUrl url, @NonNull List<Cookie> cookies) {
cookieStore.put(url.host(), cookies);
}
@Override
public List<Cookie> loadForRequest(@NonNull HttpUrl url) {
List<Cookie> cookies = cookieStore.get(url.host());
return cookies != null ? cookies : new ArrayList<Cookie>();
}
})
.build();