本文共 6762 字,大约阅读时间需要 22 分钟。
servlet在调用servlet()之前就会创建一个请求对象和一个响应对象,通过这两个对象来执行接收客户端信息的功能和向客户端响应数据的功能。就是用参数里传来的对象。
//getParameter(name) : 根据name获取对应的请求参数 //getParameterValues(name) : 根据name获取对应的请求参数 数组 //getParameterMap() : 获取所有的请求参数 使用Map进行封装接收 //getParameterNames() : 获取所有请求参数的name值 //getPart(name) : 根据name值 获取上传的信息 EnumerationparameterNames = req.getParameterNames(); while(parameterNames.hasMoreElements()) { System.out.println(parameterNames.nextElement()); } Map parameterMap = req.getParameterMap(); System.out.println(parameterMap);
//获取请求方法 String method = req.getMethod(); //获取协议 String protocol = req.getProtocol(); // 获取本地端口 int localPort = req.getLocalPort(); //获取请求的url StringBuffer requestURL = req.getRequestURL(); //获取资源路径 String requestURI = req.getRequestURI();
//根据头的name值 获取对应的header信息 String contentLength = req.getHeader("Content-Length"); //获取请求数据类型 String contentType = req.getContentType();
req.setCharacterEncoding("UTF-8");
req.getRequestDispatcher("地址").forward(req, resp);
req.getSession() //获取session req.getServletContext() // 获取ServletContext 即 application
getAttribute(name) //从作用域中根据属性名获取对应的属性值 getAttributeNames() //从作用域中,获取所有的属性的name值 req.setAttribute(name, value) //向作用域中设置属性值 req.removeAttribute(name) 根据name值 //从作用域中删除属性值
方法 | 说明 |
---|---|
设置响应数据的编码格式 | resp.setCharacterEncoding(“UTF-8”) |
设置响应数据显示的格式 | resp.setContentType(“text/html;charset=UTF-8”) |
获取响应对象的输出流 | PrintWriter writer = resp.getWriter()ServletOutputStream outputStream = resp.getOutputStream() |
向客户端写入cookie | Cookie cookie = new Cookie(“cookieName”, “cookieValue”)resp.addCookie(cookie) |
设置响应头信息 | resp.addHeader(“zhangsansan”, “suxiaoxiao”) |
重定向 | resp.sendRedirect(“index.jsp”) |
就是让服务器能够记住用户的信息
1 .为什么需要会话技术
由于HTTP是无状态协议,没有记忆力,不知道哪一个客户端请求了自己,每个请求之间无法共享数据。例如在购物系统中,用户将购买的商品信息存储到哪里呢?也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术来识别客户端的状态。会话技术用来帮助服务器记住客户端状态,即区分客户端。
由于服务器不会主动刻意记录客户端信息,导致若客户端需要使用之前访问的数据,则需要:
1.将之前的数据,当做参数提交给服务器。
2.重新将之前的数据查询出来,然后进行使用。
为此web提供了会话技术,来简化以上2种方案。
对于第一种方案,web技术,使用cookie技术进行简化。
服务器,将客户端的下次需要传递的数据,写到浏览器中,让浏览器每次请求时,自动的将数据提交给服务器。
为了区分,单独使用一个头标识,使用cookie进行了标识。并且,浏览器还是支持将这个数据进行持久化操作。
而第二种方案,使用session技术进行简化。
将需要使用的数据,存在服务器的内存中,然后给一个标识给客户端,若客户端想要使用这个数据,则通过客户端的标识,从服务器中获取这个数据。默认是使用cookie将这个标识传给服务器。session技术依托于cookie技术的。
2. 什么是会话技术
从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话。
会话是浏览器与服务器之间的一次通信,它包含浏览器与服务器之间的多次请求、响应过程,浏览器关闭后本次会话结束。
会话的功能:在一次会话的范围内的多次请求间,共享数据
两种方式:
客户端会话技术: Cookie 把数据存到客户端
服务器端会话技术: Session 把数据存到服务器端
在客户端第一次访问服务器时,服务器给客户端一个凭证。这个凭证由客户端的浏览器保存。
每次客户端访问时,将这个凭证带过来.这样服务器就可以识别.如果该凭证有效,则继续使用,否则服务器会给一个新
的凭证.
这时容易出现数据安全问题.由于这个信息存储在客户端上,更换浏览器就会丢失.更换了终端也会丢失.在实际开发中,Cookie的使用越来越少了.
Cookie可以用于: 访问历史记录.购物车.记住密码.
步骤:
1.创建一个Servlet,创建cookie
Cookie cookie = new Cookie("cookieName", "cookieValue");
2.将创建的cookie写到响应信息中
resp.addCookie(cookie); //将cookie 放入响应头中 //跳转页面 将cookie信息返回给浏览器 下次请求 浏览器会默认带上 cookie信息 resp.sendRedirect("index.jsp");
cookie.getName() : //获取cookie的name值cookie.getValue() : //获取cookie的value值cookie.setMaxAge(time) : //设置cookie 最大有效时间 单位是秒 如果是 0 则会删除这个cookiecookie.setPath(uri) :// 设置cookie生效的路径,假如 设置cookie 在多个项目中生效cookie.setHttpOnly(httpOnly) : //是否允许客户端脚本访问cookie 若设置为true 则js无法访问这个cookiecookie.setDomain(pattern) : //设置生效的域名cookie.setComment(purpose) : //设置cookie的描述信息
在现在,由于cookie是存储在客户端本地的。可能出现数据泄露。存在安全问题。
由于,当前网络发展,客户端是多样性的。数据存储在某一个指定的客户端中,其他客户端是没有数据的。没法实现数据共享。
场景:来一个记住密码的勾选,有记住密码和忘记密码的作用
@WebServlet("/login.do")public class LoginController extends HttpServlet { private static final long serialVersionUID = 8806988355645425860L; @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String userName = req.getParameter("userName"); String password = req.getParameter("password"); String rember = req.getParameter("rember"); //记住密码 if("1".equals(rember)) { Cookie userNameCookie = new Cookie("userName", userName); userNameCookie.setMaxAge(60*60*24*3); Cookie passwordCookie = new Cookie("password", password); passwordCookie.setMaxAge(60*60*24*3); resp.addCookie(userNameCookie); resp.addCookie(passwordCookie); }else { //不记住密码 删除Cookie Cookie[] cookies = req.getCookies(); if(cookies != null) { for (Cookie cookie : cookies) { String name = cookie.getName(); if(name.equals("userName")) { //Cookie 设置为0 删除Cookie cookie.setMaxAge(0); resp.addCookie(cookie); } if(name.equals("password")) { cookie.setMaxAge(0); resp.addCookie(cookie); } } } } }}
存储在服务器端的信息,是一种服务器将信息存储在服务端的技术.
由于Cookie中存储信息,不安全,所以Session这种技术,将数据存储在服务器中,然后将存储的数据有个ID值,服务器将整个ID值存在cookie中,然后客户端每次请求时,会自动的将这个cookie带到服务器,服务器根据这个session的id值,找到session中存储的数据.session是依赖cookie的.
SESSION和COOKIE的关系
session的本质,是存储在服务器内存中的一个对象。根据Cookie中JSESSIONID的值查找。
注意: 在JSP页面中,默认会创建SESSION。但是在Servlet中,需要手动的创建。
根据不同的JSESSIONID,会从服务器获取不同的SESSION对象。所以,不同客户端其使用的SESSION是不一样的。若JSESSIONID不一样,那么其获取的SESSION也不一样。3.Session
Session存储在服务器.并且Session是依赖Cookie的.服务器会给浏览器一个Cookie信息,JSESSIONID是Session的ID,浏览器每次请求会将这个信息带到服务器,从而换取Session.
应用场景:
当前用户,即用户登录后将用户信息放入session中,然后以后取的时候,直接从session中取.
验证码,将验证码放入session,用户输入的验证,与session验证码进行对比.一致,则通过.
局限性
由于Session是存储在服务器内存中,若服务器是多个节点的,则session无法共享.session失效了.在生产场景中,若是多台服务器,一般使用中间件存储session.
@WebServlet("/session.do")public class SessionServlet extends HttpServlet { private static final long serialVersionUID = -5145647028038928413L; @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取Session 获取一个与当前request对象关联的session HttpSession session = req.getSession(); // 设置属性值 //session.setAttribute(name, value); //session.getAttribute(name); //session.getAttributeNames(); //session.removeAttribute(name); // 获取sessionID System.out.println(session.getId()); // 设置session的存活时间, 0 或者 负数 表示永远有效 服务器默认session失效是 30分钟 //session.setMaxInactiveInterval(interval); }}
使用Session存储当前用户
private void login(HttpServletRequest req, HttpServletResponse resp) throws IOException { String userName = req.getParameter("userName"); String password = req.getParameter("password"); User user = userService.login(userName, password); if(user != null) { //跳转到学生列表 : 跳转到学生列表 : 学生列表页面必须要有数据 //获取session HttpSession session = req.getSession(); //将用户信息放入session session.setAttribute("user", user); resp.sendRedirect("student.do?service=list"); }else { resp.sendRedirect("login.jsp"); } }
欢迎您:${user.realName}
转载地址:http://iqyki.baihongyu.com/