2011-11-06 28 views
9

Tôi đang làm việc trên webapp trong WinXP, Eclipse Indigo và Google web plugin.sendRedirect của Servlet() giết thuộc tính phiên của tôi

Tôi có một biểu mẫu đơn giản lấy giá trị từ người dùng (ví dụ: email), chuyển nó tới một servlet có tên SignIn.java xử lý và lưu giá trị email vào phiên. Mã SignIn rất đơn giản, đây là những gì doGet của nó chủ yếu là thực hiện:

String email = req.getParameter("email"); //getting the parameter from html form 
... 
... 
HttpSession session = req.getSession();  //create a new session 
session.setAttribute("email", email); 

Cho đến nay rất tốt, tôi đã xác minh rằng các giá trị không phải là null vào thời điểm này. Bây giờ đến vấn đề, tôi muốn chuyển hướng đến một servlet (ShowOnline.java) mà cần phải làm một số chế biến nhiều hơn nữa. Khi tôi viết

resp.sendRedirect(resp.encodeRedirectURL("/ShowOnlineServlet")); 

ShowOnline được null giá trị phiên (thuộc tính email mà tôi đã lưu bây giờ là một giây trước khi là null)

Khi tôi viết

getServletConfig().getServletContext().getRequestDispatcher("/ShowOnlineServlet"); 

mọi thứ đều OK, thuộc tính email từ trước không phải là null!

Điều gì đang xảy ra? sendRedirect() chỉ làm cho trình duyệt của bạn gửi yêu cầu mới, nó không ảnh hưởng đến phạm vi phiên. Tôi đã kiểm tra các cookie và chúng ổn (nó là cùng một phiên từ trước vì chắc chắn vì nó là phiên đầu tiên và duy nhất webapp của tôi tạo ra và hơn nữa tôi thậm chí còn làm phiền và kiểm tra ID của sesison và chúng giống nhau trên cả hai yêu cầu) .

Tại sao có sự khác biệt giữa sendRedirect()forward()? Các giải pháp dễ dàng sẽ được sử dụng forward() nhưng tôi muốn nhận được để dưới cùng của điều này trước khi tôi chỉ cho đi, tôi nghĩ rằng nó là quan trọng đối với tôi để hiểu những gì đã xảy ra. Tôi không chắc tôi thích ý tưởng không biết những gì đang xảy ra trên các khái niệm cơ bản như vậy (toàn bộ webapp của tôi rất đơn giản và cơ bản vào thời điểm này vì tôi là người mới bắt đầu).

Bất kỳ suy nghĩ ý tưởng hoặc đề xuất nào sẽ được chào đón nồng nhiệt!

+0

Tôi đoán nó có thể là có thể tại thời điểm này để sử dụng về phía trước thay vì sendRedirect nhưng tôi nghĩ rằng sau này tôi muốn sử dụng sendRedirect mà không sợ các thuộc tính phiên tôi sẽ đi rỗng không có lý do rõ ràng. –

+0

@home: OP xác nhận rằng ID phiên là giống nhau trước và sau. – BalusC

+1

điều gì sẽ xảy ra khi bạn không gửi chuyển hướng và tự đi đến/ShowOnlineServlet từ trình duyệt? –

Trả lời

1

Nếu SignIn servlet của bạn chỉ lưu thông số yêu cầu (email), thì bạn cũng có thể thay thế servlet bằng filter, ví dụ: SignInFilter.

SignInFilter sẽ chứa cùng một logic như SignIn servlet của bạn (sao chép email từ tham số yêu cầu đến phiên), nhưng sẽ gọi mục tiếp theo trong chuỗi (sẽ là ShowOnline servlet) thay vì thực hiện bất kỳ chuyển hướng/phía trước.

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
    throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 
    HttpSession session = request.getSession(); 

    String email = req.getParameter("email"); 
    session.setAttribute("email", email); 

    chain.doFilter(req, res); // continue to 'ShowOnline' 

} 

Thiết lập hình thức của bạn để đường bưu điện đến ShowOnline servlet thay vào đó, và cấu hình SignInFilter mới của bạn để thực hiện trước khi ShowOnline (mapping servlet bỏ qua bên dưới cho ngắn gọn).

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    id="WebApp_ID" version="2.5"> 

    <filter> 
     <filter-name>SignInFilter</filter-name> 
     <filter-class>com.example.SignInFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>SignInFilter</filter-name> 
     <url-pattern>/ShowOnline</url-pattern> 
    </filter-mapping> 
</web-app> 
-2

Theo như hiểu biết của tôi, sendRedirect() chỉ chuyển hướng điều khiển đến một trang khác mà không chuyển giao các liên yêu cầu & đối tượng phản ứng của trang mẹ, nhưng RequestDispatcher (object) sẽ cử các ServletRequest và ServletResponse vào trang đề cập trong đối số đường dẫn {getServletContext().getRequestDispatcher ("path")} sau đó bạn có thể chuyển tiếp các đối tượng đến trang đó hoặc bao gồm các đối tượng. Vì vậy, bởi container này trở nên yên tâm rằng ông đã sử dụng các yêu cầu trước đó và đối tượng phản ứng từ trang cha mẹ thay vì tạo một cái mới. Đặc biệt nếu bạn đang sử dụng quản lý phiên, tùy chọn tốt nhất là RequestDispatcher.

Hy vọng rằng sẽ trả lời câu hỏi.

Để tất cả: - Vui lòng sửa tôi nếu tôi sai.

@rs

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