2012-03-28 10 views
6

में समाप्त हो गई HttpSession संभाल (SpringSource forum से।)सुन्दरता स्प्रिंग WebFlow

HttpSession समाप्त हो गया है और उपयोगकर्ता के प्रवाह में एक पृष्ठ को फिर से सबमिट करता है, वह/वह वापस प्रवाह की शुरुआत करने के लिए भेजा जाता है। मैं इस व्यवहार में जोड़ना चाहता हूं यह एक संदेश है जो यह समझाता है कि यह क्यों हुआ। "आप निष्क्रिय थे, इसलिए आपको पुनरारंभ किया गया है ..."

ऐसा करने का सबसे आसान/सर्वोत्तम अभ्यास तरीका क्या है?

उत्तर

4

डिफ़ॉल्ट व्यवहार, FlowHandlerAdapter.defaultHandleException() में, "समाप्त या समाप्त होने वाले प्रवाह का नया निष्पादन शुरू करने का प्रयास करता है"।

यह एक WebFlow तरह से संभाल करने के लिए यह एक handleException() विधि है कि एक instanceof NoSuchFlowExecutionException लिए जाँच करता है के साथ एक FlowHandler प्रदान करने के लिए है, तो ऐसा कुछ होगा की तरह का एक रीडायरेक्ट URL का निर्माण या सत्र गुंजाइश पर कुछ ऐसा है जो बाद में एक बार हटाया जा सकता है का उपयोग जगह की तरह दिखता है ।

वेबफ्लो रीडायरेक्ट का उपयोग करने के तरीके के कारण, मुझे नहीं लगता कि कोई अन्य स्कोप ऐसे प्रवाह या संदेश को बाद में उपयोग करने की अनुमति देगा जब नए प्रवाह के दृश्य प्रस्तुत किए जाएंगे।

हालांकि, Interceptor में एक नया सत्र का पता लगाने या यहां तक ​​कि Filter भी उतना ही प्रभावी प्रतीत होता है। रेफरेंस फोरम थ्रेड में दस्तावेज के रूप में, मैंने अपनी पिछली जांच में क्या किया है। मैं बस कुछ सुंदर की उम्मीद कर रहा था।

इसके अलावा, जब तक नया प्रवाह शुरू होता है, तब तक एक नया सत्र आईडी पहले से ही बनाई जा चुकी है, इसलिए इस स्थिति को प्रवाह.एक्सएमएल के भीतर से शुरू करने का कोई तरीका नहीं है।

नमूना फिल्टर तर्क:

if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) { 
    log.info("Expired Session ID: " + request.getRequestedSessionId()); 
    response.sendRedirect("sessionExpired"); 
} 
else { 
    chain.doFilter(request, response); 
} 

नमूना इंटरसेप्टर:

public class SessionExpiredInterceptor extends HandlerInterceptorAdapter 
{ 
    private String redirectLocation = "sessionExpired"; 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, 
     Object handler) throws Exception 
    { 
     if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) 
     { 
      response.sendRedirect(redirectLocation); 
      return false; 
     } 

     return true; 
    } 

    public String getRedirectLocation() { 
     return redirectLocation; 
    } 

    public void setRedirectLocation(String redirectLocation) { 
     this.redirectLocation = redirectLocation; 
    } 
} 
1

चरण 1: FlowController एक डिफ़ॉल्ट handlerAdapter है।

<bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController"> 
. 
.<property name="flowHandlerAdapter" ref="customFlowHandlerAdapter"/> 

. 
</bean> 

<bean id="customFlowHandlerAdapter" class="gov.mo.courts.pbw.adapters.CustomFlowHandlerAdapter" 
    p:flowExecutor-ref="flowExecutor"/> 

चरण 2:: CustomFlowHandlerAdapter इस वर्ग ओवरराइड defaultHandleException विधि में सत्र अपवाद आप अपने स्वयं के कस्टम हैंडलर एडाप्टर लिख सकते हैं और नीचे के रूप में प्रवाह नियंत्रक सेम के साथ पंजीकृत होना पड़ता है अनुकूलित करने के लिए। यह तरीका है कि अपवादों के मामले में वेबफ्लो आक्रमण करता है और सत्र को पुन: प्रारंभ करता है। कृपया ध्यान दें, इस बिंदु तक नया सत्र पहले से ही बनाया जा चुका है। केवल अपवाद प्रकार आपको इस बिंदु पर बताएगा कि पिछले सत्र का समय समाप्त हो गया था।

public class PbwFlowHandlerAdapter extends FlowHandlerAdapter{ 
protected void defaultHandleException(String flowId, FlowException e, 
      HttpServletRequest request, HttpServletResponse response) 
      throws IOException { 
     if(e instanceof NoSuchFlowExecutionException){ 
      if(e.getCause() instanceof NoSuchConversationException){ 
       //"use newly created session object within request object to save your customized message." 
      } 
     } 
     super.defaultHandleException(flowId, e, request, response); 
    } 

आपके ऐप का पहला दृश्य पृष्ठ इस संदेश को दिखाने में सक्षम होना चाहिए।

<% 
         if (session.getAttribute(YOUR_CUSTOM_MSG_KEY) != null) { 
        %> 
        <p class="errormessage"> 
        <%=session.getAttribute(YOUR_CUSTOM_MSG_KEY)%> 
        </p> 
        <% 
        //once the message has been shown, remove it from the session 
        //as a new session has already been started at this time 
         session.removeAttribute(YOUR_CUSTOM_MSG_KEY); 
          } 
        %> 

उम्मीद है कि इससे मदद मिलती है।