HTTP是基于请求/响应的无状态的通信协议。
使服务器记得此次请求与之后请求关系的方式,叫做会话管理。
隐藏域:由浏览器在每次请求时主动告知服务器多次请求间必要的信息。仅适用于一些简单的状态 管理,如在线问卷。
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * Created by N3verL4nd on 2017/2/21. */ @WebServlet("/questionnaire") public class HiddenFieldServlet extends HttpServlet { private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); //response.setHeader("Content-Type", "text/html; charset=UTF-8"); //response.addHeader("Content-Type", "text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println( "<!DOCTYPE html>" + "<html>" +"<head>" +"<title>问卷调查</title>" +"</head>" +"<body>" ); String page = request.getParameter("page"); out.println("<form action='questionnaire' method='post'>"); if (page == null){ out.println("问题一:<input type='text' name='p1q1' /><br />"); out.println("问题二:<input type='text' name='p1q2' /><br />"); out.println("<input type='submit' name='page' value='下一页' />"); }else if ("下一页".equals(page)){ String p1q1 = request.getParameter("p1q1"); String p1q2 = request.getParameter("p1q2"); out.println("问题三:<input type='text' name='p2q1' />"); out.println("<input type='hidden' name='p1q1' value='" + p1q1 + "' />"); out.println("<input type='hidden' name='p1q2' value='" + p1q2 + "' />"); out.println("<input type='submit' name='page' value='完成' />"); }else if ("完成".equals(page)){ out.println(request.getParameter("p1q1") + "<br />"); out.println(request.getParameter("p1q2") + "<br />"); out.println(request.getParameter("p2q1") + "<br />"); } out.println("</form>"); out.println("</body>"); out.println("</html>"); out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } }
cookie:
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * Created by N3verL4nd on 2017/2/23. */ @WebServlet(name = "SetServlet", urlPatterns = {"/setcookies.do"}) public class SetServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { for (int i = 0; i < 5; i++){ Cookie cookie = new Cookie(String.valueOf(i), "xiya"); response.addCookie(cookie); } response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("设置cookies" + "<br />"); out.println("<a href='showcookies.do'>showcookies</a>"); out.close(); } }
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * Created by N3verL4nd on 2017/2/23. */ @WebServlet(name = "ShowServlet", urlPatterns = {"/showcookies.do"}) public class ShowServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>显示Cookies</title>"); out.println("</head>"); out.println("<body>"); out.println("<body>"); out.println("<table>"); out.println("<tr>"); out.println("<th>Cookie Name</th>"); out.println("<th>Cookie Value</th>"); out.println("</tr>"); Cookie[] cookies = request.getCookies(); if(cookies != null){ for (Cookie cookie : cookies){ String key = cookie.getName(); String value = cookie.getValue(); out.println("<tr>"); out.println("<td>" + key + "</td>"); out.println("<td>" + value + "</td>"); out.println("</tr>"); } } out.println("</table>"); out.println("</body>"); out.println("</html>"); } }
url重写:其实就是GET请求参数的应用,当服务器响应浏览器上一次请求时,将某些相关信息以超链接方式响应给浏览器,超链接中包含参数信息。
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; /** * Created by N3verL4nd on 2017/2/22. */ @WebServlet(name = "SearchServlet", urlPatterns = {"/search.do"}) public class SearchServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>调查</title>"); out.println("</head>"); out.println("<body>"); String start = request.getParameter("start"); if (start == null){ start = "1"; } int count = Integer.parseInt(start); int begin = 10 * count - 9; int end = 10 * count; out.println("第 " + begin + " 到 " + end + " 搜索结果<br />"); out.println("<ul>"); for (int i = begin; i <= end; i++){ out.println("<li>搜索结果" + i + "</li>"); } out.println("</ul>"); for (int i = 1; i < 10; i++){ if (i == count){ out.println(i); continue; } out.println("<a href='search.do?start=" + i + "'>" + i + "</a>"); } out.println("</body>"); out.println("</html>"); } }
在Servlet/JSP中可以使用HttpSession来进行会话管理。
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; /** * Created by N3verL4nd on 2017/2/22. */ @WebServlet(name = "SessionServlet", urlPatterns = {"/session.do"}) public class SessionServlet extends HttpServlet { private void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println( "<!DOCTYPE html>" + "<html>" +"<head>" +"<title>问卷调查</title>" +"</head>" +"<body>" ); String page = request.getParameter("page"); out.println("<form action='session.do' method='post'>"); if (page == null){ out.println("问题一:<input type='text' name='p1q1' /><br />"); out.println("问题二:<input type='text' name='p1q2' /><br />"); out.println("<input type='submit' name='page' value='下一页' />"); }else if ("下一页".equals(page)){ String p1q1 = request.getParameter("p1q1"); String p1q2 = request.getParameter("p1q2"); HttpSession session = request.getSession(); System.out.println(session.getId()); session.setAttribute("p1q1", p1q1); session.setAttribute("p1q2", p1q2); out.println("问题三:<input type='text' name='p2q1' /><br />"); out.println("<input type='submit' name='page' value='完成' />"); }else if ("完成".equals(page)){ String p2q1 = request.getParameter("p2q1"); HttpSession session = request.getSession(); System.out.println(session.getId()); session.setAttribute("p2q1", p2q1); out.println(session.getAttribute("p1q1") + "<br />"); out.println(session.getAttribute("p1q2") + "<br />"); out.println(session.getAttribute("p2q1") + "<br />"); } out.println("</form>"); out.println("</body>"); out.println("</html>"); out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } }
如上所示,HttpSession是通过HttpServletRequest获得的,但是该实例存在于Web容器内。
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; /** * Created by N3verL4nd on 2017/2/23. */ @WebServlet(name = "SessionInfoServlet", urlPatterns = {"/SessionInfoServlet"}) public class SessionInfoServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF-8"); HttpSession session = request.getSession(); //session.setMaxInactiveInterval(10);//多少秒失效 PrintWriter out = response.getWriter(); out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>SessionInfoServlet</title>"); out.println("</head>"); out.println("<body>"); out.println("New Session:" + session.isNew() + "<br />"); out.println("Session ID:" + session.getId() + "<br />"); out.println("getCreationTime:" + new Date(session.getCreationTime()) + "<br />"); out.println("getLastAccessedTime:" + new Date(session.getLastAccessedTime()) + "<br />"); out.println("getRequestedSessionId:" + request.getRequestedSessionId() + "<br />"); out.println("isRequestedSessionIdFromURL:" + request.isRequestedSessionIdFromURL() + "<br />"); out.println("isRequestedSessionIdFromCookie:" + request.isRequestedSessionIdFromCookie() + "<br />"); out.println("isRequestedSessionIdValid:" + request.isRequestedSessionIdValid() + "<br />"); out.println("<br /><a href='" + response.encodeURL("SessionInfoServlet") + "'>刷新</a><br />"); } }
对于以上程序,我们使用Fiddler抓包观察下:
第一次调用该Servlet会返回Set-Cookie,第二次调用我们会向HTTP服务器发送该cookie来获取Web容器内对应的HttpSession。