2009-02-26 38 views
5

Tôi có hai hệ thống mà tôi đang cố gắng tích hợp. Một được xây dựng trên các servlet thô, cái mới được xây dựng trên JSF với IceFaces. Tôi đang cố gắng tạo thuận lợi cho việc đăng nhập hệ thống chéo. Ý tưởng là tôi có một nút trong hệ thống cũ POST các thông tin thích hợp cho trang web mới và đăng nhập chúng.Tạo bối cảnh khuôn mặt theo cách thủ công

Tốt, lý tưởng, tôi muốn sử dụng một servlet cũ thông thường để tạo điều kiện thuận lợi trên trang web mới. Đi đến Servlet của trang mới, thực hiện những gì cần làm và tiến lên bảng điều khiển.

Bảo mật của chúng tôi được xử lý qua bean được quản lý. Tuy nhiên, khi bạn đến Servlet, không có bối cảnh khuôn mặt. Vì vậy, làm thế nào tôi sẽ tạo ra một bối cảnh khuôn mặt mới?

Tôi có một kế hoạch dự phòng để luôn có thể liên kết đến trang giả. Tạo trang FacesContext cho tôi và sau đó tạo một bean sao lưu sẽ thực hiện công việc khi nó được instanciated và sau đó chuyển tiếp lên trang chính . Nhưng điều này cảm thấy rất giống một hack.

Mọi trợ giúp sẽ được đánh giá cao!

CHỈNH SỬA: Tôi đã thực hiện theo cách sao lưu. Về cơ bản, tôi đăng bài lên trang như vậy:

<f:view> 
    <ice:outputText value="#{EntryPoint}"/> 
</f:view 

bean ủng hộ trông như vậy ...

public EntryPoint() { 
     try { 
     HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
     HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
     String loginID = request.getParameter("loginID"); 
     //Do some code to load the user/permissions 
     response.sendRedirect(
      //The appropriate page 
     ); 
     } catch (IOException ex) { 
     logger.error(null, ex); 
     } catch (SQLException ex) { 
     logger.error(null, ex); 
     } 
    } 

này vẫn cảm thấy giống như một hack, nhưng tôi không chắc chắn làm thế nào để có được xung quanh điều này. Lý tưởng nhất, tôi muốn POST đến một servlet, lấy loginID, xây dựng người dùng và đưa nó trực tiếp vào bean được quản lý. Tuy nhiên, FacesContext không tồn tại tại thời điểm đó.

Bất kỳ ý tưởng nào khác?

Trả lời

4

Tôi không chắc chắn ý bạn là gì bởi "trang web" trong ngữ cảnh này.

Một vài lưu ý:

  • đậu Managed sẽ không bao giờ được cung cấp bên ngoài ứng dụng web (WAR), trong đó chúng được định nghĩa.
  • Các cá thể đối tượng FacesContext cuối cùng được tạo và xử lý bởi FacesServlet.service, vì vậy các yêu cầu phải đi qua servlet này. Việc cố gắng tạo ngữ cảnh trong các trường hợp khác có thể dẫn đến hành vi không xác định.

Mang ý nghĩ đó, bạn có thể tạo ra một chuỗi yêu cầu như thế này:

FacesServlet (mapping: /faces/*) 
-> /faces/jsfPage.jsp (a JSP with JSF controls) 
    -> DispatchBean (calls ExternalContext.dispatch("/AnotherServlet") 
     -> AnotherServlet 

jsfPage.jsp chứa:

<f:view> 
    <h:outputText value="#{dispatchBean.dispatch}" /> 
</f:view> 

Các "công văn" bất động sản giải quyết đến một phương pháp đậu "getDispatch":

public String getDispatch() { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    try { 
     context.getExternalContext().dispatch("/FacesClientServlet"); 
    } catch (IOException e) { 
     throw new FacesException(e); 
    } 
    return null; 
} 

Những công văn đến servlet này:

public class FacesClientServlet extends javax.servlet.http.HttpServlet 
     implements javax.servlet.Servlet { 

    static final long serialVersionUID = 1L; 

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

     FacesContext context = FacesContext.getCurrentInstance(); 
     ELContext elContext = context.getELContext(); 
     ExpressionFactory expressionFactory = context.getApplication() 
       .getExpressionFactory(); 
     ValueExpression expression = expressionFactory.createValueExpression(
       elContext, "#{myBean.text}", Object.class); 
     Object value = expression.getValue(elContext); 

     ResponseWriter writer = context.getResponseWriter(); 
     writer.write("" + value); 

    } 

} 

nào phát ra các giá trị từ một bean được quản lý "myBean":

public class MyBean { 

    private final String text = "Hello, World!"; 

    public String getText() { 
     return text; 
    } 

} 

Điều này rất phức tạp và tôi sẽ không sẵn lòng làm bất cứ điều gì.


Một thay thế, có thể đi kèm với hậu quả của riêng mình, là tạo ra bối cảnh riêng của bạn như thế này:

public class ContextServlet extends javax.servlet.http.HttpServlet implements 
     javax.servlet.Servlet { 
    static final long serialVersionUID = 1L; 

    private FacesContextFactory facesContextFactory; 
    private Lifecycle lifecycle; 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     super.init(config); 

     LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder 
       .getFactory(FactoryFinder.LIFECYCLE_FACTORY); 
     facesContextFactory = (FacesContextFactory) FactoryFinder 
       .getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); 
     lifecycle = lifecycleFactory 
       .getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE); 
    } 

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

     FacesContext context = facesContextFactory.getFacesContext(
       getServletContext(), request, response, lifecycle); 
     try { 
      ELContext elContext = context.getELContext(); 
      ExpressionFactory expressionFactory = context.getApplication() 
        .getExpressionFactory(); 
      ValueExpression expression = expressionFactory 
        .createValueExpression(elContext, "#{myBean.text}", 
          Object.class); 
      Object value = expression.getValue(elContext); 

      PrintWriter pw = response.getWriter(); 
      try { 
       pw.write("" + value); 
      } finally { 
       pw.close(); 
      } 
     } finally { 
      context.release(); 
     } 
    } 

} 

Một lần nữa, tôi sẽ tránh phương pháp này nếu có thể.

+0

Câu hỏi thứ hai là câu trả lời tôi đang tìm kiếm và câu đầu tiên là kế hoạch dự phòng của tôi nếu tôi không thể tìm ra câu trả lời đầu tiên. Ý tưởng là trang web Servlet kế thừa (tệp webapp và tệp WAR riêng) sẽ chuyển hướng người dùng bằng POST và thông tin đăng nhập tới webapp mới. Có cách nào tốt hơn để làm điều này? – Drew

Các vấn đề liên quan