Android Okhttp3令牌随每个请求get进行更改

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="

我正在尝试使用库Okhttp3从android登录,但我无法保留csrf令牌而不进行更改。 我试图获取标题“X-CSRF-TOKEN”,但无法获取,我转向Jsoup库解析html并过滤_CSRF以发出post请求,但csrk令牌发生了变化。 我使用的是SpringBoot+SpringSecurity,在本地主机上运行。 我需要帮助,因为我在谷歌搜索,但还没有找到解决方案

<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();