Android对接Java后端

2018-05-08  本文已影响0人  山林小猎人_

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

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: 登录成功

上一篇下一篇

猜你喜欢

热点阅读