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