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