【发布时间】:2011-10-19 18:17:39
【问题描述】:
我有一个 web 应用程序和一个 android 客户端。我想实现一个安全的登录方法。从客户端我向 webservice 方法发送请求:
@POST
@Produces(MediaType.TEXT_PLAIN)
@Path("/login")
public String login(String credentials) {
JSONObject jo = null;
String name = "";
String password = "";
try {
jo = new JSONObject(credentials);
name = jo.getString("name");
password = jo.getString("password");
} catch (JSONException e) {
e.printStackTrace();
}
HttpResponse r = springSecurityCheck(name, password);
for (Header h : r.getAllHeaders()) {
System.out.println(h.getName() + " " + " " + h.getValue() + "");
}
String s = r.getFirstHeader("Location").toString();
boolean isError = s.contains("login_error");
if (!isError) {
Header[] cookies = r.getHeaders("Set-Cookie");
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].toString().contains(
"SPRING_SECURITY_REMEMBER_ME_COOKIE")) {
String[] cookie = cookies[i].toString().split("=");
String token = cookie[1].substring(0,
cookie[1].indexOf(";"));
if (token != null) {
return "token:" + token;
}
}
}
}
System.out.println(" ----- Login from" + name
+ " failed----- ");
return "newLogin";
}
springsecuritycheck 执行以下操作:
public HttpResponse springSecurityCheck(String name, String password) {
DefaultHttpClient client = new DefaultHttpClient();
HttpPost requestLogin = new HttpPost(
"http://mywebapp.com/j_spring_security_check?");
HttpResponse response = null;
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("j_username", name));
params.add(new BasicNameValuePair("j_password", password));
params.add(new BasicNameValuePair("_spring_security_remember_me","true"));
try {
requestLogin
.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
response = client.execute(requestLogin);
return response;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
所以一切正常。令牌存储在服务器数据库的 persitent_logins 表中,登录方法将令牌返回给客户端。但是如何使用令牌进一步请求其他 Web 服务方法?
例如springsecurity登录url为j_spring_security_check?j_username="abc"&j_password="xyz"。有没有像 j_token="1d3ds" 这样的网址?
感谢您的帮助 问候
【问题讨论】:
标签: android web-services login spring-security client