【问题标题】:database setting when deployed war file部署war文件时的数据库设置
【发布时间】:2012-06-11 07:07:42
【问题描述】:

我在 jsp 中完成了一个项目。我对整个项目进行了战争。当我将此战争部署到另一台机器时,它给出了登录失败的错误,cz 我的数据库(sql server 2005)用户名和密码(现在是jsp 文件中的硬编码使用)与另一台机器不同。 我想要一些技巧,让我的项目可以在任何机器上运行而不会产生连接问题。 cz 我想在我的项目中制作这样的软件,它将分发到许多机器上。所以在这种情况下,不应该出现这种连接问题 请帮助我。

【问题讨论】:

    标签: jsp


    【解决方案1】:

    不仅仅是凭据。您不应该对任何数据库属性进行硬编码。 JavaEE 提供了在运行时配置数据源的绝妙方法:

    • 如果您使用的是Servlet 3.0 Container,您可以在web.xml中配置数据源属性并使用数据源
    • 您可以在应用程序中查找具有给定名称的数据源资源并绑定所需的数据源。如果定义了资源注解,也可以让 Servlet Container 注入数据源。

    【讨论】:

    • 嗨拉梅什!你是什​​么类型的数据源?它是一个类,是一些属性还是..?你能提供一些文件吗?
    【解决方案2】:

    当然,您不能在网络应用中存储硬编码凭据。

    因此,您必须将它们存储在外部,在您部署的服务器上。

    在特定容器功能(如数据源)之外,您可以:

    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>
    

    【讨论】:

    • 没看懂,能不能分步解释一下
    • 你能提供一些关于数据源的文档吗?
    【解决方案3】:

    答案是不要将用户名和密码(或者任何类似的配置细节)硬编码到 jsp 文件中。

    你需要外部化连接细节,最好是在war文件之外,这样你就可以将相同的war部署到不同的环境中)

    您应该将连接详细信息放在属性文件中并从中读取。然后,您可以配置您的构建过程为每个环境构建不同的战争 - 或者构建一个战争并为每个部署解包并覆盖连接属性然后重新打包战争。根据您的网络服务器,还有其他选项。

    您在什么环境中运行它 - Tomcat?老板?

    【讨论】:

    • 如何构建war文件?
    【解决方案4】:

    您可以在 xml 文件中配置与数据库相关的凭据,而不是硬编码,然后在部署时您可以在 xml 文件中进行更改。其他技巧是您可以使用属性文件,并且可以完成同样的事情。

    您可以通过其他方式定义数据源,然后您可以使用数据源查找并获取连接。

    所以最后这取决于您的要求,然后您可以在此基础上提供解决方案。

    【讨论】:

    • 是的,但每当我将这个软件交给另一个人时,每次我必须更改那个 xml 或属性文件时,我都不想这样做
    • 您能提供一些有关数据源的文档吗?
    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 2014-12-23
    • 2019-05-19
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多