Android对接Java后端

抱着学习娱乐的心态写的这篇博客 如果有错误 请回复指出

Java服务端

1 http请求

GET  GET方法是默认的HTTP请求方法, 但是相对来说携带的数据长度有限的 速度比POST快 用于查询合适

POST  POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。安全性也会比GET高

如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。

2 防止SQL注入

@WebServlet("/Login")

public class LoginServlet extends HttpServlet {

public LoginServlet()

{

}

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// TODO Auto-generated method stub

String UserName=req.getParameter("UserName");

String PassWord=req.getParameter("PassWord");

resp.setContentType("text/html;charset=utf-8");

User s=new User(UserName,PassWord);

PrintWriter out=resp.getWriter();

try {

if(s.isExist())

{

//resp.sendRedirect("/JMZ/MyServlet");

out.print("登录成功");

}

else

{

//resp.sendRedirect("/JMZ/Error");

out.print("登录失败");

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

out.print("登录出错了!");

}

out.close();

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

// TODO Auto-generated method stub

doGet(req, resp);

}

}

为了方便自己测试 写成了GET 但是实际项目中 把处理移到POST 

为了防止sql注入 用的Java 提供的PreparedStatement

public boolean isExist() throws SQLException

{

Connection conn=DButil.getConn();

String sql = "select * from user  where UserName=? and PhoneNumber=?";

        PreparedStatement  pstmt = conn.prepareStatement(sql);

        pstmt.setString(1,UserName);

        pstmt.setString(2,PassWord);

  System.out.println(sql);

ResultSet rs = pstmt.executeQuery();

int rowCount = 0;

while(rs.next()) {

rowCount++;

}

rs.close();

pstmt.close();

//stmt.close();

conn.close();

System.out.println(rowCount+"");

if(rowCount==1)

{

return true;

}

return false;

}

上文中只是判断数据库中有没有这条数据而已 一般来说还要解析表的数据返回给前端

在数据库中SQL语句可以写成

select * from user where username='xxxx' and password=md5('xxxx')

如果 用户输入 or 1=1# 密码随便输入 会等价于

select * from users where username='' or 1=1#" and password=md5('xxxx')

#注释掉了后面的 and password=md5('xxxx')语句 因为1=1永远是都是成立的,即where子句总是为真,将该sql进一步简化之后,等价于如下select语句:

select * from users 没错,该sql语句的作用是检索users表中的所有字段

还有更恶意的操作 用户输入any_value' and pw = ''; DROP TABLE users#

等价于

select * from users where username=''any_value' and pw = ''; DROP TABLE users#" and password=md5('xxxx')

虽然第一句sql是不会执行成功  但是第二句太可怕了 。

3 事物的回滚

一般在后端的处理中 这个是经常用到的

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) {

// TODO Auto-generated method stub

Connection conn=DButil.getConn();

String sql = "select * from AbpUsers where UserName=? and PhoneNumber=?";

String UserName=req.getParameter("UserName");

String PassWord=req.getParameter("PassWord");

PreparedStatement pstmt=null;

try {

pstmt = conn.prepareStatement(sql);

pstmt.setString(1,UserName);

pstmt.setString(2,PassWord);

conn.setAutoCommit(false);//开启事务

pstmt.addBatch();

int rowCount= pstmt.executeUpdate(); 

conn.commit();//事务提交

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

    if(pstmt!=null)

    {

    try {

conn.rollback();//回滚

} catch (SQLException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

    }

}

}

这只是在演示写法 一般来说执行两条以上的sql语句 要么全部执行成功 要么全部执行失败

Android 端

private void Login()

{

new Thread(new Runnable() {

@Override

        public void run() {

          String  url="http://xxx.xxx.xxx.xxx:8080/JMZ/Login?UserName=xxx&PassWord=xxxxx";

            String  request=submitGetData(url,new HashMap(),"UTF-8");

            Log.e("request",request);

        }

}).start();

}

记得加上网络权限 下面是Log

05-08 09:53:35.275 7383-7402/? E/返回结果:response=: 200

05-08 09:53:35.276 7383-7402/? E/request: 登录成功

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,624评论 18 399
  • 先创建服务端的APP 1.官网下载Winrun4j。http://winrun4j.sourceforge.net...
    Alex_1799阅读 1,719评论 1 2
  • 一. Java基础部分.................................................
    wy_sure阅读 3,810评论 0 11
  • 本文内容 1.什么是JDBC以及为什么要使用JDBC 2.JDBC核心API的讲解 3.使用JDBC核心API进行...
    Vincilovfang阅读 1,216评论 0 11
  • 教而后学 学而后思 思而后辨 辨而生疑 疑而后究 究而后解 解而后授 授之教也
    东方天朔阅读 191评论 0 2