【问题标题】:Why would connecting to a MySQL database from Java get denied access?为什么从 Java 连接到 MySQL 数据库会被拒绝访问?
【发布时间】:2015-11-13 14:29:16
【问题描述】:

我正在尝试从 Java 连接到 MySQL,但出现以下错误。

java.sql.SQLException: 用户 'root'@'localhost' 的访问被拒绝(使用密码:YES) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:951) 在 com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1717) 在 com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1276) 在 com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2395) 在 com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2428) 在 com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2213) 在 com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:797) 在 com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(未知来源) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(未知来源) 在 java.lang.reflect.Constructor.newInstance(未知来源) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:389) 在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) 在 java.sql.DriverManager.getConnection(未知来源) 在 java.sql.DriverManager.getConnection(未知来源) 在 com.javawebtutor.jsf.LoginBean.dbData(LoginBean.java:63) 在 com.javawebtutor.jsf.LoginBean.checkValidUser(LoginBean.java:80) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.apache.el.parser.AstValue.invoke(AstValue.java:278) 在 org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:273) 在 org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:70) 在 javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) 在 com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 在 javax.faces.component.UICommand.broadcast(UICommand.java:315) 在 javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 在 javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 在 com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 在 com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 在 com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 在 javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) 在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2522) 在 org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2511) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(未知来源) 进程中出现异常:java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)"

感谢您的所有帮助,我对此很陌生。我很肯定密码和用户名是正确的,所以我不确定从这里去哪里。这是我连接数据库的代码:

package com.javawebtutor.jsf;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;


@ManagedBean(name="loginBean")
@SessionScoped
public class LoginBean {
private String userName;
private String password;
private String dbuserName;

private String dbpassword;
Connection connection;
Statement statement;
ResultSet resultSet;
String SQL;


public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getDbuserName() {
    return dbuserName;
}

public void setDbuserName(String dbuserName) {
    this.dbuserName = dbuserName;
}

public String getDbpassword() {
    return dbpassword;
}

public void setDbpassword(String dbpassword) {
    this.dbpassword = dbpassword;
}

public void dbData(String userName)
{
    Connection con = null;
    String conUrl = "jdbc:mysql://localhost:3306/test; user=root; password=pass;";
    try
    {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection(conUrl);
        //connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",user = "root","pass");
        statement = connection.createStatement();
        SQL = "Select * from USER_DETAIL where username like ('" + userName +"')";
        resultSet = statement.executeQuery(SQL);
        resultSet.next();
        dbuserName = resultSet.getString(1).toString();
        dbpassword = resultSet.getString(2).toString();
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
        System.out.println("Exception Occured in the process :" + ex);
    }
}

public String checkValidUser()
{
    dbData(userName);

    if(userName.equalsIgnoreCase(dbuserName))
    {

        if(password.equals(dbpassword))
            return "success";
        else
        {
            return "failure";
        }
    }
    else
    {
        return "failure";
    }
}
}

【问题讨论】:

  • 您使用的是哪个 DBMS?您已标记 mysql 和 sql server。你的标题说MySql,问题说sql server。它们不是一回事。
  • 抱歉,我使用的是 MySQL Workbench 和 MySQL Server 5.7。
  • 附带说明,您确实不应该以纯文本形式存储密码。它们应该加盐和散列。您还应该参数化您的查询以避免 sql 注入。
  • 你认为这是我问题的根源吗?
  • 不,正如我所说,这是一个旁注。这是您需要解决的问题,但不会影响您的连接。您正在获得拒绝访问。我不是 MySQL 人(我使用 sql server),但听起来用户无权连接到数据库。

标签: java mysql mysql-connector


【解决方案1】:

在 MySQL 服务器管理中,用户是 specified with both allowable hostnames and passwords。如果root 用户未设置为包含localhsot 作为客户端,它将拒绝在本地计算机上登录。有关详细信息,请参阅this question and its accepted answer

【讨论】:

  • 哦,我明白了,你会碰巧知道如何包含本地主机吗?
【解决方案2】:

你可以这样试试

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","pass");

因为 getConnection 函数需要 3 个参数:url+dbname 、用户名、密码。

【讨论】:

  • 不幸的是仍然没有运气。
  • mysql -u root -p pass : 你能从终端发出这个命令并告诉你是否能够登录到 mysql 吗?
  • 它提示我输入密码,我输入我的密码,然后它显示错误 1049 (42000): Unknown database '密码输入' '密码输入' 是我输入的密码,而不是实际密码说。
  • 我切换到另一个数据库并通过终端进入,我也在我的代码中切换了哪个数据库,但仍然没有运气。
【解决方案3】:

您的密码似乎错误。

您可以尝试使用下面给出的空密码。

String conUrl = "jdbc:mysql://localhost:3306/test; user=root; password=;";

【讨论】:

    猜你喜欢
    • 2015-06-21
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多