美文网首页
Android对接Java后端

Android对接Java后端

作者: 山林小猎人_ | 来源:发表于2018-05-08 11:10 被阅读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: 登录成功

    相关文章

      网友评论

          本文标题:Android对接Java后端

          本文链接:https://www.haomeiwen.com/subject/zfdirftx.html