我使用prepareStatement()
来防止sql注入。现在我遇到的问题是,使用下面的方法,我可以执行getConnection().prepareStatement()
然后构建我的查询,但是我需要尝试-捕捉对getConnection()
的每一个调用并在finally
块中关闭它。createStatement().execute()
似乎更好一些,因为我可以让客户端传入查询,然后在一个地方处理尝试捕获,但这不会阻止sql注入。通常最好的做法是什么?或者是否有其他方法可以阻止sql注入来构建查询?
private static Connection getConnection() throws SQLException, URISyntaxException {
URI dbUri = new URI(System.getenv("DATABASE_URL"));
String username = dbUri.getUserInfo().split(":")[0];
String password = dbUri.getUserInfo().split(":")[1];
String dbUrl = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath();
return DriverManager.getConnection(dbUrl, username, password);
}
发布于 2017-08-08 11:14:00
我将使用连接池,而不是每次创建和关闭连接。
使用tomcat服务器创建连接池应遵循的几个步骤
步骤-1.使用数据库连接详细信息更新TOMCAT_ROOT_DIR\conf\server.xml文件,如下所示:
<?xml version='1.0' encoding='utf-8'?>
...
<GlobalNamingResources>
...
<Resource name="jdbc/JCGExampleDB"
global="jdbc/JCGExampleDB"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
auth="Container"
type="javax.sql.DataSource"
username="test"
password="test"
driverClassName="com.mysql.jdbc.Driver"
description="JCG Example MySQL database."
url="jdbc:mysql://localhost:3306/JCGExampleDB"
maxTotal="10"
maxIdle="10"
maxWaitMillis="10000"
removeAbandonedTimeout="300"
defaultAutoCommit="true" />
...
</GlobalNamingResources>
步骤2:使用的JdbcTemplate -您可以编写数据库连接实用程序类并获得如下所示的连接(这个步骤可以通过多种方式完成)。类似于context.xml文件或web.xml文件或如下所示)
@Bean
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource());
}
@Bean
public DataSource dataSource() {
DataSource dataSource = new com.mchange.v2.c3p0.ComboPooledDataSource();
try {
JndiTemplate jndiTemplate = new JndiTemplate();
dataSource = (DataSource)jndiTemplate.lookup("java:comp/env/jdbc/JCGExampleDB");
} catch (NamingException e) {
log.error("Unable to configure datasource: " + e.getStackTrace());
}
return dataSource;
}
Edit1:使用单例类-没有JdbcTemplate:您可以在需要时从Singleton类获得连接。
public class DatabaseConnectionManager {
DataSource ds;
public void init() {
InitialContext initialContext = new InitialContext();
ds = (javax.sql.DataSource)initialContext.lookup("jdbc/JCGExampleDB");
}
public Connection getConnection() {
if(ds == null) init();
return ds.getConnection();
}
}
希望这能帮上忙。
https://stackoverflow.com/questions/45576021
复制相似问题