2

我正在尝试从数据库中获取记录。但我面临这个访问被拒绝的问题。我尝试了 Stack Overflow 上提到的其他解决方案,比如向用户授予权限......但没有一个奏效。

访问数据库的代码:

public void service(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException{
  response.setContentType("text/html");
  PrintWriter out = response.getWriter();
  out.println("<html>");
  out.println("<head><title>Servlet JDBC</title></head>");
  out.println("<body>");
  out.println("<h1>Servlet JDBC</h1>");
  out.println("</body></html>");  
  // connecting to database
  Connection con = null;  
  Statement stmt = null;
  ResultSet rs = null;
  try {
      Class.forName("com.mysql.jdbc.Driver");
      con = DriverManager.getConnection("jdbc:mysql://localhost:3306/employees","root","root");
      stmt = con.createStatement();
      rs = stmt.executeQuery("SELECT * FROM employee");
      // displaying records
      while(rs.next()){
      out.print(rs.getObject(1).toString());
      out.print("\t\t\t");
      out.print(rs.getObject(2).toString());
      out.print("<br>");
  }
  } catch (SQLException e) {
      throw new ServletException("Servlet Could not display records.", e);
  } catch (ClassNotFoundException e) {
      throw new ServletException("JDBC Driver not found.", e);
  } finally {
      try {
          if(rs != null) {
              rs.close();
              rs = null;
          }
          if(stmt != null) {
              stmt.close();
              stmt = null;
          }
          if(con != null) {
              con.close();
              con = null;
          }
      } catch (SQLException e) {}
  }
    out.close();
  }

错误的堆栈跟踪:

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
    com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078)
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187)
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:927)
    com.mysql.jdbc.MysqlIO.secureAuth411(MysqlIO.java:4686)
    com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1304)
    com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2483)
    com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2516)
    com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2301)
    com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834)
    com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    java.lang.reflect.Constructor.newInstance(Unknown Source)
    com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416)
    com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:346)
    java.sql.DriverManager.getConnection(Unknown Source)
    java.sql.DriverManager.getConnection(Unknown Source)
    WebAppAss.DatabaseAccess.service(DatabaseAccess.java:36)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

在这种情况下可能是什么问题。我尝试创建一个新数据库,但也没有用。

4

3 回答 3

4

在控制台中启动 mysql 客户端并执行以下查询:select Host, User from mysql.user;. 你必须有这样的一行:

+----------------+------------------+  
| 主持人 | 用户 |  
+----------------+------------------+  
| 本地主机 | 根 |
+----------------+------------------+  

一行在Host中带有“localhost”,在User中带有“root” 。如果你没有它,那是你的问题的原因(如果你在User有其他带有“root”的行并不重要)

如果您没有这样的行,请添加一个新用户:

CREATE USER 'appUser'@'localhost' IDENTIFIED BY 'appPassword';

如果需要,将 'appUser' 更改为 'root',但我强烈建议使用其他用户。然后通过在 mysql 客户端中执行此命令为您的新用户添加权限:

GRANT ALL PRIVILEGES ON employees.* TO 'appUser'@'localhost';

(再次,如果需要,将 'appUser' 更改为 'root')

于 2013-07-28T12:53:21.880 回答
1

试试看:

mysql --no-defaults --force --user=root --host=localhost --database=mysql 

更改新密码:

UPDATE user SET Password=PASSWORD('NEWPASSWORD') where USER='root';
FLUSH PRIVILEGES;
于 2014-02-21T17:10:39.263 回答
1

问题是授予information.schema表中 root 的权限。'root'@'%' 没有任何权限.. 因为我127.0.0.1用作我的连接地址,所以它给出了拒绝访问错误..%是一个 IP 地址的通配符。所以mysql认为root@127.0.0.1任何其他IP地址但不是localhost。所以只是授予它权限解决了我的问题..尝试使用一些Mysql客户端SQLYog等..授予权限很容易,也可以与用户一起查看权限。

于 2013-07-28T19:26:28.133 回答