gpt4 book ai didi

android - Volley 请求不适用于 Django session

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:43:33 27 4
gpt4 key购买 nike

我有一个在服务器上运行的 Django 脚本,它为发送到服务器的每个请求创建 session 变量。该脚本根据先前存储的 session 变量返回特定值。

当我在浏览器上测试脚本时,Django 上的 session 按要求工作。

然而,当使用 Volley 发送相同的请求时,脚本将每个请求都视为一个新请求,而不考虑以前的 session 变量。

    StringRequest stringRequest = new StringRequest(Request.Method.GET,Send_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Response(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
});
requestQueue.add(stringRequest);
}

全局定义的 RequestQueue 和 onCreate() 方法中分配的上下文

P.S 我通过从浏览器请求重新检查并且它有效。所以在 Django End 上没有问题。
谢谢!

最佳答案

Volley 默认不支持 Cookie。您应该重写 StringRequest 类,如下所示:

public class StringRequest extends com.android.volley.toolbox.StringRequest {

private final Map<String, String> _params;

/**
* @param method
* @param url
* @param params
* A {@link HashMap} to post with the request. Null is allowed
* and indicates no parameters will be posted along with request.
* @param listener
* @param errorListener
*/
public StringRequest(int method, String url, Map<String, String> params, Listener<String> listener,
ErrorListener errorListener) {
super(method, url, listener, errorListener);

_params = params;
}

@Override
protected Map<String, String> getParams() {
return _params;
}

/* (non-Javadoc)
* @see com.android.volley.toolbox.StringRequest#parseNetworkResponse(com.android.volley.NetworkResponse)
*/
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
// since we don't know which of the two underlying network vehicles
// will Volley use, we have to handle and store session cookies manually
MyApp.get().checkSessionCookie(response.headers);

return super.parseNetworkResponse(response);
}

/* (non-Javadoc)
* @see com.android.volley.Request#getHeaders()
*/
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
Map<String, String> headers = super.getHeaders();

if (headers == null
|| headers.equals(Collections.emptyMap())) {
headers = new HashMap<String, String>();
}

MyApp.get().addSessionCookie(headers);

return headers;
}
}

和你的应用类:

public class MyApp extends Application {
private static final String SET_COOKIE_KEY = "Set-Cookie";
private static final String COOKIE_KEY = "Cookie";
private static final String SESSION_COOKIE = "sessionid";

private static MyApp _instance;
private RequestQueue _requestQueue;
private SharedPreferences _preferences;

public static MyApp get() {
return _instance;
}

@Override
public void onCreate() {
super.onCreate();
_instance = this;
_preferences = PreferenceManager.getDefaultSharedPreferences(this);
_requestQueue = Volley.newRequestQueue(this);
}

public RequestQueue getRequestQueue() {
return _requestQueue;
}


/**
* Checks the response headers for session cookie and saves it
* if it finds it.
* @param headers Response Headers.
*/
public final void checkSessionCookie(Map<String, String> headers) {
if (headers.containsKey(SET_COOKIE_KEY)
&& headers.get(SET_COOKIE_KEY).startsWith(SESSION_COOKIE)) {
String cookie = headers.get(SET_COOKIE_KEY);
if (cookie.length() > 0) {
String[] splitCookie = cookie.split(";");
String[] splitSessionId = splitCookie[0].split("=");
cookie = splitSessionId[1];
Editor prefEditor = _preferences.edit();
prefEditor.putString(SESSION_COOKIE, cookie);
prefEditor.commit();
}
}
}

/**
* Adds session cookie to headers if exists.
* @param headers
*/
public final void addSessionCookie(Map<String, String> headers) {
String sessionId = _preferences.getString(SESSION_COOKIE, "");
if (sessionId.length() > 0) {
StringBuilder builder = new StringBuilder();
builder.append(SESSION_COOKIE);
builder.append("=");
builder.append(sessionId);
if (headers.containsKey(COOKIE_KEY)) {
builder.append("; ");
builder.append(headers.get(COOKIE_KEY));
}
headers.put(COOKIE_KEY, builder.toString());
}
}

}

你也可以查看this link更多...

关于android - Volley 请求不适用于 Django session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43036253/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com