一,写好服务器端

  在eclipse或其它javaee开发工具中新建一个web项目(我这里的项目名是:Android),建一个servlet(我这里的servlet名是:LoginServlet),模拟实现数据库,对安卓请求的数据判断,并返回(封装为json,需要json有解析json的jar包哦),servlet核心代码如下:

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doPost(request, response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        number++;
System.out.println("已经进入... ,第"+number+"次"); request.setCharacterEncoding("utf-8");
String name="";
String password = "";
name = request.getParameter("name");
password = request.getParameter("password"); String result = "";
//模拟数据库获取数据并判断
if ("yyc".equals(name)&&"123456".equals(password)) {
result="success";
}else{
result = "error";
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("result", result);
response.getWriter().print(jsonObject);
}

  写完了就可以发布在Tomcat服务器上(我们这里就写一个servlet就足够了),在浏览器中,访问试试,看不能访问,免得影响后续步骤的操作。测试链接,如:http://127.0.0.1:8080/Android/servlet/LoginServlet?name=yyc&password=123456

二、Android布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> <EditText
android:id="@+id/nameEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="点击输入用户名"
android:inputType="text" /> <EditText
android:id="@+id/passwordEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="点击输入密码"
android:inputType="numberPassword" /> <Button
android:id="@+id/login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录(HttpClient)" /> <Button
android:id="@+id/login1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录(HttpURLConnection)" /> </LinearLayout>

  从布局文件中可以看出写了两个输入框,一个输入用户名,一个输密码,两个按钮,一个用于测试HttpClient通信,一个用于测试HttpURLConnection通信。我们先来实现HttpClient吧。

三、用HttpClient实现登陆认证(不建议)

  在这之前,先在Android模拟器的浏览器中,访问刚刚的地址,测试能不能访问,不要影响我们后面的程序。注意:这时不能通过localhost来访问了,通过ip,cmd输入ipconfig可以查看ip地址。

  现在高版本的android要使用HttpClient的话,要在build.gradle(app)中的android标签中添加:useLibrary 'org.apache.http.legacy',由于我们要访问网络,我们需要设置网络权限:在AndroidManifest.xml中加入网络权限:<uses-permission android:name="android.permission.INTERNET"/>

  在android studio中新建一个类:HttpUtilsHttpClient

public class HttpUtilsHttpClient {
//1.创建HttpClient对象
private static HttpClient httpClient = new DefaultHttpClient(); public static String BASE_URL= "http://你的ip地址:8080/Android"; /**
* GET方式
* @param url
* @return
*/
public static String getRequest(String url){
String result = ""; //2.创建HttpGet对象
HttpGet httpGet= new HttpGet(url);
try {
//3.发送Get请求
HttpResponse response = httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200){
//4.获取服务器返回的数据
HttpEntity entity = response.getEntity();
result = EntityUtils.toString(entity);
} } catch (IOException e) {
e.printStackTrace();
} return result ;
} public static String postRequest(String url,Map<String,String> params){
String result = ""; HttpPost httpPost = new HttpPost(url); List<NameValuePair> parameters = new ArrayList<>();
for (Map.Entry<String,String> entry: params.entrySet()) {
NameValuePair pair = new BasicNameValuePair(entry.getKey(),entry.getValue());
parameters.add(pair);
}
try {
httpPost.setEntity(new UrlEncodedFormEntity(parameters,"utf-8")); HttpResponse response = httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode() == 200){
//4.获取服务器返回的数据
HttpEntity entity = response.getEntity();
result = EntityUtils.toString(entity);
}
}catch (IOException e) {
e.printStackTrace();
} return result;
}
}

  这个类总共两个方法getRequest故名思意就是Get请求,postRequest就是post方式请求,由于我们要传参数(name和password),我们这里真正使用的是post请求。参数保存在一个map集合中。执行后返回String类型的参数,其实就是json字符串。

  然后在MainActivity中调用PostRequest方法(设置url和参数),并对放回的String字符串(json)解析,做出相应的表现(Toast成功或者失败);

private void loginButtonHttpClientOption() {
loginButtonHttpClient.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
String url=HttpUtilsHttpClient.BASE_URL+"/servlet/LoginServlet";
Map<String ,String > params = new HashMap<String, String>();
String name=nameEdit.getText().toString();
String password=passwordEdit.getText().toString();
params.put("name",name);
params.put("password",password);
//请求,返回json
String result = HttpUtilsHttpClient.postRequest(url, params);
Message msg = new Message();
msg.what=0x11;
Bundle data=new Bundle();
data.putString("result",result);
msg.setData(data); hander.sendMessage(msg);
} Handler hander = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what==0x11){
Bundle data = msg.getData();
String key = data.getString("result");//得到json返回的json数据
// Toast.makeText(MainActivity.this,key,Toast.LENGTH_LONG).show();
try {
JSONObject json= new JSONObject(key);
String result = (String) json.get("result");
if ("success".equals(result)){
Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_LONG).show();
}else if("error".equals(result)){
Toast.makeText(MainActivity.this,"登录失败",Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
}).start();
}
});
}

  loginButtonHttpClientOption这个方法主要就是一个按钮的点击事件监听,设置url、获取EditText中的值后封装在map中后,我们就可以请求http了(调用HttpUtilsHttpClient.postRequest(url, params);)。
而Handler的作用是一般情况下,在主线程中我们绑定了Handler,并在事件触发上面创建新的线程用于完成某些耗时的操作(我们这里用线程访问了网络),当子线程中的工作完成之后,会对Handler发送一个完成的信号,
而Handler接收到信号后,就进行主UI界面的更新操作(我们这里直接判断并Toast)。对Handler和线程不理解的话,可以去百度搜搜其它技术贴看看。

四、使用HttpURLConnection实现登录验证(建议)
  安卓建议我们使用这种方式,我们也不用修改build文件了,但还是需要在AndroidManifest.xml文件中加入网络权限:<uses-permission android:name="android.permission.INTERNET"/>

  新建类:HttpUtilsHttpURLConnection

public class HttpUtilsHttpURLConnection {

    public static String BASE_URL= "http://你的ip地址:8080/Android";
/*
* urlStr:网址
* parms:提交数据
* return:网页源码
* */
public static String getContextByHttp(String urlStr,Map<String,String> parms){
StringBuilder sb = new StringBuilder();
try{
URL url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(true); OutputStream outputStream = connection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));
writer.write(getStringFromOutput(parms)); writer.flush();
writer.close();
outputStream.close(); if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String temp;
while((temp = reader.readLine()) != null){
sb.append(temp);
}
reader.close();
}else{
return "connection error:" + connection.getResponseCode();
} connection.disconnect();
}catch (Exception e){
return e.toString();
}
return sb.toString();
} /**
* 将map转换成key1=value1&key2=value2的形式
* @param map
* @return
* @throws UnsupportedEncodingException
*/
private static String getStringFromOutput(Map<String,String> map) throws UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
boolean isFirst = true; for(Map.Entry<String,String> entry:map.entrySet()){
if(isFirst)
isFirst = false;
else
sb.append("&"); sb.append(URLEncoder.encode(entry.getKey(),"UTF-8"));
sb.append("=");
sb.append(URLEncoder.encode(entry.getValue(),"UTF-8"));
}
return sb.toString();
}
}
  这个和上面讲的那个HeepClient也没多大区别,有异曲同工之妙嘛。仔细店看看就懂了。
  
点击事件监听代码:
  这和上面的那个点击事件也是一样的啦,没什么好说的。同样的是设置url、获取EditText中的值后封装在map中后,请求http。返回数据并解析。
 private void loginButtonHttpURLConnectionOption() {
loginButtonHttpURLConnection.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
String url=HttpUtilsHttpURLConnection.BASE_URL+"/servlet/LoginServlet";
Map<String, String> params = new HashMap<String, String>();
String name=nameEdit.getText().toString();
String password=passwordEdit.getText().toString();
params.put("name",name);
params.put("password",password); String result = HttpUtilsHttpURLConnection.getContextByHttp(url,params); Message msg = new Message();
msg.what=0x12;
Bundle data=new Bundle();
data.putString("result",result);
msg.setData(data); hander.sendMessage(msg);
} Handler hander = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what==0x12){
Bundle data = msg.getData();
String key = data.getString("result");//得到json返回的json
// Toast.makeText(MainActivity.this,key,Toast.LENGTH_LONG).show();
try {
JSONObject json= new JSONObject(key);
String result = (String) json.get("result");
if ("success".equals(result)){
Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_LONG).show();
}else if("error".equals(result)){
Toast.makeText(MainActivity.this,"登录失败",Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
}).start();
}
});
}

效果图:

成功:                                                             失败:

                  

最后贴上MainActivity的所有代码:

 package com.yyc.webservice;

 import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; import org.json.JSONException;
import org.json.JSONObject; import java.util.HashMap;
import java.util.Map; public class MainActivity extends AppCompatActivity { private EditText nameEdit,passwordEdit;
private Button loginButtonHttpClient,loginButtonHttpURLConnection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); init();
loginButtonHttpClientOption();
loginButtonHttpURLConnectionOption(); } private void loginButtonHttpURLConnectionOption() {
loginButtonHttpURLConnection.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
String url=HttpUtilsHttpURLConnection.BASE_URL+"/servlet/LoginServlet";
Map<String, String> params = new HashMap<String, String>();
String name=nameEdit.getText().toString();
String password=passwordEdit.getText().toString();
params.put("name",name);
params.put("password",password); String result = HttpUtilsHttpURLConnection.getContextByHttp(url,params); Message msg = new Message();
msg.what=0x12;
Bundle data=new Bundle();
data.putString("result",result);
msg.setData(data); hander.sendMessage(msg);
} Handler hander = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what==0x12){
Bundle data = msg.getData();
String key = data.getString("result");//得到json返回的json
// Toast.makeText(MainActivity.this,key,Toast.LENGTH_LONG).show();
try {
JSONObject json= new JSONObject(key);
String result = (String) json.get("result");
if ("success".equals(result)){
Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_LONG).show();
}else if("error".equals(result)){
Toast.makeText(MainActivity.this,"登录失败",Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
}).start();
}
});
} private void loginButtonHttpClientOption() {
loginButtonHttpClient.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() {
String url=HttpUtilsHttpClient.BASE_URL+"/servlet/LoginServlet";
Map<String ,String > params = new HashMap<String, String>();
String name=nameEdit.getText().toString();
String password=passwordEdit.getText().toString();
params.put("name",name);
params.put("password",password);
//请求,返回json
String result = HttpUtilsHttpClient.postRequest(url, params);
Message msg = new Message();
msg.what=0x11;
Bundle data=new Bundle();
data.putString("result",result);
msg.setData(data); hander.sendMessage(msg);
} Handler hander = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what==0x11){
Bundle data = msg.getData();
String key = data.getString("result");//得到json返回的json
// Toast.makeText(MainActivity.this,key,Toast.LENGTH_LONG).show();
try {
JSONObject json= new JSONObject(key);
String result = (String) json.get("result");
if ("success".equals(result)){
Toast.makeText(MainActivity.this,"登录成功",Toast.LENGTH_LONG).show();
}else if("error".equals(result)){
Toast.makeText(MainActivity.this,"登录失败",Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
};
}).start();
}
});
} private void init() {
nameEdit = (EditText) findViewById(R.id.nameEdit);
passwordEdit = (EditText) findViewById(R.id.passwordEdit);
loginButtonHttpClient = (Button) findViewById(R.id.login);
loginButtonHttpURLConnection= (Button) findViewById(R.id.login1);
}
}

MainActivity

有任何问题可以加小编微信一起讨论哦:java_squirrel

 

Android 实现http通信(servlet做服务器端) HttpClient、HttpURLConnection实现登录验证的更多相关文章

  1. android loginDemo +WebService用户登录验证

        android loginDemo +WebService用户登录验证 本文是基于android4.0下的loginActivity Demo和android下的Webservice实现的.l ...

  2. jsp+servlet+mysql 实现简单的银行登录转账功能

    jsp+servlet+mysql 实现简单的银行登录转账功能 [前期的准备] html(登录界面),servlet(处理业务逻辑),jsp(主要实现界面),mysql(实现与数据库的简单的交互)先从 ...

  3. Android 串口蓝牙通信开发Java版本

    Android串口BLE蓝牙通信Java版 0. 导语 Qt on Android 蓝牙通信开发 我们都知道,在物联网中,BLE蓝牙是通信设备的关键设备.在传统的物联网应用中,无线WIFI.蓝牙和Zi ...

  4. Android之Http通信——1.初识Http协议

    Android之Http通信--1.初识Http协议 引言: 今天是六一儿童节,先在这里给各位超龄儿童说声节日快乐哈~( ╯□╰ ),小猪也象征性地给群里的小朋友们派了红包-嗯,忙碌的五月最终过去了, ...

  5. Android开发--Socket通信

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

  6. Android 之 Socket 通信

    Android 之 Socket 通信 联系一下 Socket 编程,之后需要将一个 JavaEE 项目移植到 Android,暂时现尝试写一个简单的 DEMO,理解一下 Socket Server ...

  7. Android基础_web通信

    一.发展史 1G 模拟制式手机,只能进行语音通话2G 数字制式手机,增加接收数据等功能3G 智能手机,它已经成了集语音通信和多媒体通信相结合,并且包括图像.音乐.网页浏览.电话会议以及其它一些信息服务 ...

  8. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一.Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Andro ...

  9. Android NFC近场通信1——NFC概述

    最近对NFC挺感兴趣,而且新换的手机也支持NFC功能(最近换了Find5,感觉还不错O(∩_∩)O),所以打算学学NFC编程.NFC就是我们经常说的近场通信.通常距离是4厘米或更短.NFC工作频率是1 ...

随机推荐

  1. EasyNVR摄像机无插件直播如何排查视频广场不在线

    通道配置完成进入视频广场监控通道显示不在线 保证RTSP视频流地址是否可用,推荐用VLC先测试地址是否可用.(注意:软件本身只支持标准的RTSP视频流地址.) 如果是刚配置完需要等大概几秒左右有的网络 ...

  2. ECMAScript6箭头函数ArrowFunction"=>"

    一.说明 ECMAScript6可以用箭头"=>"定义函数.x => x * x或(x) => {return x * x;}与匿名函数function(x){r ...

  3. JavaScript-onerror事件:图片加载失败后不显示

    HTML: <img src="http://www.mazey.net/images/upload/image/20170518/1495122198180663.gif" ...

  4. 【转】通过VIOS实现AIX系统的网络虚拟化

    在上一篇博文中,我们已经在一个新创建的LPAR中通过File-backed device以及VMLibrary的方式成功安装了一个AIX系统,接下来我们讨论如何通过VIOS的协助来完成新装AIX系统的 ...

  5. 微信小程序-学习总结(1)

    微信小程序尺寸单位 rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx. 设备               rpx换算成px(屏幕宽度/750)   ...

  6. camke GUI工具 选择 vs2017 时,如何指定工具集 v140 而不是默认的 v141?

    在参数位置加入 v140 即可,不需要加 -T

  7. 如何在Pycharm设置ES6语法环境

    首先 如果不进行相关设置就刚ES6 语法的话,会出现下面提示性错误(运行还是能正常出效果的): (let 飘红, 这只是其中之一, 其他语法也会飘红) 接着,就是解决问题: 首先打开设置: 接着找到下 ...

  8. Python定时执行脚本

    最近测试hbase,老发现服务挂掉,自己不能及时发现,想了想,写了个脚本,让脚本每个小时执行一次,以便检测是否有服务挂掉,如果有服务挂掉,及时启动 import os import datetime ...

  9. MDF损坏或LDF文件损坏

    MDF损坏或LDF损坏 MDF丢失或LDF丢失 注意,这些情况必须要相同版本的sql server才能操作成功 当MDF损坏时 1.备份结尾日志 http://www.cnblogs.com/gere ...

  10. 字符串之strstr

    功能:查找第二个字符串是否存在第一个字符串中. 输入:字符串1,字符串2 返回值:成功返回str1中的位置,失败返回NULL #include <iostream> using names ...