2011-04-27 35 views
6

Tôi cần truy cập Trình quản lý từ servlet (hoặc bộ lọc) trong Tomcat để tải phiên tùy chỉnh theo ID phiên tùy chỉnh.Tomcat: cách truy cập (phiên) Người quản lý từ servlet

Trả lời câu hỏi tiếp theo của bạn: tại sao tôi cần nó. Có một lỗi cũ trong Flash khiến nó gửi cookie từ IE chứ không phải từ trình duyệt hiện tại. Vì vậy, nếu tôi đang ở FF và tôi đang cố gắng để tải lên các tập tin với SWFUpload tôi kết thúc với phiên sai và một lỗi.

Tôi muốn thêm thông số ma thuật vào POST nên ghi đè id phiên mặc định (sai), sau đó tải phiên tùy chỉnh thay vì phiên được tải bởi Tomcat. Tôi không thể sử dụng viết lại URL vì cookie được giải quyết trước và khi flash gửi cookie sai từ IE, Tomcat không cố gắng tải phiên từ địa chỉ được viết lại url.

Tôi đánh giá cao bất kỳ gợi ý nào khác về cách truy cập Trình quản lý từ ngữ cảnh hoặc giải pháp của sự cố ban đầu.

Cảm ơn trước, Juriy

Trả lời

4

Nó nên có thể truy cập thông qua việc thực hiện các ServletContext. Lấy các nguồn của tomcat để kiểm tra điều đó, hoặc sử dụng sự phản chiếu để có được tất cả các trường của ngữ cảnh. Bạn có thể phải sử dụng rất nhiều phản ánh để có được người quản lý.

(Tôi không thể tìm thấy cho dù người quản lý được tiếp xúc trong JNDI, nhưng bạn có thể tìm ở đó cũng)

5

cho Tomcat:

ApplicationContextFacade appContextFacadeObj = (ApplicationContextFacade) request.getSession().getServletContext(); 

    try 
    { 
     Field applicationContextField = appContextFacadeObj.getClass().getDeclaredField("context"); 
     applicationContextField.setAccessible(true); 
     ApplicationContext appContextObj = (ApplicationContext) applicationContextField.get(appContextFacadeObj); 
     Field standardContextField = appContextObj.getClass().getDeclaredField("context"); 
     standardContextField.setAccessible(true); 
     StandardContext standardContextObj = (StandardContext) standardContextField.get(appContextObj); 
     Manager persistenceManager = standardContextObj.getManager(); 
    } 
    catch(SecurityException e) 
    { 
     logger.error(e); 
    } 
    catch(NoSuchFieldException e) 
    { 
     logger.error(e); 
    } 
    catch(IllegalArgumentException e) 
    { 
     logger.error(e); 
    } 
    catch(IllegalAccessException e) 
    { 
     logger.error(e); 
    } 
6

Trái ngược mã Ihor 's, mã này sử dụng ít trừu tượng hơn bằng cách nhận được Manager từ HttpSession:

private Manager manager(HttpSession session) throws Exception { 

    Field facadeSessionField = StandardSessionFacade.class.getDeclaredField("session"); 
    facadeSessionField.setAccessible(true); 
    StandardSession stdSession = (StandardSession) facadeSessionField.get(session); 

    return stdSession.getManager(); 
} 
+0

Điều này thực sự đã lưu thịt xông khói của tôi, cảm ơn! – RTF

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