Servlet hoạt động như thế nào? Thuyết minh, phiên, biến được chia sẻ và đa luồng

1171
Ku Jon 2010-06-24 14:16.

Giả sử, tôi có một máy chủ web chứa nhiều servlet. Để biết thông tin chuyển giữa các servlet đó, tôi đang đặt các biến phiên và phiên bản.

Bây giờ, nếu 2 hoặc nhiều người dùng gửi yêu cầu đến máy chủ này thì điều gì sẽ xảy ra với các biến phiên?
Tất cả chúng sẽ chung cho tất cả người dùng hay chúng sẽ khác nhau cho mỗi người dùng?
Nếu chúng khác nhau, thì làm cách nào máy chủ có thể phân biệt giữa những người dùng khác nhau?

Một câu hỏi tương tự nữa, nếu có nngười dùng truy cập vào một servlet cụ thể, thì servlet này chỉ được khởi tạo lần đầu tiên khi người dùng đầu tiên truy cập vào nó hay nó được khởi tạo cho tất cả người dùng một cách riêng biệt?
Nói cách khác, điều gì xảy ra với các biến cá thể?

7 answers

1852
BalusC 2010-06-24 16:41.

ServletContext

Khi thùng chứa servlet (như Apache Tomcat ) khởi động, nó sẽ triển khai và tải tất cả các ứng dụng web của nó. Khi một ứng dụng web được tải, vùng chứa servlet sẽ tạo ServletContextmột lần và giữ nó trong bộ nhớ của máy chủ. Các ứng dụng web của web.xmlvà tất cả bao gồm web-fragment.xmlcác file được phân tách, và mỗi <servlet>, <filter><listener>tìm thấy (hoặc mỗi lớp chú thích với @WebServlet, @WebFilter@WebListenertương ứng) được khởi tạo một lần và lưu giữ trong bộ nhớ của máy chủ là tốt. Đối với mỗi bộ lọc khởi tạo, init()phương thức của nó được gọi với một bộ lọc mới FilterConfig.

Khi một Servletcó một <servlet><load-on-startup>hoặc @WebServlet(loadOnStartup)giá trị lớn hơn 0, thì init()phương thức của nó cũng được gọi trong quá trình khởi động với một mới ServletConfig. Các servlet đó được khởi tạo theo cùng một thứ tự được chỉ định bởi giá trị đó ( 1là thứ nhất, 2là thứ hai, v.v.). Nếu cùng giá trị được quy định trong hơn một servlet, sau đó mỗi người trong số những servlets được nạp theo thứ tự như chúng xuất hiện trong web.xml, web-fragment.xmlhoặc @WebServletclassloading. Trong trường hợp không có giá trị "load-on-startup", init()phương thức sẽ được gọi bất cứ khi nào yêu cầu HTTP truy cập vào servlet đó lần đầu tiên.

Khi thùng chứa servlet kết thúc với tất cả các bước khởi tạo được mô tả ở trên, thì ServletContextListener#contextInitialized()tệp sẽ được gọi.

Khi tắt servlet container xuống, nó trút tất cả các ứng dụng web, gọi các destroy()phương pháp của tất cả các servlets nó khởi tạo và các bộ lọc, và tất cả ServletContext, Servlet, FilterListenercác trường hợp được cho vào thùng rác. Cuối cùng di ServletContextListener#contextDestroyed()chúc được gọi ra.

HttpServletRequest và HttpServletResponse

Vùng chứa servlet được gắn vào một máy chủ web lắng nghe các yêu cầu HTTP trên một số cổng nhất định (cổng 8080 thường được sử dụng trong quá trình phát triển và cổng 80 trong quá trình sản xuất). Khi một máy khách (ví dụ: người dùng sử dụng trình duyệt web hoặc sử dụng theo chương trìnhURLConnection ) gửi một yêu cầu HTTP, thùng chứa servlet sẽ tạo mới HttpServletRequestHttpServletResponsecác đối tượng và chuyển chúng qua bất kỳ đối tượng nào được xác định Filtertrong chuỗi và cuối cùng là Servletphiên bản.

Trong trường hợp bộ lọc , doFilter()phương thức được gọi. Khi mã của vùng chứa servlet gọi chain.doFilter(request, response), yêu cầu và phản hồi tiếp tục đến bộ lọc tiếp theo hoặc nhấn vào servlet nếu không còn bộ lọc nào.

Trong trường hợp của các servlet , service()phương thức được gọi. Theo mặc định, phương thức này xác định một trong những doXxx()phương thức sẽ gọi dựa trên request.getMethod(). Nếu phương thức đã xác định không có trong servlet, thì lỗi HTTP 405 được trả về trong phản hồi.

Đối tượng yêu cầu cung cấp quyền truy cập vào tất cả thông tin về yêu cầu HTTP, chẳng hạn như URL, tiêu đề, chuỗi truy vấn và nội dung của nó. Ví dụ: đối tượng phản hồi cung cấp khả năng kiểm soát và gửi phản hồi HTTP theo cách bạn muốn, cho phép bạn đặt tiêu đề và nội dung (thường là với nội dung HTML được tạo từ tệp JSP). Khi phản hồi HTTP được cam kết và kết thúc, cả đối tượng yêu cầu và phản hồi đều được tái chế và sẵn sàng để sử dụng lại.

HttpSession

Khi một ứng dụng khách truy cập ứng dụng web lần đầu tiên và / hoặc ứng dụng HttpSessionđược tải lần đầu tiên thông qua request.getSession(), thùng chứa servlet sẽ tạo một HttpSessionđối tượng mới , tạo một ID dài và duy nhất (bạn có thể lấy session.getId()) và lưu trữ nó trong máy chủ ký ức. Vùng chứa servlet cũng đặt một Cookietrong Set-Cookietiêu đề của phản hồi HTTP với JSESSIONIDtên của nó và ID phiên duy nhất làm giá trị của nó.

Theo đặc tả cookie HTTP (một hợp đồng mà bất kỳ trình duyệt web và máy chủ web phù hợp nào cũng phải tuân theo), khách hàng (trình duyệt web) được yêu cầu gửi lại cookie này trong các yêu cầu tiếp theo trong Cookietiêu đề miễn là cookie hợp lệ ( tức là ID duy nhất phải tham chiếu đến một phiên chưa hết hạn và miền và đường dẫn là chính xác). Sử dụng trình giám sát lưu lượng HTTP tích hợp của trình duyệt, bạn có thể xác minh rằng cookie hợp lệ (nhấn F12 trong Chrome / Firefox 23+ / IE9 + và kiểm tra tab Mạng / Mạng ). Vùng chứa servlet sẽ kiểm tra Cookietiêu đề của mọi yêu cầu HTTP đến để tìm sự hiện diện của cookie với tên JSESSIONIDvà sử dụng giá trị của nó (ID phiên) để nhận được liên kết HttpSessiontừ bộ nhớ của máy chủ.

Các giá trị HttpSessionvẫn tồn tại cho đến khi nó không hoạt động (tức là không được sử dụng trong một yêu cầu) cho nhiều hơn giá trị thời gian chờ được chỉ định trong <session-timeout>, một cài đặt trong web.xml. Giá trị thời gian chờ mặc định là 30 phút. Vì vậy, khi khách hàng không truy cập ứng dụng web lâu hơn thời gian được chỉ định, vùng chứa servlet sẽ chuyển phiên này vào thùng rác. Mọi yêu cầu tiếp theo, ngay cả với cookie được chỉ định, sẽ không có quyền truy cập vào cùng một phiên nữa; vùng chứa servlet sẽ tạo một phiên mới.

Về phía máy khách, cookie phiên vẫn tồn tại miễn là phiên bản trình duyệt đang chạy. Vì vậy, nếu máy khách đóng phiên bản trình duyệt (tất cả các tab / cửa sổ), thì phiên đó sẽ được chuyển vào thùng rác ở phía máy khách. Trong một phiên bản trình duyệt mới, cookie được liên kết với phiên sẽ không tồn tại, vì vậy nó sẽ không được gửi nữa. Điều này khiến một phiên hoàn toàn mới HttpSessionđược tạo, với một cookie phiên hoàn toàn mới được sử dụng.

Tóm lại

  • Thời ServletContextgian tồn tại của ứng dụng web càng lâu. Nó được chia sẻ giữa tất cả các yêu cầu trong tất cả các phiên.
  • Hoạt động HttpSessionmiễn là máy khách tương tác với ứng dụng web bằng cùng một phiên bản trình duyệt và phiên không quá thời gian chờ ở phía máy chủ. Nó được chia sẻ cho tất cả các yêu cầu trong cùng một phiên.
  • Các HttpServletRequestHttpServletResponsetrực tiếp từ thời điểm đó servlet nhận được một yêu cầu HTTP từ các khách hàng, cho đến khi đáp ứng đầy đủ (trang web) đã đến. Nó không được chia sẻ ở nơi khác.
  • Tất cả Servlet, FilterListenertrường hợp sống lâu như các ứng dụng web sống. Chúng được chia sẻ giữa tất cả các yêu cầu trong tất cả các phiên.
  • Bất kỳ attributeđược xác định trong ServletContext, HttpServletRequestHttpSessionsẽ sống lâu như các đối tượng trong cuộc sống câu hỏi. Bản thân đối tượng đại diện cho "phạm vi" trong các khung quản lý bean như JSF, CDI, Spring, v.v. Các khung đó lưu trữ các bean trong phạm vi của chúng như một attributephạm vi đối sánh gần nhất của nó.

An toàn chủ đề

Điều đó nói rằng, mối quan tâm chính của bạn có thể là an toàn luồng . Bây giờ bạn nên biết rằng các servlet và bộ lọc được chia sẻ giữa tất cả các yêu cầu. Đó là điều thú vị về Java, nó đa luồng và các luồng khác nhau (đọc: yêu cầu HTTP) có thể sử dụng cùng một phiên bản. Nếu không, sẽ quá tốn kém để tạo lại init()destroy()chúng cho mọi yêu cầu.

Bạn cũng nên nhận ra rằng bạn không bao giờ được chỉ định bất kỳ yêu cầu hoặc dữ liệu phạm vi phiên nào làm biến cá thể của một servlet hoặc bộ lọc. Nó sẽ được chia sẻ cho tất cả các yêu cầu khác trong các phiên khác. Điều đó không an toàn! Ví dụ dưới đây minh họa điều này:

public class ExampleServlet extends HttpServlet {

    private Object thisIsNOTThreadSafe;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object thisIsThreadSafe;

        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
    } 
}

Xem thêm:

  • Sự khác biệt giữa JSF, Servlet và JSP là gì?
  • Tùy chọn tốt nhất để quản lý phiên trong Java
  • Sự khác biệt giữa / và / * trong mẫu url ánh xạ servlet
  • doGet và doPost trong Servlets
  • Servlet dường như xử lý đồng bộ nhiều yêu cầu trình duyệt đồng thời
  • Tại sao Servlet không phải là chủ đề An toàn?
431
Jops 2013-07-07 06:38.

Phiên

Tóm lại: máy chủ web cấp một mã định danh duy nhất cho mỗi khách truy cập trong lần truy cập đầu tiên của họ . Khách truy cập phải mang lại ID đó để anh ta được nhận dạng vào lần sau. Giá trị nhận dạng này cũng cho phép máy chủ phân tách chính xác các đối tượng thuộc sở hữu của một phiên so với phiên khác.

Servlet Instantiation

Nếu tải khi khởi độngsai :

Nếu tải khi khởi độngtrue :

Khi anh ta đang ở chế độ dịch vụ và trên rãnh, cùng một servlet sẽ hoạt động theo yêu cầu từ tất cả các máy khách khác.

Tại sao không nên có một phiên bản cho mỗi khách hàng? Hãy suy nghĩ về điều này: Bạn sẽ thuê một nhân viên pizza cho mỗi đơn hàng đến? Làm điều đó và bạn sẽ mất kinh doanh ngay lập tức.

Nó đi kèm với một rủi ro nhỏ. Hãy nhớ rằng: anh chàng độc thân này giữ tất cả thông tin đơn đặt hàng trong túi của mình: vì vậy nếu bạn không thận trọng về an toàn luồng trên các servlet , anh ta có thể đưa ra đơn đặt hàng sai cho một khách hàng nhất định.

42
Chris Thompson 2010-06-24 14:20.

Phiên trong các servlet Java giống như phiên trong các ngôn ngữ khác như PHP. Nó là duy nhất cho người dùng. Máy chủ có thể theo dõi nó theo nhiều cách khác nhau như cookie, ghi lại url, v.v. Bài viết tài liệu Java này giải thích nó trong ngữ cảnh của Java servlet và chỉ ra rằng chính xác cách duy trì phiên là một chi tiết triển khai được các nhà thiết kế của máy chủ để lại. Đặc tả chỉ quy định rằng nó phải được duy trì là duy nhất cho một người dùng trên nhiều kết nối đến máy chủ. Hãy xem bài viết này của Oracle để biết thêm thông tin về cả hai câu hỏi của bạn.

Chỉnh sửa Có một hướng dẫn tuyệt vời ở đây về cách làm việc với phiên bên trong các servlet. Và đây là một chương của Sun về Java Servlet, chúng là gì và cách sử dụng chúng. Giữa hai bài báo đó, bạn sẽ có thể trả lời tất cả các câu hỏi của mình.

33
Ajay Takur 2012-02-23 02:54.

Khi vùng chứa servlet (như Apache Tomcat) khởi động, nó sẽ đọc từ tệp web.xml (chỉ một tệp cho mỗi ứng dụng) nếu có bất cứ điều gì sai hoặc hiển thị lỗi ở bảng điều khiển phía vùng chứa, nếu không, nó sẽ triển khai và tải tất cả web. ứng dụng bằng cách sử dụng web.xml (vì vậy được đặt tên là bộ mô tả triển khai).

Trong giai đoạn khởi tạo của servlet, cá thể servlet đã sẵn sàng nhưng nó không thể phục vụ yêu cầu của khách hàng vì nó bị thiếu với hai phần thông tin:
1: thông tin ngữ cảnh
2: thông tin cấu hình ban đầu

Servlet engine tạo ra đối tượng giao diện servletConfig đóng gói thông tin còn thiếu ở trên vào nó động cơ servlet gọi init () của servlet bằng cách cung cấp các tham chiếu đối tượng servletConfig làm đối số. Khi init () được thực thi hoàn toàn, servlet đã sẵn sàng để phục vụ yêu cầu của khách hàng.

Q) Trong vòng đời của servlet có bao nhiêu lần việc khởi tạo và khởi tạo xảy ra ??

A) chỉ một lần (đối với mỗi yêu cầu của khách hàng, một luồng mới được tạo) chỉ một phiên bản của servlet phục vụ bất kỳ số lượng nào của yêu cầu khách, tức là sau khi phục vụ một máy chủ yêu cầu khách không chết. Nó chờ đợi các yêu cầu khác của khách hàng, tức là hạn chế của CGI (đối với mỗi yêu cầu của khách hàng, một quy trình mới được tạo ra) được khắc phục với servlet (động cơ servlet bên trong tạo luồng).

Q) Khái niệm phiên hoạt động như thế nào?

A) bất cứ khi nào getSession () được gọi trên đối tượng HttpServletRequest

Bước 1 : Đối tượng yêu cầu được đánh giá cho ID phiên đến.

Bước 2 : Nếu ID không có sẵn, một đối tượng HttpSession hoàn toàn mới được tạo và ID phiên tương ứng của nó được tạo (tức là của HashTable) ID phiên được lưu trữ vào đối tượng phản hồi httpservlet và tham chiếu của đối tượng HttpSession được trả lại cho servlet (doGet / doPost) .

Bước 3 : Nếu ID có sẵn đối tượng phiên hoàn toàn mới không được tạo, ID phiên được chọn từ tìm kiếm đối tượng yêu cầu được thực hiện trong tập hợp các phiên bằng cách sử dụng ID phiên làm khóa.

Sau khi tìm kiếm thành công, ID phiên được lưu trữ vào HttpServletResponse và các tham chiếu đối tượng phiên hiện có được trả về doGet () hoặc doPost () của UserDefineservlet.

Ghi chú:

1) khi điều khiển rời khỏi mã servlet đến máy khách, đừng quên rằng đối tượng phiên đang được giữ bởi thùng chứa servlet, tức là động cơ servlet

2) đa luồng được để lại cho những người phát triển servlet để thực hiện, tức là, xử lý nhiều yêu cầu của khách hàng, không có gì phải bận tâm về mã đa luồng

Dạng ngắn gọn:

Một servlet được tạo khi ứng dụng khởi động (nó được triển khai trên thùng chứa servlet) hoặc khi nó được truy cập lần đầu tiên (tùy thuộc vào cài đặt tải khi khởi động) khi servlet được khởi tạo, phương thức init () của servlet được gọi thì servlet (một và duy nhất của nó) xử lý tất cả các yêu cầu (phương thức service () của nó được gọi bởi nhiều luồng). Đó là lý do tại sao không nên có bất kỳ đồng bộ hóa nào trong đó, và bạn nên tránh các biến cá thể của servlet khi ứng dụng không được triển khai (thùng chứa servlet dừng lại), phương thức hủy () được gọi.

20
Lauri Lehtinen 2010-06-24 14:27.

Sessions - những gì Chris Thompson nói.

Instantiation - một servlet được khởi tạo khi vùng chứa nhận được yêu cầu đầu tiên được ánh xạ tới servlet (trừ khi servlet được cấu hình để tải khi khởi động với <load-on-startup>phần tử trong web.xml). Phiên bản tương tự được sử dụng để phục vụ các yêu cầu tiếp theo.

13
tharindu_DG 2014-03-06 01:41.

Đặc tả Servlet JSR-315 xác định rõ hành vi vùng chứa web trong các phương thức dịch vụ (và doGet, doPost, doPut, v.v.) (2.3.3.1 Vấn đề đa luồng, Trang 9):

Một thùng chứa servlet có thể gửi các yêu cầu đồng thời thông qua phương thức dịch vụ của servlet. Để xử lý các yêu cầu, Servlet Developer phải đưa ra các quy định thích hợp để xử lý đồng thời nhiều luồng trong phương thức dịch vụ.

Mặc dù không được khuyến khích, nhưng một giải pháp thay thế cho Nhà phát triển là triển khai giao diện SingleThreadModel yêu cầu vùng chứa đảm bảo rằng chỉ có một chuỗi yêu cầu tại một thời điểm trong phương thức dịch vụ. Một thùng chứa servlet có thể đáp ứng yêu cầu này bằng cách tuần tự hóa các yêu cầu trên một servlet hoặc bằng cách duy trì một nhóm các cá thể servlet. Nếu servlet là một phần của ứng dụng Web đã được đánh dấu là có thể phân phối, vùng chứa có thể duy trì một nhóm các cá thể servlet trong mỗi JVM mà ứng dụng được phân phối.

Đối với các servlet không triển khai giao diện SingleThreadModel, nếu phương thức dịch vụ (hoặc các phương thức như doGet hoặc doPost được gửi đến phương thức dịch vụ của lớp trừu tượng HttpServlet) đã được xác định bằng từ khóa được đồng bộ hóa, thì vùng chứa servlet không thể sử dụng cách tiếp cận nhóm cá thể , nhưng phải tuần tự hóa các yêu cầu thông qua nó. Chúng tôi đặc biệt khuyến nghị các Nhà phát triển không đồng bộ hóa phương thức dịch vụ (hoặc các phương pháp được gửi đến nó) trong những trường hợp này vì những ảnh hưởng bất lợi đến hiệu suất

0
Mahesh Balasubramanian 2019-02-06 20:43.

Như đã giải thích rõ ràng ở trên, bằng cách triển khai SingleThreadModel , một servlet có thể được đảm bảo an toàn luồng bởi vùng chứa servlet. Việc triển khai vùng chứa có thể thực hiện điều này theo 2 cách:

1) Sắp xếp thứ tự các yêu cầu (xếp hàng) đến một phiên bản duy nhất - điều này tương tự như một servlet KHÔNG triển khai SingleThreadModel NHƯNG đồng bộ hóa các phương thức dịch vụ / doXXX; HOẶC LÀ

2) Tạo một nhóm các cá thể - đó là một lựa chọn tốt hơn và là sự cân bằng giữa nỗ lực khởi động / khởi động / thời gian của servlet so với các tham số hạn chế (bộ nhớ / thời gian CPU) của môi trường lưu trữ servlet.

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Làm thế nào để xây dựng một quả địa cầu từ Scratch

Làm thế nào để xây dựng một quả địa cầu từ Scratch

Thời gian, sự kiên nhẫn, thời gian, sự cống hiến và thời gian chỉ là một vài trong số những thứ mà Peter Bellerby cần để thành lập và sau đó điều hành Bellerby & Co. Globemakers, một trong những công ty duy nhất trên Trái đất vẫn sản xuất các quả địa cầu bằng tay.

Năm giai đoạn đau buồn sau khi mất việc làm

Năm giai đoạn đau buồn sau khi mất việc làm

Đó là một ngày thứ Bảy, máy bay của tôi hạ cánh, và tôi đã sẵn sàng để thư giãn trong một kỳ nghỉ cuối tuần ngắn ngủi, khi một email đến trên điện thoại của tôi. Tôi đã mất việc.

Giữ an toàn cho danh tính của bạn với một cảnh báo đóng băng hoặc gian lận tín dụng

Giữ an toàn cho danh tính của bạn với một cảnh báo đóng băng hoặc gian lận tín dụng

Nếu bạn đã từng bị đánh cắp danh tính của mình, bạn biết đó là một trải nghiệm đáng sợ và căng thẳng. Một cách không phổ biến để ngăn chặn nó? Tín dụng bị đóng băng.

Buổi ra mắt phần 3 của The Good Place có một học sinh mới: Khán giả

Buổi ra mắt phần 3 của The Good Place có một học sinh mới: Khán giả

Eleanor (Kristen Bell) dường như đã tình nguyện cho chúng tôi làm vật tưởng nhớ. NBC's The Good Place là một chương trình thích thử thách tốt.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language