2012-03-16 5 views
1

OathCallBack 페이지의 다음 URL에서 Java를 사용하여 access_token 및 token_type을 추출합니다. 어떤 생각을하는 방법? 자바를 사용하여 웹 페이지의 URL에서 쿼리 문자열을 추출하는 방법

http://myserver.com/OathCallBack#state=/profile&access_token=ya29.AHES6ZQLqtYrPKuw2pMzURJtWuvINspm8-Vf5x-MZ5YzqVy5&token_type=Bearer&expires_in=3600

나는 다음과 같은,하지만 추출 할 수없는 필수 정보를 시도했다.

{ 
    String scheme = req.getScheme();    // http 
    String serverName = req.getServerName();  // myserver.com 
    int serverPort = req.getServerPort();  // 80 
    String contextPath = req.getContextPath(); 
    String servletPath = req.getServletPath(); 
    String pathInfo = req.getPathInfo();   // return null and exception 
    String queryString = req.getQueryString(); // return null 

} 

< ------------------------------------------ ----------------> 을 나는

당신에게,

구글 해냈어,

당신에게 좋은 대답에 모두 감사 내 질문에 편집하기 위하여려고하고있다 URL로 해당 링크를 참조 할 수 있습니다.

http://developers.google.com/accounts/docs/OAuth2Login

위 URL 페이지에 다음 링크가 있습니다.

http://accounts.google.com/o/oauth2/auth? 범위 = https % 3A % 2F % 2Fwww.googleapis.com % 2Fauth % 2Fuserinfo.email + https % 3A % 2F % 2Fwww .googleapis.com % 2Fauth % 2Fuserinfo.profile & state = % 2Fprofile & redirect_uri = https % 3A % 2F % 2Foauth2-login-demo.appspot.com % 2Foauthcallback & RESPONSE_TYPE = 토큰 & CLIENT_ID = 812741506391.apps.googleusercontent.com

당신은 위의 링크를 클릭 할 때, 당신은 당신의 Gmail 로그인 계정 access_token은을 얻는다면, 그 것 토큰은 # 기호 뒤에 있습니다.

+0

URL의 "?" "#"그러므로 쿼리 문자열은 추출되지 않습니다. 문자열에서 전체 URL을 읽거나 가져올 수있는 경우 추출됩니다. 예를 들어 access_token을 포함하여 전체 URL을 읽는 방법 – Khan

+0

req.getRequestURL() –

+0

req를 시도해 보셨습니까? getRequestURL()은 http://myserver.com/OathCallBack 만 검색하고 다른 것은 없지만 다른 인수 (예 : access_token 등)에 관심이 있습니다. – Khan

답변

0

일부 문자는 URL에 포함될 수 없으며 (예 : 공백) 일부 특수 문자는 URL에서 특별한 의미를 갖습니다. 예를 들어, 문자 #는 하위 섹션 (또는 조각)의 do 기념물; character =는 이름과 값을 구분하는 데 사용됩니다.

그 이상을 http://en.wikipedia.org/wiki/Query_string를 참조하십시오

그것은 '#'과 같은
+0

원본 질문을 편집하십시오. – Khan

0

해야한다 '?'.

정상적인 URL에서 매개 변수는 '?'다음에 오는 키 값 쌍으로 전달됩니다. '&'을 사용하여 함께 묶인 여러 매개 변수가 있습니다. URL은 다음과 같이 표시 될 수 있습니다.

http : //someserver.com/somedir/somepage.html?param1=value1 & param2 = value2 & param3 = value3.

일반적으로 Java 서블릿 컨테이너는 '?'다음에 오는 모든 것을 반환합니다. getQueryString()을 호출 할 때 '?'가 없기 때문에 null를 돌려줍니다.

@Sandeep Nair는 getRequestURL()이이 전체 URL을 사용자에게 제공해야한다고 제안했으며 정규식을 사용하여 구문 분석하여 원하는 정보를 얻을 수있었습니다. 그래서이 방법을 사용하여,

(?<=access_token=)[a-zA-Z0-9.-]* 

그러나, 대해 getRequestURL()는 일반적으로 쿼리 문자열을 반환하지 않습니다 오히려 '#'이 있다는 사실에 의존 : 사용에 가능한 정규 표현식의 라인을 따라 것 및 '?' 따라서 아마도 훌륭한 해결책은 아닙니다. here을 참조하십시오.

왜 '?'대신 '#'이 표시되는지 알아내는 것이 좋습니다. 이것을 변경하려고하면 서블릿 컨테이너가 URL 매개 변수를 관리하고 request.getAttribute ("access_token") 및 request.getAttribute ("token_type") (here 참조)를 호출하면 둘 다 반환됩니다. 값을 문자열로 나타냅니다.

0

을 호출하여 쿼리 문자열을받습니다. String queryString = req.getQueryString();

쿼리 문자열이 없으므로 올바르게 null을 반환합니다. "#"다음의 문자는 브라우저에서 볼 수 있고 서버로 보내지 않는 앵커 지정입니다.

관련 문제