博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
3.2servlet功能和会话技术
阅读量:3967 次
发布时间:2019-05-24

本文共 6762 字,大约阅读时间需要 22 分钟。

一.Servlet的功能

servlet在调用servlet()之前就会创建一个请求对象和一个响应对象,通过这两个对象来执行接收客户端信息的功能和向客户端响应数据的功能。就是用参数里传来的对象。

1. 接收客户端信息

1.获取请求参数
//getParameter(name) : 根据name获取对应的请求参数		//getParameterValues(name) : 根据name获取对应的请求参数 数组		//getParameterMap() : 获取所有的请求参数  使用Map进行封装接收		//getParameterNames() : 获取所有请求参数的name值		//getPart(name) : 根据name值 获取上传的信息		Enumeration
parameterNames = req.getParameterNames(); while(parameterNames.hasMoreElements()) {
System.out.println(parameterNames.nextElement()); } Map
parameterMap = req.getParameterMap(); System.out.println(parameterMap);
2.获取网络信息
//获取请求方法		String method = req.getMethod();		//获取协议		String protocol =  req.getProtocol();		// 获取本地端口		int localPort = req.getLocalPort();		//获取请求的url		StringBuffer requestURL = req.getRequestURL();		//获取资源路径		String requestURI = req.getRequestURI();
3.获取请求头信息
//根据头的name值  获取对应的header信息	String contentLength = req.getHeader("Content-Length");	//获取请求数据类型	String contentType = req.getContentType();
4.设置编码格式
req.setCharacterEncoding("UTF-8");
5.内部转发
req.getRequestDispatcher("地址").forward(req, resp);
6.获取其他作用域对象
req.getSession()  //获取session		req.getServletContext()  // 获取ServletContext  即  application
7.获取作用域中的属性值
getAttribute(name) //从作用域中根据属性名获取对应的属性值		getAttributeNames() //从作用域中,获取所有的属性的name值		req.setAttribute(name, value) //向作用域中设置属性值		req.removeAttribute(name) 根据name值  //从作用域中删除属性值

2.返回客户端响应信息

方法 说明
设置响应数据的编码格式 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.基本概念

就是让服务器能够记住用户的信息

1 .为什么需要会话技术

由于HTTP是无状态协议,没有记忆力,不知道哪一个客户端请求了自己,每个请求之间无法共享数据。例如在购物系统中,用户将购买的商品信息存储到哪里呢?也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术来识别客户端的状态。会话技术用来帮助服务器记住客户端状态,即区分客户端。

由于服务器不会主动刻意记录客户端信息,导致若客户端需要使用之前访问的数据,则需要:

1.将之前的数据,当做参数提交给服务器。

2.重新将之前的数据查询出来,然后进行使用。

为此web提供了会话技术,来简化以上2种方案。

对于第一种方案,web技术,使用cookie技术进行简化。

服务器,将客户端的下次需要传递的数据,写到浏览器中,让浏览器每次请求时,自动的将数据提交给服务器。

为了区分,单独使用一个头标识,使用cookie进行了标识。并且,浏览器还是支持将这个数据进行持久化操作。

而第二种方案,使用session技术进行简化。

将需要使用的数据,存在服务器的内存中,然后给一个标识给客户端,若客户端想要使用这个数据,则通过客户端的标识,从服务器中获取这个数据。默认是使用cookie将这个标识传给服务器。session技术依托于cookie技术的。

2. 什么是会话技术

从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,称为一次会话。

会话是浏览器与服务器之间的一次通信,它包含浏览器与服务器之间的多次请求、响应过程,浏览器关闭后本次会话结束。

会话的功能:在一次会话的范围内的多次请求间,共享数据

两种方式:

客户端会话技术: Cookie 把数据存到客户端

服务器端会话技术: Session 把数据存到服务器端

2.Cookie

在客户端第一次访问服务器时,服务器给客户端一个凭证。这个凭证由客户端的浏览器保存。

每次客户端访问时,将这个凭证带过来.这样服务器就可以识别.如果该凭证有效,则继续使用,否则服务器会给一个新

的凭证.

这时容易出现数据安全问题.由于这个信息存储在客户端上,更换浏览器就会丢失.更换了终端也会丢失.在实际开发中,Cookie的使用越来越少了.

Cookie可以用于: 访问历史记录.购物车.记住密码.

1.如何使用Cookie
  1. cookie是谁创建? cookie是服务器创建的
  2. 客户端如何有cookie的? 服务器创建了cookie后,将cookie写入响应信息中

步骤:

1.创建一个Servlet,创建cookie

Cookie cookie = new Cookie("cookieName", "cookieValue");

2.将创建的cookie写到响应信息中

resp.addCookie(cookie);  		//将cookie 放入响应头中		//跳转页面  将cookie信息返回给浏览器   下次请求  浏览器会默认带上 cookie信息		resp.sendRedirect("index.jsp");
2.cookie中相关方法
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的描述信息
3.cookie不足

在现在,由于cookie是存储在客户端本地的。可能出现数据泄露。存在安全问题。

由于,当前网络发展,客户端是多样性的。数据存储在某一个指定的客户端中,其他客户端是没有数据的。没法实现数据共享。

4.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); } } } } }}

用户名:

密码:

记住密码:

3.Session

存储在服务器端的信息,是一种服务器将信息存储在服务端的技术.

由于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.

1.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); }}
2.Session案例

使用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/

你可能感兴趣的文章
动态链接库
查看>>
工作队列的初始化(INIT_WORK的参…
查看>>
生成和使用动态链接库和静态链接库…
查看>>
linux工作队列(转)
查看>>
工作队列的初始化(INIT_WORK的参…
查看>>
sysfs and /proc/bus/usb/device
查看>>
linux工作队列(转)
查看>>
跟我一起写udev规则(译)
查看>>
sysfs and /proc/bus/usb/device
查看>>
跟我一起写udev规则(译)
查看>>
USB和sysfs文件系统
查看>>
USB和sysfs文件系统
查看>>
udev(八):实战:使用udevadm修…
查看>>
android开发环境搭建(for 驱动开发…
查看>>
android开发环境搭建(for 驱动开发…
查看>>
android驱动例子(LED灯控制)
查看>>
为Android内核添加新驱动,并添加…
查看>>
Android编译环境(1) - 编译Native …
查看>>
2011年07月14日
查看>>
android内核源代码获取方法
查看>>