2012-03-28 29 views
6

(Từ SpringSource forum.)Gracefully xử lý HttpSession hết hạn trong mùa xuân WebFlow

Khi HttpSession đã hết hạn và người dùng lại nộp một trang trong dòng chảy, anh/cô ấy được gửi trở lại đầu của dòng chảy. Tất cả những gì tôi muốn thêm vào hành vi này là một thông điệp giải thích lý do tại sao nó xảy ra. "Bạn không hoạt động, vì vậy bạn đã được khởi động lại ..."

Cách dễ nhất/thực hành tốt nhất để làm điều này là gì?

Trả lời

4

Hành vi mặc định, trong FlowHandlerAdapter.defaultHandleException(), "cố gắng bắt đầu thực hiện mới luồng đã kết thúc hoặc hết hạn".

Nó trông giống như một cách WebFlow để xử lý này sẽ được cung cấp một FlowHandler với một phương pháp handleException() để kiểm tra cho một instanceof NoSuchFlowExecutionException, sau đó làm một cái gì đó giống như xây dựng một URL chuyển hướng hoặc đặt một cái gì đó trên phạm vi phiên mà sau này có thể được gỡ bỏ một lần sử dụng .

Do cách WebFlow sử dụng chuyển hướng, tôi không nghĩ rằng bất kỳ phạm vi nào khác sẽ cho phép cờ hoặc thông điệp đó được sử dụng sau này khi chế độ xem luồng mới hiển thị.

Tuy nhiên, chỉ cần phát hiện Phiên mới trong một Interceptor hoặc thậm chí là Filter dường như cũng hiệu quả. Đó là những gì tôi đã kết thúc làm trong điều tra trước đây của tôi về điều này, như được ghi trong chuỗi diễn đàn được tham chiếu. Tôi đã chỉ hy vọng cho một cái gì đó đẹp hơn.

Ngoài ra, vào thời điểm dòng mới bắt đầu, một ID phiên mới đã được tạo, do đó không có cách nào để phát hiện điều kiện này ban đầu từ bên trong flow.xml.

Sample lọc logic:

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

mẫu Interceptor:

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

Bước 1: FlowController có handlerAdapter mặc định. Để tùy chỉnh ngoại lệ phiên bạn được yêu cầu để viết bộ chuyển đổi điều khiển tùy chỉnh của riêng bạn và đăng ký nó với dòng chảy điều khiển đậu như sau:

<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"/> 

Bước 2: CustomFlowHandlerAdapter Trong phương pháp defaultHandleException lớp ghi đè này. đây là phương thức mà luồng web gọi ra trong trường hợp ngoại lệ và khởi tạo lại phiên. xin lưu ý, phiên mới đã được tạo cho đến thời điểm này. Chỉ loại ngoại lệ sẽ cho bạn biết vào thời điểm này rằng phiên trước đã hết thời gian chờ.

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

Trang xem đầu tiên của ứng dụng sẽ có thể hiển thị thông báo này.

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

Hy vọng điều này sẽ hữu ích.

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