Java - Servlet完全教程

簡書 賈小強
轉(zhuǎn)載請注明原創(chuàng)出處摊册,謝謝义桂!

Servlet是一種允許響應(yīng)請求的Java類。雖然Servlet可以響應(yīng)任何類型的請求禽篱,但它們通常被用來響應(yīng)網(wǎng)絡(luò)請求。一個Servlet必須部署在Java servlet容器中馍惹,它才能成為可用的躺率。雖然許多開發(fā)者利用Servlet框架如Java Server Pages (JSP)Java Server Faces (JSF),但實際上這兩種技術(shù)通過servlet容器在幕后將頁面編譯為Java servlet万矾。也就是說悼吱,Java servlet技術(shù)的基本知識對任何Java web開發(fā)都很有用。

在本教程中良狈,我們將涵蓋以下主題后添,從而獲得Java servlet技術(shù)的整體認(rèn)識。

目錄

  • 編寫第一個Servlet
  • Servlet的生命周期方法
  • 使用@WebServlet注解開發(fā)Servlet
  • 打包并部署Servlet到Tomcat服務(wù)器
  • Servlet響應(yīng)中寫入動態(tài)內(nèi)容
  • Servlet接受參數(shù)處理并響應(yīng)
  • 監(jiān)聽Servlet容器事件
  • Servlet傳入初始化參數(shù)
  • 給指定的請求增加Servlet過濾器
  • Servlet下載二進(jìn)制文件
  • 用RequestDispatcher.forward()將請求內(nèi)部轉(zhuǎn)發(fā)到另一個Servlet
  • 用HttpServletResponse.sendRedirect()將請求重定向到另一個Servlet
  • Servlet讀寫cookie
  • 讓我們開始一步一步學(xué)習(xí)Servlet薪丁。

編寫第一個Servlet

下面是一個非常簡單的Servlet遇西,實際上你需要寫的代碼代碼非常少

package com.bill.servlets;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class MyFirstServlet extends HttpServlet {
 
    private static final long serialVersionUID = -1915463532411657451L;
 
    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException 
    {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            // Write some content
            out.println("<html>");
            out.println("<head>");
            out.println("<title>MyFirstServlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h2>Servlet MyFirstServlet at " + request.getContextPath() + "</h2>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
     
    @Override
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        //Do some other work
    }
 
    @Override
    public String getServletInfo() {
        return "MyFirstServlet";
    }
}

用一個web.xml文件將上面的MyFirstServlet注冊在web容器中。

<?xml version="1.0"?>
<web-app     xmlns="http://xmlns.jcp.org/xml/ns/Javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
            http://xmlns.jcp.org/xml/ns/javaee/web-app_3_0.xsd"
            version="3.0">
             
    <welcome-file-list>
        <welcome-file>/MyFirstServlet</welcome-file>
    </welcome-file-list>
     
    <servlet>
        <servlet-name>MyFirstServlet</servlet-name>
        <servlet-class>com.bill.servlets.MyFirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyFirstServlet</servlet-name>
        <url-pattern>/MyFirstServlet</url-pattern>
    </servlet-mapping>
     
</web-app>

你可能想知道上面MyFirstServlet的完成了哪些重要的事情严嗜。

  1. MyFirstServlet繼承自HttpServlet粱檀。這是強制性的,因為所有的Servlet必須繼承javax.servlet.GenericServletjavax.servlet.http. HttpServlet漫玄。
  2. 重寫了doGet()和doPos()方法茄蚯。這些方法定義在HttpServlet類中。每當(dāng)GET或POST請求到來時,它被映射到其各自對應(yīng)的方法(例如第队,如果您發(fā)送一個 HTTP GET請求哮塞,然后servlet的doGet()方法被調(diào)用。
  3. 還有一些你可以重寫的其他方法凳谦,被用來控制應(yīng)用程序忆畅,比如getServletInfo()。
  4. HttpServletRequestHttpServletResponse是doxxx()方的默認(rèn)參數(shù)類型尸执。我們將在以后的章節(jié)中更多地了解這兩種類型對應(yīng)的對象家凯。

這就是了解一個簡單Servlet需要知道的的全部內(nèi)容。

Servlet的生命周期方法

在應(yīng)用程序中如失,每當(dāng)加載并使用Servlet時會發(fā)生一系列事件绊诲,如初始化和銷毀。這些被稱為Servlet的生命周期事件(或方法)褪贵。讓我們多了解一些關(guān)于它們的故事掂之。

init(),service()脆丁,和destroy()是三個在Servlet的生命周期中至關(guān)重要的方法世舰。它們由每個Servlet實現(xiàn),并在特定時間被調(diào)用槽卫。

1)在Servlet生命周期的初始階段跟压,web容器通過調(diào)用init()方法初始化Servlet實例,同時傳入一個實現(xiàn)javax.servlet.ServletConfig接口的對象歼培。這個配置對象允許Servlet訪問在web.xml文件中定義的鍵值對值初始化參數(shù)震蒋。這只在Servlet實例的生命周期中調(diào)用一次。
init方法定義如下所示:

public void  init() throws ServletException {
    //custom initialization code
}

2)在初始化之后躲庄,Servlet實例可以為客戶請求提供服務(wù)查剖。web容器調(diào)用Servlet的service()方法處理每個請求。service方法判斷請求的種類或者將請求轉(zhuǎn)發(fā)到哪個方法里處理更加合適读跷。Servlet的開發(fā)人員必須為這些方法提供一個實現(xiàn)梗搅。如果Servlet未實現(xiàn)這個方法,那么請求將調(diào)用父類的方法處理效览,通常會給請求者導(dǎo)致返回一個錯誤无切。

幾乎沒有必要重寫此方法。

protected void service(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException
{
String method = req.getMethod();
 
if (method.equals(METHOD_GET)) {
    long lastModified = getLastModified(req);
    if (lastModified == -1) {
    // servlet doesn't support if-modified-since, no reason
    // to go through further expensive logic
    doGet(req, resp);
    } else {
    long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
    if (ifModifiedSince < (lastModified / 1000 * 1000)) {
        // If the servlet mod time is later, call doGet()
                // Round down to the nearest second for a proper compare
                // A ifModifiedSince of -1 will always be less
        maybeSetLastModified(resp, lastModified);
        doGet(req, resp);
    } else {
        resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
    }
    }
 
} else if (method.equals(METHOD_HEAD)) {
    long lastModified = getLastModified(req);
    maybeSetLastModified(resp, lastModified);
    doHead(req, resp);
 
} else if (method.equals(METHOD_POST)) {
    doPost(req, resp);
     
} else if (method.equals(METHOD_PUT)) {
    doPut(req, resp);   
     
} else if (method.equals(METHOD_DELETE)) {
    doDelete(req, resp);
     
} else if (method.equals(METHOD_OPTIONS)) {
    doOptions(req,resp);
     
} else if (method.equals(METHOD_TRACE)) {
    doTrace(req,resp);
     
} else {
    //
    // Note that this means NO servlet supports whatever
    // method was requested, anywhere on this server.
    //
 
    String errMsg = lStrings.getString("http.method_not_implemented");
    Object[] errArgs = new Object[1];
    errArgs[0] = method;
    errMsg = MessageFormat.format(errMsg, errArgs);
     
    resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}

3)最后丐枉,web容器調(diào)用destroy()方法終止Servlet的服務(wù)哆键。如果希望在Servlet不可用之前關(guān)閉或銷毀某些文件系統(tǒng)或網(wǎng)絡(luò)資源,則應(yīng)該調(diào)用此方法瘦锹。destory()方法和init()方法一樣在Servlet整個生命周期中只被調(diào)用一次籍嘹。

public void destroy() {
    //
}

通常情況下闪盔,你不需要重寫Servlet的這些方法。

使用@WebServlet注解開發(fā)servlet

如果你不是很喜歡xml配置辱士,而特別喜歡注釋泪掀, Servlets API也有這樣的功能。您可以使用@WebServlet 颂碘,如下的例子异赫,那么你不需要在web.xml中做任何事情。在運行時會自動將Servlet注冊到容器头岔,并像往常一樣處理它塔拳。

package com.bill.servlets;
 
import java.io.IOException;
import java.io.PrintWriter;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet(name = "MyFirstServlet", urlPatterns = {"/MyFirstServlet"})
public class MyFirstServlet extends HttpServlet {
 
    private static final long serialVersionUID = -1915463532411657451L;
 
    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException 
    {
        //Do some work
    }
     
    @Override
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        //Do some other work
    }
}

打包并部署servlet到Tomcat服務(wù)器

如果您使用的是任何IDE(如Eclipse),那么打包和部署應(yīng)用程序非常簡單峡竣。右鍵單擊項目> Run As > Run As Server靠抑。如果尚未完成,就配置服務(wù)器适掰,然后就完成了颂碧。
如果您不使用任何IDE,那么您需要做一些額外的工作类浪,例如從命令提示符編譯應(yīng)用程序稚伍,使用Ant創(chuàng)建WAR文件等,但我確信現(xiàn)在每個人都使用一些IDE進(jìn)行開發(fā)戚宦,所以我不會在這里浪費更多的時間。
當(dāng)您在Tomcat中部署完我們寫的第一個Servlet锈嫩,然后在瀏覽器地址欄輸入http://localhost:8080/servletexamples/MyFirstServlet受楼,回車,你將得到下面的響應(yīng)呼寸。

在Servlet響應(yīng)中寫入動態(tài)內(nèi)容

Servlet之所以非常用用的原因是它允許給網(wǎng)頁內(nèi)容動態(tài)的加入一些內(nèi)容艳汽。內(nèi)容可以從服務(wù)器本身、數(shù)據(jù)庫对雪、另一個web站點或許多其他可訪問的web資源河狐。Servlet不是靜態(tài)的網(wǎng)頁,他們是動態(tài)的瑟捣,這是它們最關(guān)鍵的地方馋艺。

讓我們以Servlet為例,它負(fù)責(zé)向用戶顯示當(dāng)前日期和時間迈套,以及他的名字和一些自定義消息捐祠,代碼如下。

package com.bill.servlets;
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
@WebServlet(name = "CalendarServlet", urlPatterns = {"/CalendarServlet"})
public class CalendarServlet extends HttpServlet {
 
    private static final long serialVersionUID = -1915463532411657451L;
 
    @Override
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException 
    {
         
        Map<String,String> data = getData();
         
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            // Write some content
            out.println("<html>");
            out.println("<head>");
            out.println("<title>CalendarServlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h2>Hello " + data.get("username") + ", " + data.get("message") + "</h2>");
            out.println("<h2>The time right now is : " + new Date() + "</h2>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
     
    //This method will access some external system as database to get user name, and his personalized message
    private Map<String, String> getData() 
    {
        Map<String, String> data = new HashMap<String, String>();
        data.put("username", "Guest");
        data.put("message",  "Welcome to my world !!");
        return data;
    }
}

當(dāng)你在Tomcat中運行上面的Servlet桑李,然后在瀏覽器中請求http://localhost:8080/servletexamples/CalendarServlet踱蛀,你將得到下面的響應(yīng)

Servlet接受參數(shù)處理并響應(yīng)

Servlet可以很容易地創(chuàng)建web應(yīng)用程序窿给,給用戶的請求返回響應(yīng)。它們能夠提供HTTP響應(yīng)率拒,并在同一代碼體中處理業(yè)務(wù)邏輯崩泡。用于處理業(yè)務(wù)邏輯的能力使Servlet比標(biāo)準(zhǔn)的HTML代碼更強大。

在實際應(yīng)用程序中猬膨,HTML Web表單包含發(fā)送給Servlet的參數(shù)角撞。然后servlet以某種方式處理這些參數(shù),并給客戶端返回一個響應(yīng)寥掐。在一個HttpServlet對象的情況下靴寂,客戶端是一個web瀏覽器,響應(yīng)是一個網(wǎng)頁召耘。表單的action屬性標(biāo)簽指定了誰來處理表單中所包含的參數(shù)百炬。

調(diào)用HttpServletRequest對象的getparameter()方法獲取請求參數(shù),通過id獲得你想得到的參數(shù)污它。

String value1 = req.getParameter("param1");
String value1 = req.getParameter("param2");

一旦獲得這些值剖踊,就可以根據(jù)需要進(jìn)行處理。然后為客戶機返回響應(yīng)衫贬,正如我們在以上章節(jié)中討論的那樣德澈,用HttpServletResponse類型的對象給客戶端返回響應(yīng)。

一個基本的請求-處理-響應(yīng)的流程如下:

@Override
protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException 
{
     
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
     
    String username = request.getParameter("username");
    String password = request.getParameter("password");
     
    boolean success = validateUser(username, password);
     
    try {
        // Write some content
        out.println("<html>");
        out.println("<head>");
        out.println("<title>LoginServlet</title>");
        out.println("</head>");
        out.println("<body>");
 
        if(success) {
            out.println("<h2>Welcome Friend</h2>");
        }else{
            out.println("<h2>Validate your self again.</h2>");
        }
         
        out.println("</body>");
        out.println("</html>");
    } finally {
        out.close();
    }
}

你需要從HttpServletResponse對象獲得PrintWriter對象固惯,給客戶端返回內(nèi)容梆造。任何寫入它的內(nèi)容將被寫入OutputStream,然后數(shù)據(jù)將被發(fā)送回客戶端葬毫。

監(jiān)聽Servlet容器事件

有時候知道在容器中發(fā)生的某些事件是非常有用的镇辉。這個概念在許多不同的情況下都是有用的,但大多數(shù)情況下贴捡,它可能被用于在啟動時初始化忽肛,關(guān)閉時清理。一個Servlet可以在容器注冊Listener烂斋,以監(jiān)聽它何時啟動或關(guān)閉屹逛。因此,通過偵聽此類事件汛骂,Servlet有機會在發(fā)生某些事件時執(zhí)行某些操作罕模。

要創(chuàng)建一個基于容器的事件的監(jiān)聽器,你必須實現(xiàn)一個ServletContextListener接口的類香缺。需要實現(xiàn)contextInitialized()和contextDestroyed()方法手销。這兩種方法都接受一個ServletContextEvent作為參數(shù),并分別在每次Servlet容器初始化或關(guān)閉時被自動調(diào)用图张。

用給容器注冊監(jiān)聽器锋拖,可以使用以下技術(shù)之一:

  1. 利用@WebListener 注解诈悍。
  2. 在web.xml中注冊監(jiān)聽器。
  3. 使用ServletContext的addListener()方法兽埃。

請注意侥钳,ServletContextListener不是Servlet API中的唯一監(jiān)聽器。還有更多柄错,比如

  • javax.servlet.servletrequestlistener
  • javax.servlet.servletrequestattrbitelistener
  • javax.servlet.servletcontextlistener
  • javax.servlet.servletcontextattributelistener
  • javax.servlet.httpsessionlistener
  • javax.servlet.httpsessionattributelistener

根據(jù)你希望監(jiān)聽到的事件實現(xiàn)你自己的監(jiān)聽器類舷夺,如HttpSessionListener將監(jiān)聽每當(dāng)戶創(chuàng)建一個新的用戶Session或者銷毀時的事件。

給Servlet傳入初始化參數(shù)

今天大多數(shù)應(yīng)用程序需要設(shè)置一些在應(yīng)用程序/控制器啟動時傳給它們配置參數(shù)售貌。Servlet也可以在它們被第一請求的時候接受初始化參數(shù)给猾。

顯然,你可以在Servlet本身硬編碼的配置颂跨,但改變?nèi)魏嗡麄冃枰匦戮幾g一次整個應(yīng)用程序敢伸,沒有人會喜歡這樣做。

<web-app>
    <servlet>
        <servlet-name>SimpleServlet</servlet-name>
        <servlet-class>com.bill.servlets.SimpleServlet</servlet-class>
         
        <!-- Servlet init param -->
        <init-param>
            <param-name>name</param-name>
            <param-value>value</param-value>
        </init-param>
 
    </servlet>
 
</web-app>

一旦設(shè)置恒削,該參數(shù)通過調(diào)用 getServletConfig().getInitializationParameter() 和傳遞的參數(shù)的名稱來得到并使用池颈,如下面的代碼行所示:

String value = getServletConfig().getInitParameter("name");

給指定的請求增加Servlet過濾器

Web過濾器對于在訪問給定URL求之前調(diào)用某些功能,它非常有用钓丰。相比通過一個固定的URL請求一個Servlet躯砰,過濾器匹配一個模式的URL,在這些URL對應(yīng)的Servlet調(diào)用之前被調(diào)用携丁。這在許多情況下非常有用琢歇,如日志記錄、身份驗證或其他服務(wù)梦鉴。

過濾器必須實現(xiàn)javax.servlet.Filter接口矿微。方法包含init (),destroy()尚揣,和dofilter()方法。init ()和destroy()方法由容器調(diào)用掖举。dofilter()方法被用來定義過濾器類所要完成的任務(wù)快骗。如果你想要過濾器鏈,或者對應(yīng)一個URL有多個過濾器塔次,在web.xml配置文件中按順序配置即可方篮。

在web.xml配置文件中配置一個過濾器,使用XML的<filter> 和<filter-mapping>元素以及與它們相關(guān)的子元素標(biāo)簽励负。

<filter>
    <filter-name>LoggingFilter</filter-name>
    <filter-class>LoggingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LogingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

如果你想使用注釋來配置特定的Servlet過濾器藕溅,你可以使用@WebFilter注釋。

用Servlet下載二進(jìn)制文件

下載文件是幾乎所有web應(yīng)用程序的基本任務(wù)继榆。要下載文件巾表,Servlet必須提供與下載文件匹配的相同類型的響應(yīng)汁掠,它還必須在響應(yīng)標(biāo)頭中指出要包含附件,如下所示集币。

String mimeType = context.getMimeType( fileToDownload );
response.setContentType( mimeType != null ? mimeType : "text/plain" );
response.setHeader( "Content-Disposition", "attachment; filename=\"" + fileToDownload + "\"" );

你可以通過給ServletContext的getResourceAsStream() 方法傳一個路徑考阱,獲得一個你需要下載(被存在服務(wù)器的文件系統(tǒng)中)的文件的引用。這將返回一個InputStream對象可以用來讀取文件內(nèi)容鞠苟。然后創(chuàng)建一個字節(jié)緩沖區(qū)乞榨,用于讀取文件時從文件中獲取數(shù)據(jù)塊。最后真正的任務(wù)是讀取文件內(nèi)容并將它們復(fù)制到輸出流中当娱。這是通過使用一個while循環(huán)吃既,這將不斷讀取InputStream直到文件結(jié)束。使用循環(huán)將數(shù)據(jù)塊讀入并寫入輸出流跨细。在這之后鹦倚,ServletOutputStream 對象flush方法被調(diào)用,來清除內(nèi)容和釋放資源扼鞋。

讓我們看示例代碼

private void downloadFile(HttpServletRequest request, HttpServletResponse response, String fileToDownload) throws IOException
    {
        final int BYTES = 1024;
        int length = 0;
         
        ServletOutputStream outStream = response.getOutputStream();
        ServletContext context = getServletConfig().getServletContext();
 
        String mimeType = context.getMimeType( fileToDownload );
        response.setContentType( mimeType != null ? mimeType : "text/plain" );
        response.setHeader( "Content-Disposition", "attachment; filename=\"" + fileToDownload + "\"" );
 
        InputStream in = context.getResourceAsStream("/" + fileToDownload);
         
        byte[] bbuf = new byte[BYTES];
 
        while ((in != null) && ((length = in.read(bbuf)) != -1)) {
            outStream.write(bbuf, 0, length);
        }
 
        outStream.flush();
        outStream.close();
    }

用RequestDispatcher.forward()將請求內(nèi)部轉(zhuǎn)發(fā)到另一個servlet

有時亥揖,你的應(yīng)用程序需要一個Servlet完成部分任務(wù)挺勿,然后讓其他servlet完成剩下的任務(wù)。此外,請求應(yīng)該在不將客戶機重定向到另一個URL的情況下進(jìn)行傳遞佑附,即瀏覽器中的URL不應(yīng)更改。

調(diào)用ServletContext對象getRequestDispatcher ()方法獲得RequestDispatcher對象羞反,這個對象可以被用來內(nèi)部轉(zhuǎn)發(fā)偎肃。getRequestDispatcher ()調(diào)用方法時,傳遞一個字符串包含要把請求的Servlet的名字昏滴。通過將HttpServletRequestHttpServletResponse傳給RequestDispatcher的對象猴鲫,然后調(diào)用forword()方法。然后內(nèi)部轉(zhuǎn)發(fā)到另一個Servlet

RequestDispatcher rd = servletContext.getRequestDispatcher("/NextServlet");
rd.forward(request, response);

用HttpServletResponse.sendRedirect()將請求轉(zhuǎn)發(fā)到另一個servlet

盡管有時正如我們在上一節(jié)中看到的您不愿意通知用戶谣殊,Servlet重定向已經(jīng)發(fā)生拂共,但在某些場景中,我們實際上希望用戶知道姻几。當(dāng)訪問應(yīng)用程序中的特定URL時宜狐,您希望重定向瀏覽器到另一個URL。

要做到這一點蛇捌,你需要調(diào)用HttpServletResponse 對象的sendRedirect()方法抚恒。
這個簡單的重定向不會把HttpReuest的對象在servlet鏈條中傳遞。

用Servlet讀寫Cookie

許多應(yīng)用程序希望將用戶瀏覽歷史的當(dāng)前狀態(tài)存儲在客戶機中络拌,以便當(dāng)用戶再次返回應(yīng)用程序時俭驮,他從離開的位置開始。通常春贸,對于這個要求混萝,使用cookie遗遵。您可以將cookie視為存儲在客戶機上的鍵值對數(shù)據(jù)。當(dāng)從瀏覽器中發(fā)出請求時譬圣,瀏覽器可以讀取或?qū)懭脒@些值瓮恭。

簡單地實例化一個新的Javax.servlet.http.Cookie類創(chuàng)建一個cookie對象。一旦實例化了cookie厘熟,就可以設(shè)置屬性屯蹦,這將有助于配置cookie。在下面例子中绳姨,cookie的setMaxAge()和setHttpOnly()方法被調(diào)用登澜,設(shè)置cookie的有效期并防止客戶端腳本訪問。

由于Servlet 3.0 API,將cookie標(biāo)記為HTTP飘庄。這使得cookie可以防止客戶端腳本攻擊脑蠕,使cookie更加安全。

Cookie cookie = new Cookie("sessionId","123456789");
cookie.setHttpOnly(true);
cookie.setMaxAge(-30);
response.addCookie(cookie);

這里的response對象是傳給doXXX()方法中的參數(shù)跪削。

要從服務(wù)端獲得cookie信息谴仙,請使用以下代碼:

Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies)
{
    //cookie.getName();
    //cookie.getValue()
}

這就是本教程關(guān)于Servlet的所有技術(shù)。歡迎評論/反饋碾盐。

Happy Learning !!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末晃跺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子毫玖,更是在濱河造成了極大的恐慌掀虎,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件付枫,死亡現(xiàn)場離奇詭異烹玉,居然都是意外死亡,警方通過查閱死者的電腦和手機阐滩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門二打,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掂榔,你說我怎么就攤上這事址儒。” “怎么了衅疙?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鸳慈。 經(jīng)常有香客問我饱溢,道長,這世上最難降的妖魔是什么走芋? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任绩郎,我火速辦了婚禮潘鲫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肋杖。我一直安慰自己溉仑,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布状植。 她就那樣靜靜地躺著浊竟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪津畸。 梳的紋絲不亂的頭發(fā)上振定,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天,我揣著相機與錄音肉拓,去河邊找鬼后频。 笑死,一個胖子當(dāng)著我的面吹牛暖途,可吹牛的內(nèi)容都是我干的卑惜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼驻售,長吁一口氣:“原來是場噩夢啊……” “哼露久!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芋浮,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抱环,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纸巷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镇草,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年瘤旨,在試婚紗的時候發(fā)現(xiàn)自己被綠了梯啤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡存哲,死狀恐怖因宇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祟偷,我是刑警寧澤察滑,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站修肠,受9級特大地震影響贺辰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一饲化、第九天 我趴在偏房一處隱蔽的房頂上張望莽鸭。 院中可真熱鬧,春花似錦吃靠、人聲如沸硫眨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽礁阁。三九已至,卻和暖如春夕冲,著一層夾襖步出監(jiān)牢的瞬間氮兵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工歹鱼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泣栈,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓弥姻,卻偏偏與公主長得像南片,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庭敦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 從三月份找實習(xí)到現(xiàn)在疼进,面了一些公司,掛了不少秧廉,但最終還是拿到小米伞广、百度、阿里疼电、京東嚼锄、新浪、CVTE蔽豺、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,277評論 11 349
  • 這部分主要是與Java Web和Web Service相關(guān)的面試題区丑。 96、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,411評論 0 10
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理修陡,服務(wù)發(fā)現(xiàn)沧侥,斷路器,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • 0 系列目錄# WEB請求處理 WEB請求處理一:瀏覽器請求發(fā)起處理 WEB請求處理二:Nginx請求反向代理 本...
    七寸知架構(gòu)閱讀 13,971評論 22 190
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法魄鸦,類相關(guān)的語法宴杀,內(nèi)部類的語法,繼承相關(guān)的語法拾因,異常的語法旺罢,線程的語...
    子非魚_t_閱讀 31,664評論 18 399