我在jsp中做了一个项目。我对整个项目进行了战争。当我将这场战争部署到另一台机器上时,它给出了登录失败的错误,cz我的数据库(sql server 2005)用户名和密码(现在是硬编码使用在 jsp 文件中)与另一台机器不同。我想要一些技巧,让我的项目可以在任何机器上运行而不会产生连接问题。cz我想在我的项目中制作这样的软件,它将分发到许多机器上。所以在这种情况下,这个连接问题不应该发生,请帮助我。
4 回答
当然,您不能在您的网络应用程序中存储硬编码凭据。
因此,您必须将它们存储在您部署的服务器上。
在数据源等特定容器功能之外,您可以:
1)使用java Preferences,但是它们有很多错误,特别是如果在linux上使用tomcat,我不会考虑它们(我做了,我清理了)
2)将连接属性放在外部文件中。这是我的做法:
我的 WEB-INF 目录中有一个文本文件,列出了这些属性的所有授权位置。此文件按原样部署在所有服务器上。这是一个例子:
# This file lists all the locations where mysoft will look for
# an XML config file when starting.
# It's recommended to use links to simplify parameterization but
# it's also possible to enrich this file.
# standard windows locations
c:\mycomp\mysoft\config\config.xml
d:\mycomp\mysoft\config\config.xml
# standard linux location
/var/lib/mycomp/mysoft/config/config.xml
而我的 webapp 只是在初始化时选择第一个找到的文件。为此,我实现了一个 ServletContextListener,我在其中读取文本文件并存储配置。
这是我的听众的一个非常简化的版本:
public class MySoftServletContextListener implements ServletContextListener {
public final static String CONFIG_LIST_PATH = "/WEB-INF/config-paths.txt";
@Override
public void contextInitialized(ServletContextEvent contextEvent) {
InputStream list = context.getResourceAsStream(WORLD_LIST_PATH);
try {
BufferedReader listReader = new BufferedReader(new InputStreamReader(list));
String line;
while ((line=listReader.readLine())!=null) {
if (line.length()<4 || line.charAt(0)=='#') continue;
File file = new File(line);
if (file.exists()) {
// log config from the file and, for example, store it in a singleton
break;
} else {
log.info("No config in file " + line + " (file doesn't exist)");
}
}
list.close();
} catch (IOException e) {
e.printStackTrace();
log.severe("Error while looking for a config : " + e.toString());
}
}
}
servlet 上下文侦听器在我的 web.xml 中引用,如下所示:
<listener>
<listener-class>com.mycomp.mysoft.webapp.MySoftServletContextListener</listener-class>
</listener>
Not just credentials. You should not hardcode any database properties. JavaEE provides wonderful ways to configure the datasource at runtime:
- If you are using Servlet 3.0 Container, you can configure the datasource properties in web.xml and use the datasource
- You can lookup datasource resource with a given name in the application and bind your required datasource . You can also let Servlet Container inject the datasource if you define a resource annotation.
您可以在 xml 文件中配置与数据库相关的凭据,而不是硬编码,然后在部署时您可以在 xml 文件中进行更改。其他技巧是您可以使用属性文件,并且可以完成同样的事情。
您可以通过其他方式定义数据源,然后您可以使用数据源查找并获取连接。
所以最后这取决于你的要求是什么,然后你可以在此基础上提供解决方案。
答案是不要将用户名和密码(或者任何类似的配置细节)硬编码到 jsp 文件中。
您需要将连接详细信息外部化,最好在 war 文件之外,以便您可以将相同的战争部署到不同的环境)
您应该将连接详细信息放在属性文件中并从中读取。然后,您可以配置您的构建过程为每个环境构建不同的战争 - 或者构建一个战争并为每个部署解包并覆盖连接属性然后重新打包战争。根据您的 Web 服务器,还有其他选项。
您在什么环境中运行它 - Tomcat?老板?