2009-02-26 12 views
5

मेरे पास दो सिस्टम हैं जिन्हें मैं एकीकृत करने की कोशिश कर रहा हूं। एक कच्चे servlets पर बनाया गया है, नया एक जेएसएफ पर IceFaces के साथ बनाया गया है। मैं क्रॉस-सिस्टम साइन ऑन को सुविधाजनक बनाने की कोशिश कर रहा हूं। विचार यह है कि मेरे पास पुरानी प्रणाली में एक बटन है जो उचित जानकारी को नई साइट पर पोस्ट करता है और उन्हें लॉग ऑन करता है।मैन्युअल रूप से एक फेस कॉन्टेक्स्ट उत्पन्न करना

अच्छा, आदर्श रूप में, मैं नई साइट पर सुविधाजनक बनाने के लिए केवल एक नियमित पुरानी सर्वलेट का उपयोग करना चाहता हूं। नई साइट के सर्वलेट पर जाएं, इसे करने की ज़रूरत है और डैशबोर्ड पर आगे बढ़ें।

हमारी सुरक्षा एक प्रबंधित बीन के माध्यम से संभाली जाती है। हालांकि, जब तक आप सर्वलेट में जाते हैं, तब तक कोई चेहरे का संदर्भ नहीं होता है। तो, मैं एक नया चेहरा संदर्भ कैसे बनाऊंगा?

मेरे पास एक बैक अप प्लान है जिसमें मैं हमेशा एक डमी से लिंक कर सकता हूं। फीस पेज जो मेरे लिए फेस कॉन्टेक्स्ट बनाएगा और उसके बाद एक बैकिंग बीन तैयार करेगा जो इसे तब तक करेगा जब इसे इंस्टेंट किया जाएगा और फिर मुख्य पृष्ठ पर अग्रेषित किया जाएगा । लेकिन यह एक हैक की तरह बहुत लगता है।

किसी भी मदद की सराहना की जाएगी!

संपादित करें: मैं बैक अप के साथ गया था। असल में, मैं बहुत की तरह एक पेज पर पोस्ट करें:

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

समर्थन सेम इसलिए की तरह लग रही ...

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); 
     } 
    } 

यह अभी भी एक हैक की तरह लगता है, लेकिन मुझे यकीन है कि चारों ओर पाने के लिए नहीं कर रहा हूँ इस। आदर्श रूप में, मैं एक सर्वलेट पर पोस्ट करता हूं, loginID प्राप्त करता हूं, उपयोगकर्ता का निर्माण करता हूं और इसे सीधे प्रबंधित बीन में डाल देता हूं। लेकिन, उस बिंदु पर FacesContext मौजूद नहीं है।

कोई अन्य विचार?

उत्तर

4

मुझे यकीन नहीं है कि इस संदर्भ में "साइट" से आपका क्या मतलब है।

कुछ नोट:

  • प्रबंधित सेम वेब एप्लिकेशन (युद्ध) जिसमें वे परिभाषित कर रहे हैं के बाहर उपलब्ध नहीं हो जाएगी।
  • FacesContext ऑब्जेक्ट उदाहरण अंततः FacesServlet.service द्वारा बनाए और डिस्पोजेड किए जाते हैं, इसलिए अनुरोधों को इस सर्वलेट से गुजरना चाहिए। अन्य परिस्थितियों में एक संदर्भ बनाने का प्रयास करने से अपरिभाषित व्यवहार हो सकता है।

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

    jsfPage:


असर यह है कि मन में, तो आप इस तरह के अनुरोध के अनुक्रम बना सकते हैं।jsp शामिल हैं:

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

"प्रेषण" संपत्ति एक सेम विधि "getDispatch" पर ले कर जाता:

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

कौन इस सर्वलेट को डिस्पैच:

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); 

    } 

} 

जो एक से मूल्य का उत्सर्जन करता है प्रबंधित बीन "myBean":

public class MyBean { 

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

    public String getText() { 
     return text; 
    } 

} 

यह सब बहुत ही गड़बड़ है और मैं स्वेच्छा से इसमें से कोई भी नहीं करूँगा।

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(); 
     } 
    } 

} 

फिर से, मैं इस दृष्टिकोण यदि संभव हो तो बच जाएंगे:


एक वैकल्पिक, जो अपनी ही परिणाम के साथ आ सकते हैं, इस तरह अपने खुद के संदर्भ बनाने के लिए है।

+0

दूसरा वह जवाब है जिसे मैं ढूंढ रहा था और पहली बार मेरी बैक अप योजना थी अगर मैं पहले नहीं समझ पा रहा था। विचार यह था कि विरासत सर्वलेट साइट (इसकी स्वयं की वेबपैप और WAR फ़ाइल) उपयोगकर्ता को पोस्ट और क्रेडेंशियल के साथ नए वेबैप पर रीडायरेक्ट करेगी। क्या ऐसा करने के लिए इससे अच्छा तरीका है? – Drew