关键代码如下:
String id =request.getParameter("id");
String password = request.getParameter("password");
Connection connection=null; PreparedStatement pStatement=null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("load Driver successfully");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","58546494"); String url="select * from users where id=? and passwd=?"; // jdbc:mysql://localhost:端口号/数据库名称","用户名","密码" pStatement=connection.prepareStatement(url); pStatement.setObject(1, id); pStatement.setString(2, password); rs=pStatement.executeQuery(); if(rs.next()){ request.getRequestDispatcher("/MainFrame").forward(request, response); System.out.println(id);数据库中的ID为整型,我传入其他类型服务器端不报错,重要的是ID只要前边的匹配了密码正确,就可以登陆成功,比如ID=1,密码=123,在界面输入ID 1SAFHj 这也可以登陆成功
/**
The JDBC specification specifies a standard mapping from
* Java Object
types to SQL types. The given argument
* will be converted to the corresponding SQL type before being
* sent to the database.
*/
这是javadoc文档中对于void setObject(int parameterIndex, Object x) throws SQLException;的部分注释
JDBC规格指定了一个从Java Object类型到SQL类型的标准映射。指定的协议在发送给数据库之前可能被更改去响应SQL中的类型。
所以你的用户名最后是传到的不一定就是你写的值。至于其他的更详细的内容你可以把setObject方法的注释都看完,我在这只说重要的部分
放着void setInt(int parameterIndex, int x) throws SQLException;方法不用何必要为难自己呢
博主解决了吗,我也想知道是什么原因。
setObject通用,传值得时候,可以声明Object[] 数组
for(int i=0;i<params.length;i++){
pstmt.setObject(i+1, params[i]);
}
对于你的这个问题, 你可以试着把String id ,
使用Integer.parseInt(id)或者Integer.valueOf(id)转化为整数型然后对占位符进行赋值
我也想知道是怎么解决的
setObject 方法,只是把你传入的值进行了匹配你看看源码就知道了,至于你为什么直接能跳过肯定不是这个方法的问题,你可以调试,你看看你的代码执行完查询后倒地给你返回了什么集合。
public void setObject(int parameterIndex, Object parameterObj)
/* */ throws SQLException
/* */ {
/* 3521 */ if (parameterObj == null) {
/* 3522 */ setNull(parameterIndex, 1111);
/* */ }
/* 3524 */ else if ((parameterObj instanceof Byte)) {
/* 3525 */ setInt(parameterIndex, ((Byte)parameterObj).intValue());
/* 3526 */ } else if ((parameterObj instanceof String)) {
/* 3527 */ setString(parameterIndex, (String)parameterObj);
/* 3528 */ } else if ((parameterObj instanceof BigDecimal)) {
/* 3529 */ setBigDecimal(parameterIndex, (BigDecimal)parameterObj);
/* 3530 */ } else if ((parameterObj instanceof Short)) {
/* 3531 */ setShort(parameterIndex, ((Short)parameterObj).shortValue());
/* 3532 */ } else if ((parameterObj instanceof Integer)) {
/* 3533 */ setInt(parameterIndex, ((Integer)parameterObj).intValue());
/* 3534 */ } else if ((parameterObj instanceof Long)) {
/* 3535 */ setLong(parameterIndex, ((Long)parameterObj).longValue());
/* 3536 */ } else if ((parameterObj instanceof Float)) {
/* 3537 */ setFloat(parameterIndex, ((Float)parameterObj).floatValue());
/* 3538 */ } else if ((parameterObj instanceof Double)) {
/* 3539 */ setDouble(parameterIndex, ((Double)parameterObj).doubleValue());
/* 3540 */ } else if ((parameterObj instanceof byte[])) {
/* 3541 */ setBytes(parameterIndex, (byte[])parameterObj);
/* 3542 */ } else if ((parameterObj instanceof java.sql.Date)) {
/* 3543 */ setDate(parameterIndex, (java.sql.Date)parameterObj);
/* 3544 */ } else if ((parameterObj instanceof Time)) {
/* 3545 */ setTime(parameterIndex, (Time)parameterObj);
/* 3546 */ } else if ((parameterObj instanceof Timestamp)) {
/* 3547 */ setTimestamp(parameterIndex, (Timestamp)parameterObj);
/* 3548 */ } else if ((parameterObj instanceof Boolean)) {
/* 3549 */ setBoolean(parameterIndex, ((Boolean)parameterObj).booleanValue());
/* */ }
/* 3551 */ else if ((parameterObj instanceof InputStream)) {
/* 3552 */ setBinaryStream(parameterIndex, (InputStream)parameterObj, -1);
/* 3553 */ } else if ((parameterObj instanceof Blob)) {
/* 3554 */ setBlob(parameterIndex, (Blob)parameterObj);
/* 3555 */ } else if ((parameterObj instanceof Clob)) {
/* 3556 */ setClob(parameterIndex, (Clob)parameterObj);
/* 3557 */ } else if ((connection.getTreatUtilDateAsTimestamp()) && ((parameterObj instanceof java.util.Date)))
/* */ {
/* 3559 */ setTimestamp(parameterIndex, new Timestamp(((java.util.Date)parameterObj).getTime()));
/* */ }
/* 3561 */ else if ((parameterObj instanceof BigInteger)) {
/* 3562 */ setString(parameterIndex, parameterObj.toString());
/* */ } else {
/* 3564 */ setSerializableObject(parameterIndex, parameterObj);
/* */ }
/* */ }
一般这种登录不是这样写的,一般是先在前端把密码直接加密掉,然后再去查,再严谨的是把查到的结果和页面传来的再去比对一次