当前位置: 技术问答>java相关
为什么创建session会出错,实在无能为力,向大家求助!
来源: 互联网 发布时间:2015-11-12
本文导语: 我准备用servlet写一个类似于购物车的程序。在用户通过验证之后,就HttpSession session = request.getSession(true);可是在调试的时候发现一运行到这里就会出错,实在不解......求救! 该段方法如下: private void showMemberConten...
我准备用servlet写一个类似于购物车的程序。在用户通过验证之后,就HttpSession session = request.getSession(true);可是在调试的时候发现一运行到这里就会出错,实在不解......求救!
该段方法如下:
private void showMemberContent(HttpServletRequest request, HttpServletResponse response, PrintWriter out) throws ServletException, IOException {
Connection sqlCon; //数据库连接对象
Statement sqlStmt; //SQL 语句对象
ResultSet sqlRst; //结果集对象
String strSQL; //SQL语句
String errMsg=""; //出错消息
String Name = request.getParameter("Name");
String Password = request.getParameter("Password");
if(Name.length()==0) errMsg+="请输入用户名!
";
if(Password.length()==0) errMsg+="请输入密码!
";
if(errMsg.length()!=0) {
out.println(errMsg);
return;
}
Name = new String(Name.getBytes("ISO8859_1"),"gb2312");
try {
sqlCon = java.sql.DriverManager.getConnection(strCon);
sqlStmt = sqlCon.createStatement();
strSQL = "select UserID from User where Name='"+Name+"' and Password='"+Password+"' and Type=0";
sqlRst = sqlStmt.executeQuery(strSQL);
if(sqlRst.next()) {
//创建session ----这里就会出错,为什么???
HttpSession session = request.getSession(true);
session.setAttribute("UID", new Integer(sqlRst.getInt(1)));
session.setAttribute("UName", new String(Name));
sqlRst.close();
sqlStmt.close();
out.println("登录成功! 欢迎你,"+Name+"
");
out.println("返回首页");
} else {
HttpSession session = request.getSession(false);
if(session!=null) {
session.invalidate();
}
sqlRst.close();
sqlStmt.close();
sqlCon.close();
out.println("用户名、密码错误!n
n");
out.println("返回登录页面!");
}
} catch(Exception e) {
out.println("服务器繁忙,请稍候再试!");
}
}
该段方法如下:
private void showMemberContent(HttpServletRequest request, HttpServletResponse response, PrintWriter out) throws ServletException, IOException {
Connection sqlCon; //数据库连接对象
Statement sqlStmt; //SQL 语句对象
ResultSet sqlRst; //结果集对象
String strSQL; //SQL语句
String errMsg=""; //出错消息
String Name = request.getParameter("Name");
String Password = request.getParameter("Password");
if(Name.length()==0) errMsg+="请输入用户名!
";
if(Password.length()==0) errMsg+="请输入密码!
";
if(errMsg.length()!=0) {
out.println(errMsg);
return;
}
Name = new String(Name.getBytes("ISO8859_1"),"gb2312");
try {
sqlCon = java.sql.DriverManager.getConnection(strCon);
sqlStmt = sqlCon.createStatement();
strSQL = "select UserID from User where Name='"+Name+"' and Password='"+Password+"' and Type=0";
sqlRst = sqlStmt.executeQuery(strSQL);
if(sqlRst.next()) {
//创建session ----这里就会出错,为什么???
HttpSession session = request.getSession(true);
session.setAttribute("UID", new Integer(sqlRst.getInt(1)));
session.setAttribute("UName", new String(Name));
sqlRst.close();
sqlStmt.close();
out.println("登录成功! 欢迎你,"+Name+"
");
out.println("返回首页");
} else {
HttpSession session = request.getSession(false);
if(session!=null) {
session.invalidate();
}
sqlRst.close();
sqlStmt.close();
sqlCon.close();
out.println("用户名、密码错误!n
n");
out.println("返回登录页面!");
}
} catch(Exception e) {
out.println("服务器繁忙,请稍候再试!");
}
}
|
可以呀,我用MySQL时把字段中的可能的单引号用两个单引号替换就可以啦。
用户名:随便
密码:1' or '2'='2
比如对这个密码:替换后为1'' or ''2''=''2
这样它就不能破坏你的SQL语句啦。
用户名:随便
密码:1' or '2'='2
比如对这个密码:替换后为1'' or ''2''=''2
这样它就不能破坏你的SQL语句啦。
|
大哥,你写的SQL语句有问题。不信你用以下用户名、密码试试:
用户名:随便
密码:1' or '2'='2
^_^
用户名:随便
密码:1' or '2'='2
^_^
|
加个过滤就行了,目的是让它不能破坏你的SQL语句,至于具体怎么做方法就很多了。比如给单引号加上转义符,或者是在两个SQL中写验证。等等......
|
session.setAttribute("UID", new Integer(sqlRst.getInt(1)));
改为:
session.setAttribute("UID", sqlRst.getInt(1).toString());
改为:
session.setAttribute("UID", sqlRst.getInt(1).toString());