서버 세션 사용으로 PhoneGap 앱에서 작업 중입니다. 세션을 처리하려면 쿠키가 필요합니다. 또한로드 밸런서의 쿠키도 처리해야합니다. 그래서 주위에 방법이 없습니다. PhoneGap 앱에서 쿠키를 어떻게 처리합니까?
나는 이미 몇 가지 연구를 수행했습니다.
- 일부는 쿠키 처리가 알 수없는 사용자 에이전트 (IIS)에 대한 쿠키를 설정하지 않는 서버에 따라 달라질 수 있다고 말합니다 . iOS의 PhoneGap 세션 (쿠키)
- JavaScript에서 쿠키는 document.cookie = …로 설정할 수 있지만 PhoneGap에 저장되지 않고 손실됩니다. xhr 요청을 실행하기 전에 작동합니다.
- 쿠키는 xhr.getResponseHeader ( ‘Set-Cookie’)를 사용하여 xhr 요청 후에 검색 할 수 있습니다. 그러나 실제로 서버에 설정된 경우에만. 불행히도 jQuery는 “Cookie”헤더를 제거합니다.
- JavaScript document.cookie 속성이 할당되지 않고 (xhr) 요청 후에 업데이트되지 않습니다.
- 일부는 세션 ID 등을 저장하기 위해 localStorage를 제안합니다. 그러나 모든 스크립트가 이에 액세스 할 수 있으며 이는 XSS 보안 문제 일 수 있습니다. 쿠키는 httponly 플래그를 사용하여이 문제를 해결합니다.
- iOS : 쿠키를 지원하기 위해 webView 동작을 변경하는 몇 가지 수정 사항이 있습니다. 하지만 iOS 6 및 PhoneGap 2.5에서는 작동하지 않는 것 같습니다. https://groups.google.com/forum/?fromgroups=#!topic/phonegap/ZJE1nxX63ow
- 쿠키는 AppDelegate.m (v2.5)에서 기본적으로 활성화되어있는 것 같습니다.
답변
친구, 저도 폰갭과 함께 쿠키를 사용하는 데 성공하지 못했습니다. 해결책은 localStorage를 사용하는 것입니다.
주요 빠른 예 :
var keyName = window.localStorage.key(0);
세트 항목 빠른 예 :
window.localStorage.setItem("key", "value");
항목 빠른 예보기
var value = window.localStorage.getItem("key");
// value is now equal to "value"
항목 제거 빠른 예 :
window.localStorage.removeItem("key");
명확한 빠른 예 :
window.localStorage.clear();
모바일과 웹 모두에 자바 스크립트를 사용하는 경우이 코드를 사용하여 해당 환경을 감지 할 수 있습니다.
var wl = window.location.href;
var mob = (wl.indexOf("android")>0);
참조 :
http://docs.phonegap.com/en/1.2.0/phonegap_storage_storage.md.html#localStorage
http://cordova.apache.org/docs/en/6.x/cordova/storage/storage.html # page-toc-source
주의 : iOS에서 익명 탐색을 사용하면 localstorage가 사양대로 작동하지 않을 수 있습니다. 나에게 잘 작동하는 간단한 테스트 :
$(document).ready(function () {
try {
localStorage.setItem('test', '1');
} catch (Err) {
if (Err.message.indexOf('QuotaExceededError') > -1) {
// Tell the user they are in anonymous mode
// Sugest it to go to https://support.apple.com/pt-br/HT203036 to get help to disable it
}
}
}
});
답변
귀하와 마찬가지로 내 앱이 웹과 일치하고 별도의 장치 ID 또는 기타 인증 방법이 필요하지 않도록 내 애플리케이션 내 서버에서 설정 한 쿠키를 사용하고 싶었습니다.
내가 발견 한 것은 다음과 같습니다.
- AJAX (예 : jQuery
$.get()
또는$.post()
) 를 통해 설정된 쿠키 는 지속되지 않습니다. - ‘inAppBrowser’에 설정된 쿠키 는 유지됩니다.
따라서 쿠키를 유지하는 방법은 inAppBrowser 플러그인 을 사용하는 것 입니다.
먼저, 유지하려는 GET 매개 변수 키-값 매개 변수로 허용하는 간단한 서버를 설정하십시오. 나는 python / tornado 사람이므로 내 서버는 다음과 같이 보일 수 있습니다.
class PersistCookieHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
token = self.get_argument('token')
self.set_secure_cookie('token',token)
그런 다음 앱에서 :
function persistToken(token,success_cb, error_cb) {
// replace with your URL
url = 'SECURE_SERVER_URL_THAT_HANDLES_SET_COOKIE';
// _blank tells inAppBrowser to load in background (e.g., invisible)
var ref = window.open(url, '_blank', 'location=no,toolbar=no');
// attach a listener to the window which closes it when complete
ref.addEventListener('loadstop', function(event) {
ref.close();
success_cb(); // call our success callback
});
// attach a listener for server errors
ref.addEventListener('loaderror', function(event) {
// call our error callback
error_cb(event);
});
}
그런 다음이를 다음과 같이 호출 할 수 있습니다.
persistToken(
someToken,
function() {
console.log("token persisted");
},
function() {
console.log("something went wrong);
}
);
답변
요청 URL에 세션 ID를 추가하고 서버 애플리케이션 언어에 따라 전달한 쿼리 문자열 세션 ID 값을 사용하여 세션 데이터를 가져올 수도 있습니다. 예를 들어 PHP에서는 세션 ID를 전달하여 기존 세션을 열 수 있습니다. 세션 하이재킹의 위험으로 인해 권장되지는 않지만 IP와 브라우저를 쉽게 테스트하여 세션이 동일한 클라이언트에서 오는지 확인할 수 있습니다. 물론 클라이언트가 세션 브라우저를 닫 자마자 세션을 만료해야하며 세션이 실제 HTML에 포함되므로 뷰 캐싱에서 제한됩니다. 적어도 나를 위해 로컬 장치에 데이터를 저장하는 것은 제 생각에 훨씬 더 큰 보안 위험이있는 클라이언트에 너무 많이 노출되기 때문에 실제로 옵션이 아닙니다.
답변
device_id
서버 측의 특정 레코드를 처리 하려면을 사용하십시오 . 라는 데이터베이스 테이블을 생성 session
하여 서버에 device_id
, cookiename
, cookievalue
과 timestamp
열로을.
클라이언트가 phonegap 앱을 통해 웹 서버에 액세스하면 클라이언트를 가져 와서 device_id
테이블에 쿠키를 저장합니다. 는 device_id here
OAuth를 프로토콜에 액세스 토큰 역할을합니다.
이제 보안상의 이유로 해당 레코드의 유효 기간을 줄여야합니다. device_id가 영구적이고 고객이 언젠가 휴대폰을 판매하기를 원하기 때문입니다. 따라서 timestamp
클라이언트의 마지막 액세스를 저장하는 데 사용 하고 10 일 동안 액세스하지 않은 경우 레코드를 삭제합니다.
답변
Cordova 6.1 (현재 최신 버전)을 사용하고 있으며 실제로 다음을 발견했습니다.
document.cookie = …를 사용하여 Javascript를 통해 쿠키를 설정하면 작동하지 않습니다. 그러나 Ajax를 통해 setCookie 함수를 서버에 다음과 같은 기능으로 보내면
function setCookie(name, value, exdays) {
if(isPhonegap() === true){
var data = "typ=function&functionType=setCookie&name="+name+"&value="+value+"&exdays="+exdays;
loadAjax(data, false);
}
else if (!(document.cookie.indexOf("name") >= 0)){
var expires;
if (exdays) {
var date = new Date();
date.setTime(date.getTime()+(exdays*24*60*60*1000));
expires = "; expires="+date.toGMTString();
}
else{
expires = "";
}
document.cookie = name+"="+value+expires+"; path=/";
}
}
다음을 사용하여 서버 측에 쿠키를 설정합니다.
setcookie($cookie, $value, $expires , "/" );
그러면 실제로 작동합니다!
도움이 되었기를 바랍니다. 건배
답변
동일한 문제가 있고, 로컬 스토리지 난 당신이 또한 그것을 사용할 수 있도록 플러그인 작성에 이동 evrth하기로 결정 : 각-쿠키 미러
답변
물론 당신은 할 수.
ionic 앱은 ajax requset을 보내면 쿠키가 잘 작동하거나 서버에 의존하지 않습니다.
나는 파이썬 Django 서버와 노드 서버와 함께 일했고, 둘 다 쿠키가 아주 잘 작동했습니다.
아래 노드 코드
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", '*');
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("Access-Control-Allow-Credentials",true);
next();
});
나머지 API
router.get('/setCookies', function(req, res, next) {
var now = new Date();
var nextYear=new Date(now.setFullYear(now.getFullYear()+1));
//you can change the cookie key and value by your self here
res.cookie('cookiesTest', 'set cookies success,your cookies can be set by server', { expires: nextYear, httpOnly: true });
res.status(200)
res.end('SET COOKIES SUCCESS')
});
router.get('/getCookies', function(req, res, next) {
res.status(200)
res.end(JSON.stringify(req.cookies))
});
이온 앱 코드
var server='http://[YOUR IP HERE]:3000'
$scope.setCookies=function() {
$http({
url: server + '/setCookies',
method: 'GET'
}).success(function (data, header, config, status) {
alert('set cookies success,look console')
$scope.setCookiesStatu=false
console.log(data)
$scope.cookiesValue=data
}).error(function (data, header, config, status) {
alert('set cookies error,check console or your server address is wrong')
console.log(data)
});
}
$scope.getCookies=function() {
$http({
url: server + '/getCookies',
method: 'GET'
}).success(function (data, header, config, status) {
alert('get cookies success,look console')
console.log(data)
$scope.cookiesValue=data
}).error(function (data, header, config, status) {
alert('get cookies error,check console or your server address is wrong')
console.log(data)
});
}