2010-10-18 32 views
10

Tôi muốn hết hạn tất cả các phiên của mình trong Tomcat. Chúng tôi kiểm tra sản phẩm của chúng tôi dưới Fitnesse và một số phiên còn lại và kết thúc phiên gây ra sự phụ thuộc giữa các thử nghiệm. Tôi làm điều đó bằng tay với đoạn mã sau, nhưng một số phiên vẫn còn (tôi có thể kiểm tra xem nó với url http://localhost:8080/manager/html/list)Tôi làm cách nào để hết hạn các phiên của mình trong Tomcat?

public static void expireAllSessions() { 
    String[] applications = { "a", "b", "c", "d", "e" }; 
    for (String application : applications) { 
     try { 
      expireAllSessions(application); 
     } catch (Exception e) { 
      logger.error(e); 
     } 
    } 
} 

private static void expireAllSessions(final String application) throws Exception { 
    // cf doc http://hc.apache.org/httpclient-3.x/authentication.html 
    HttpClient client = new HttpClient(); 
    client.getParams().setAuthenticationPreemptive(true); 
    Credentials userPassword = new UsernamePasswordCredentials("tomcat", "tomcat"); 
    client.getState().setCredentials(AuthScope.ANY, userPassword); 

    String url = "http://localhost:8080/manager/html/expire"; 
    NameValuePair[] parametres = new NameValuePair[] { 
      new NameValuePair("path", "/" + application), 
      new NameValuePair("idle", "0") 
    }; 
    HttpMethod method = new GetMethod(url); 
    method.setQueryString(parametres); 
    client.executeMethod(method); 
} 

Có cách nào để làm điều đó một cách hiệu quả hơn và ngay lập tức không có phiên nào còn lại?

Trả lời

7

Tôi giả định rằng ứng dụng của bạn thực sự là bối cảnh độc lập. Tôi đã làm một cái gì đó tương tự như những gì bạn đang yêu cầu sử dụng một HttpSessionListener cho mọi ngữ cảnh. Phần phức tạp ở đây là bạn cần có một Session Collection được load bởi trình nạp lớp gốc như trái ngược với trình nạp lớp ngữ cảnh. Đây là cách tôi nhớ điều đó:

Tạo lớp học giữ các phiên hoạt động cho từng ngữ cảnh. Lớp này phải nằm trong thư mục tomcat/lib để nó có thể truy cập được theo mọi ngữ cảnh. Nó không thể là một phần của bất kỳ ngữ cảnh nào.

public class SessionMap { 

    private static Map<ServletContext, Set<HttpSession>> map = 
    new HashMap<ServletContext, Set<HttpSession>>(); 

    private SessionMap() { 
    } 

    public static Map<ServletContext, Set<HttpSession>> getInstance() { 
    return map; 
    } 

    public static void invalidate(String[] contexts) { 
    synchronized (map) { 
     List<String> l = Arrays.asList(contexts);  
     for (Map.Entry<ServletContext, Set<HttpSession>> e : map.entrySet()) { 
     // context name without the leading slash 
     String c = e.getKey().getContextPath().substring(1); 
     if (l.contains(c)) { 
      for (HttpSession s : e.getValue()) 
      s.invalidate(); 
     } 
     } 
    } 
    } 

} 

Tạo trình nghe cho mọi ngữ cảnh.

public class ApplicationContextListener implements HttpSessionListener { 

    public void sessionCreated(HttpSessionEvent event) { 
    ConcurrentMap<ServletContext, Set<HttpSession>> instance = SessionMap.getInstance(); 
    synchronized (instance) { 
     ServletContext c = event.getSession().getServletContext(); 
     Set<HttpSession> set = instance.get(c); 
     if (c == null) { 
     set = new HashSet<HttpSession>(); 
     instance.put(c, set); 
     } 
     set.add(event.getSession()); 
    } 
    } 

    public void sessionDestroyed(HttpSessionEvent event) { 
    ConcurrentMap<ServletContext, Set<HttpSession>> instance = SessionMap.getInstance(); 
    synchronized (map) { 
     ServletContext c = event.getSession().getServletContext(); 
     Set<HttpSession> set = instance.get(c); 
     if (c != null) { 
     set.remove(event.getSession()); 
     } 
    } 
    } 

} 

Đã đăng ký từng người nghe trong ngữ cảnh tương ứng web.xml.

<listener> 
    <listener-class>ApplicationContextListener</listener-class> 
</listener> 

Sau đó, bạn có thể gọi dòng sau để vô hiệu hóa mọi thứ từ bất kỳ ngữ cảnh nào.

SessionMap.invalidate(); 

Tôi đang đồng bộ hóa trên bản đồ để được an toàn.

+0

Lớp phiên bản không phải là chủ đề an toàn –

3

Bạn có thể sử dụng HttpSessionListener để lưu các tài liệu tham khảo để các phiên trong một cấu trúc dữ liệu và sau đó sử dụng nó tại giải trí của bạn

1

Bạn đã nhìn Lamda Probe? Đối với mỗi ứng dụng web của bạn, bạn có thể xem nội dung của phiên và hết hạn (tất cả).

alt text

Nếu bạn muốn viết ứng dụng của riêng mình để làm điều này thay thế; Lamda Probe là nguồn mở, vì vậy bạn có thể lấy mã từ chúng để giúp đạt được mục tiêu của mình.

+0

Có vẻ như Lambda Probe bị bỏ qua nhưng có một nhánh hoạt động của nó được gọi là [Psi Probe] (https://psi-probe.github.io/psi-probe/). – Roger

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