문제

나는 다른 "비즈니스"에 해당하는 여러 데이터베이스 (모두 구조적으로 동일)의 정보를 관리하는 Java Servlet 웹 응용 프로그램을 개발하고 있습니다. 사용자는 세션에 저장된 "현재 비즈니스"를 선택하고 응용 프로그램은 해당 "현재 비즈니스"를 표시하거나 수정할 수 있습니다.

JNDI를 사용하여 이러한 비즈니스에 액세스 할 수있는 역동적 인 방법으로 Tomcat 리소스를 사용하고 싶습니다. 이런 식으로 서블릿에서 JSTL SQL 태그 또는 컨텍스트 조회를 사용할 수 있습니다. SQL 테이블에 저장되므로 Web.xml 파일에서 각 리소스를 정의 할 수 없습니다. 최종 결과는 이와 같은 라인이있는 간단한 JSP를 쓸 수 있어야합니다.

<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %>

<sql:query var = "users" dataSource="sources/${sessionScope.currentBusiness}">
  select id, firstName, lastName FROM user
</sql:query>

또는 이와 같은 선을 가질 수있는 서블릿

String request.getSession().getAttribute("currentBusiness");

Context initial = new InitialContext();
Context context = (Context) initial.lookup("java:comp/env");
DataSource source = (DataSource) context.lookup("sources/" + currentBusiness);

"현재 비즈니스"에 대한 올바른 데이터 소스를 얻을 수있는 곳.

나는 성공하지 않고 javax.naming.spi.objectfactory에서 파생 된 내 자신의 ObjectFactories를 쓰는 것을 실험했습니다. 쉽게 수행하는 방법에 대한 조언이 있습니까?

도움이 되었습니까?

해결책

나는 마침내 세션 리스트너와 다음과 같이 작동하는 서블릿으로 구성된 다음 솔루션을 해결했습니다. SessionListener는 다음과 같은 형식을 가지고 있습니다.

public class SessionListener implements HttpSessionListener {

  public void sessionCreated(HttpSessionEvent event) {

    HttpSession session = event.getSession();

    // get list of possible data sources available to this session
    List<DataSource> sources = new ArrayList<DataSource>();
    ... code to get the available sources

    // get the current data source
    DataSource source = null;
    ... code to get the current source                               
    source = sources.get(0); // for example

    // setup the session attributes
    session.setAttribute("availableSources", sources);
    session.setAttribute("currentSource", source); 

  }

}

사용자가 로그인하고 세션이 생성 될 때마다 사용 가능한 데이터 소스 목록 및 현재 중 현재 목록이 세션에 배치됩니다. 데이터 소스는 사용자 로그인에 의존하기 때문에 세션 수준에서 수행됩니다. 이제 응용 프로그램 내에서 액세스 할 수 있습니다. 현재 데이터 소스를 변경하려면이 단순화 된 버전으로 서블릿을 만들었습니다.

public abstract class BoxletServlet extends HttpServlet {

  protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException {

    HttpSession session = request.getSession(true);
    String s = request.getParameter("source");

    // based on 's' choose from the available DataSource
    List<DataSource> sources = (List<DataSource>) session.getParameter("availableSources");
    Source source = chooseFrom(sources, s);                                                       
    session.setParameter("currentSource", source);          

    // forward to a page saying that the DataSource changed

  }

}

이 구현을 사용하면 다음 JSP를 만들 수 있습니다.

<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql" %>

<sql:query var = "users" dataSource="${sessionScope.currentSource}">
  select id, firstName, lastName FROM user
</sql:query>

다른 사람을 돕기를 바랍니다.

다른 팁

a에서 데이터 소스를 만듭니다 ServletContextListener 그리고 그것들을 ServletContext.

이 접근법은 확실히 "작동"할 것이지만, 각 비즈니스에 대한 별도의 동일한 데이터베이스의 개념은 나에게 잘못된 것 같습니다. 스키마 어딘가에서 비즈니스를 묘사 할 수있는 것은 분명히 가능해 보입니다. 이 방법을 분리하려면 비즈니스 당 새 데이터베이스가 필요하므로 스키마에는 새로운 비즈니스 식별자 만 필요합니다.

또한 별도의 데이터베이스에서 ETL 데이터를 임시보고 및 쿼리를 위해 차원 큐브로 ETL 데이터를 차원의 큐브로 ETL로 수행하지 않는 한 모든 간부 비즈니스 데이터 마이닝 가능성이 손실된다고 주장합니다.

그리고 JSTLu003Csql> 태그는 가장 간단한 웹 앱에서만 사용해야합니다. 중간 계층에서 검증을 포기할 때 SQL 주입 공격의 가능성에 열려 있습니다.

업데이트:

Web.xml Afaik에서 리소스를 선언해야하므로 새 데이터베이스가있을 때마다 응용 프로그램을 중지하고 새 JNDI 소스를 구성하고 Tomcat을 다시 시작해야합니다. 새로운 비즈니스/데이터베이스를 추가 할 때마다 모든 이전 클라이언트가 앱이 다운되어 영향을 받기 때문에 클러스터링되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top