求个网站你明白的,郑州建设电商网站,vfp网站开发,组服务器做网站一、核心知识点#xff08;重点#xff09;#xff1a;
1.1 Cookie
1. Cookie#xff1a;是一种客户端会话技术#xff0c;数据会被保存在客户端#xff0c;Cookie会携带数据访问服务器#xff0c;用以完成一次会话内多次请求间的数据共享
2. 过程#xff1a;浏览器…一、核心知识点重点
1.1 Cookie
1. Cookie是一种客户端会话技术数据会被保存在客户端Cookie会携带数据访问服务器用以完成一次会话内多次请求间的数据共享
2. 过程浏览器客户端先向服务端发送请求服务端会发送一个Cookie给客户端在此后同一次会话中每次客户端都会将Cookie发送给服务端数据层层叠加。
3. Cookie存活时间默认情况下Cookie存储在浏览器内存中当浏览器关闭内存释放则Cookie被销毁。调用setMaxAge(int seconds)可以设置Cookie的存活时间。
4. Cookie的发送和获取 1.2 Session
1. Session服务端的会话跟踪技术将数据保存在服务端。JavaEE提供HttpSession接口来实现一次会话的多次请求间数据共享功能。Session的实现是基于Cookie的。 2. Session的钝化和活化钝化在服务器正常关闭后Tomcat会自动将Session数据写入硬盘的文件中。活化再次启动服务器后从文件中加载数据到Session中。
3. Session的销毁在web.xml中可以用session-timeout标签进行更改销毁时间。 1.3 HTTP
1. HTTPHyper Text Transfer Protocol 超文本传输协议规定了浏览器和服务器之间数据传输的规则服务器和客户端之间进行数据交互的格式。
2. HTTP协议特点1. 基于TCP协议面向连接、安全。2. 基于请求-响应模型的一次请求对应一次响应。3. HTTP协议是无状态的协议对于事务处理没有记忆能力。每次请求-响应都是独立的。缺点多次请求间不能共享数据。Java中用会话技术如Cookie、Session来解决这个问题优点速度快。
3. GET和POST的区别1. GET请求的请求参数在请求行中没有请求体。POST请求的请求参数在请求体中。2. GET请求的请求参数大小有限制POST没有限制。
4. 状态码302 Found 找到。304 Not Modified 没有修改。400 Bad Request 错误的请求。403 Forbidden 拒绝。404 Not Found 请求资源不存在。428 Precondition Required 有条件请求。 429 Too Many Requests 太多请求。431 Request Header Fields Too Large 请求头太大。405 Method Not Allowed 请求方式有误。500 Internal Server Error 服务器发生不可预期的错误。503 Service Unavailable 服务器尚未准备好处理请求。511 Network Authentication Required 需要进行身份验证。 二、会话跟踪技术CookieSession
1.1 预备知识
1. 会话用户打开浏览器访问web服务器的资源会话建立直到有一方断开连接会话结束。在一次会话中可以包含多次请求和响应。
2. 会话跟踪一种维护浏览器状态的方法服务器需要识别多次请求是否来自于同一个浏览器以便在同一次会话的多次请求间共享数据。
3. 为什么需要会话跟踪技术
因为HTTP协议是无状态的如果是有状态的则后面的请求要携带前面请求所有的数据会导致请求的体量很大访问的速度会很慢每次浏览器向服务器请求时服务器都会将该请求视为新的请求因此我们需要会话跟踪技术来实现会话内数据共享。
4. 实现方式客户端会话跟踪技术Cookie服务端会话跟踪技术Session。 1.2 Cookie基本使用
Cookie客户端会话技术将数据保存到客户端以后每次请求都携带Cookie数据进行访问。
过程浏览器客户端先向服务端发送请求服务端会发送一个Cookie给客户端在此后同一次会话中每次客户端都会将Cookie发送给服务端数据层层叠加。
1.2.1 发送Cookie 在java-web-cookie路径下创建AServlet类写入下面的代码
WebServlet(/aServlet)
public class AServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//发送CookieCookie cookie new Cookie(username, zhangsan);//1.创建Cookie对象response.addCookie(cookie);//2.发送Cookie。response}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
F12-设置-Cookie和网站权限-管理和删除cookie和站点数据-查看所有Cookkie和站点数据 1.2.2 获取Cookie WebServlet(/bServlet)
public class BServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取CookieCookie[] cookies request.getCookies();//获取Cookie数组for(Cookie cookie:cookies) { //遍历数组String name cookie.getName();if(username.equals(name)){String value cookie.getValue(); //使用Cookie对象获取数据System.out.println(name : value);break; } } }Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
1.3 Cookie原理和使用细节
Cookie的实现是基于HTTP协议的响应头set-cookie是服务端发送给浏览器里面会装有Cookie携带的数据请求头cookie是浏览器发送给服务端里面同样装有数据
1. Cookie存活时间默认情况下Cookie存储在浏览器内存中当浏览器关闭内存释放则Cookie被销毁。
调用setMaxAge(int seconds)可以设置Cookie的存活时间。正数将Cookie写入浏览器所在电脑的硬盘持久化存储到时间自动删除。负数默认值当浏览器关闭则Cookie被销毁。零删除。
2. Cookie存储中文Cookie不能直接存储中文。需要将中文转化成其它编码格式存储等到要显示时再解析为非中文的数据。
因此可以在Cookie的发送端调用URLEncoder将字符串转化为UTF-8的格式
String value张三;
value URLEncoder.encode(value, UTF-8);
然后再Cookie的接收端调用URLDecoder将字符串解码为中文字符串
String value cookie.getValue();
value URLDecoder.decode(value,UTF-8);
1.4 Session基本使用
Session服务端的会话跟踪技术将数据保存在服务端。JavaEE提供HttpSession接口来实现一次会话的多次请求间数据共享功能。 Session发送端
WebServlet(/demo1)
public class SessionDemo1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//存储到Session中HttpSession session request.getSession();//1. 获取Session对象session.setAttribute(username,zs);//2. 存储数据}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
Session接收端
WebServlet(/demo2)
public class SessionDemo2 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取数据从session中HttpSession session request.getSession();//1. 获取Session对象Object username session.getAttribute(username);//2. 获取数据System.out.println(username);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);}
}
1.5 Session原理和使用细节
Session的实现是基于Cookie的。
通过打印发送端和接收端的Session地址可以发现二者的地址都是相同的因此在一次会话的多次请求中Session是相同的。
原理Session对象具有唯一标识叫作id。浏览器向网页发出请求网页端的Tomcat作出响应当发现使用了Session会将id当作一个Cookie发送给浏览器同时设置头set-cookie:JSESSIONIDid浏览器会将Cookie存储在内存里。下一次浏览器携带cookieJSESSIONIDid这个Cokie头访问服务器。服务器识别到Cookie头就会在内存里寻找是否带有这个头的Session对象。
Session的钝化在服务器正常关闭后Tomcat会自动将Session数据写入硬盘的文件中。
Session的活化再次启动服务器后从文件中加载数据到Session中。
所以服务器重启之后Session中的数据不会丢失前提是要正常的关闭和重启。但是Session不是同一个Session。
Session的销毁 默认在web.xml中可以用session-timeout标签进行更改销毁时间。
1.6 案例
1. 用户登录 思路Web层接收用户名和密码调用Service层的方法传入username和password会在Dao层中执行SQL语句最终会返回一个User对象如果User不为null则登录成功反之登录失败。 UserService代码如下
public class UserService {SqlSessionFactory factory SqlSessionFactoryUtils.getSqlSessionFactory();public User login(String username, String password){SqlSession sqlSession factory.openSession();UserMapper mapper sqlSession.getMapper(UserMapper.class);User user mapper.select(username, password);sqlSession.close();return user;}
}
UserService代码如下
public class UserService {SqlSessionFactory factory SqlSessionFactoryUtils.getSqlSessionFactory();public User login(String username, String password){SqlSession sqlSession factory.openSession();UserMapper mapper sqlSession.getMapper(UserMapper.class);User user mapper.select(username, password);sqlSession.close();return user;}
} LoginServlet代码如下
WebServlet(/loginServlet)
public class LoginServlet extends HttpServlet {private UserService service new UserService();Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username req.getParameter(username);String password req.getParameter(password);User user service.login(username,password);if(user ! null){//xxx欢迎您这里的xxx是username所以要把username存到共享域里用sessionHttpSession session req.getSession();session.setAttribute(user,user); //第1个参数是键第2个参数是值String contextPath req.getContextPath(); //动态获取虚拟目录resp.sendRedirect(contextPath /selectAllServlet);}else{System.out.println(错误输出了);req.setAttribute(login_msg,用户名或密码错误); //对应的是login.jsp中的${login_msg}用于显示错误信息//跳转到login.jsp还要携带错误信息提示req.getRequestDispatcher(/login.jsp).forward(req,resp);//转发的原因是在request域里存储数据只能用转发}}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}
}还要修改下面2个地方 2. 记住用户 在用户名和密码匹配成功且勾选的前提下的判断语句内加入如下代码
if(1.equals(remember)){ //1写前面可以防止空指针异常Cookie c_username new Cookie(username,username);//勾选了发送Cookie,先创建对象Cookie c_password new Cookie(password,password);c_username.setMaxAge(60*60*24*7);//设置保存时间c_password.setMaxAge(60*60*24*7);resp.addCookie(c_username); //发送cookieresp.addCookie(c_password);
}
更改下面这个地方 3. 用户注册 在Service层的UserService中写入如下代码
//注册方法public boolean register(User user){SqlSession sqlSession factory.openSession();UserMapper mapper sqlSession.getMapper(UserMapper.class);User user1 mapper.selectByUsername(user.getUsername());if(user1null) {mapper.add(user);sqlSession.commit();}sqlSession.close();return user1 null;}
在Web层的RegisterServlet中写入如下代码
WebServlet(/registerServlet)
public class RegisterServlet extends HttpServlet {private UserService service new UserService();Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username req.getParameter(username);String password req.getParameter(password);User user new User();user.setUsername(username);user.setPassword(password);boolean flag service.register(user);if(flag){req.setAttribute(register_msg,注册成功请登录);req.getRequestDispatcher(/login.jsp).forward(req,resp);}else{req.setAttribute(register_msg,用户名已存在);req.getRequestDispatcher(/register.jsp).forward(req,resp);}}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}
}
然后再修改如下2个地方 4. 验证码 首先要导入一个CheckCodeUtil用于生成验证码 checkCode存储用户输入的验证码checkCodeGen存储程序生成的验证码存储在session中然后对二者进行比对执行跳转如果匹配不成功直接返回。 //获取用户输入的验证码String checkCode req.getParameter(checkCode);//获取程序的验证码HttpSession session req.getSession();String checkCodeGen (String)session.getAttribute(checkCodeGen);//比对if(!checkCodeGen.equalsIgnoreCase(checkCode)){req.setAttribute(register_msg,验证码错误);
req.getRequestDispatcher(/register.jsp).forward(req,resp);return;
}
checkCodeServlet写入如下代码用于生成验证码然后存储到session中
WebServlet(/checkCodeServlet)
public class CheckCodeServlet extends HttpServlet {private UserService service new UserService();Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ServletOutputStream os resp.getOutputStream(); //输出流String checkCode CheckCodeUtil.outputVerifyImage(100, 50, os, 4); //返回验证码的值HttpSession session req.getSession();session.setAttribute(checkCodeGen,checkCode);// 存入session}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);}
}
修改如下地方 三、HTTP相关知识点
1.1 预备知识
B/S架构Browser/Server浏览器/服务器 架构模式它的特点是客户端只需要浏览器应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器获取Web资源服务器把Web资源发给浏览器即可。好处易于维护和升级客户端无需任何部署可以使用新版本。
静态资源HTML、CSS、JavaScript、图片等。负责页面展示
动态资源Servlet、JSP等。负责逻辑处理。
数据库负责存储数据。
Web服务器Tomcat负责解析HTTP协议解析请求数据并发送响应数据。
PS自动登录、商品的历史记录是用会话技术实现的Cookie、Session。过滤器是过滤掉某些请求。
1.2 HTTP协议及特点
HTTPHyper Text Transfer Protocol 超文本传输协议规定了浏览器和服务器之间数据传输的规则服务器和客户端之间进行数据交互的格式。
HTTP协议特点
1. 基于TCP协议面向连接、安全
2. 基于请求-响应模型的一次请求对应一次响应
3. HTTP协议是无状态的协议对于事务处理没有记忆能力。每次请求-响应都是独立的。缺点多次请求间不能共享数据。Java中用会话技术如Cookie、Session来解决这个问题优点速度快。
1.3 HTTP请求数据格式
1. 请求行请求数据的第一行。其中GET表示请求方式斜杠/表示请求资源路径HTTP/1.1表示协议版本。 2. 请求头第二行开始格式为key:value形式。Host表示请求的主机名。User-Agennt浏览器的版本。Accept浏览器能接收的资源类型接收文本text/*接收图片image/*所有*/*。Accept-Language表示浏览器偏好的语言。Accept-Encoding表示浏览器可以支持的压缩类型。
3. 请求体POST请求的最后一部分存放请求参数。 1.4 GET和POST的区别
1. GET请求的请求参数在请求行中没有请求体。POST请求的请求参数在请求体中。
2. GET请求的请求参数大小有限制POST没有限制。
1.5 HTTP响应数据格式
1. 响应行响应数据的第一行。其中HTTP/1.1表示协议版本200表示响应状态码OK表示状态机描述。 2. 响应头第二行开始格式为keyvalue形式。Content-Type表示该响应内容的类型比如text/html、image/jpeg。Content-Length表示响应内容的长度。Content-Encoding表示该响应压缩算法。Cache-Control指示客户端应如何缓存。
3. 响应体最后一部分存放响应数据。
1.6 状态码
1xx 响应中 ——临时状态码表示请求已经接受告诉客户端应该继续请求或者如果它已经完成则忽略它。 2xx 成功 ——表示请求已经被成功接收处理已完成。
200 OK 客户端请求成功即处理成功这是我们最想看到的状态码 3xx 重定向 ——资源已经存储到了其它地方重定向到其它地方它让客户端再发起一个请求以完成整个处理。
302 Found 指示所请求的资源已移动到由Location响应头给定的 URL浏览器会自动重新访问到这个页面请求的资源移动到了另外一个位置通过Location给出了位置的URL。 304 Not Modified 没有修改。告诉客户端你请求的资源至上次取得后服务端并未更改你直接用你本地缓存吧相当于隐式的重定向。 4xx 客户端错误 ——【处理发生错误责任在客户端】如客户端的请求一个不存在的资源客户端未被授权禁止访问等。
400 Bad Request 错误的请求。客户端请求有 语法错误 不能被服务器所理解。 403 Forbidden 拒绝。服务器收到请求但是拒绝提供服务比如没有权限访问相关资源 |404 Not Found 请求资源不存在一般是URL输入有误或者网站资源被删除了 428 Precondition Required 有条件请求。 服务器要求有条件的请求告诉客户端要想访问该资源必须携带特定的请求头 429 Too Many Requests 太多请求可以限制客户端请求某个资源的数量配合 Retry-After(多长时间后可以请求)响应头一起使用当前资源有太多人访问。 431 Request Header Fields Too Large 请求头太大服务器不愿意处理请求因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。 405 Method Not Allowed 请求方式有误比如应该用GET请求方式的资源用了POST 5xx 服务器端错误 ——【处理发生错误责任在服务端】如服务端抛出异常路由出错HTTP版本不支持等 |
500 Internal Server Error 服务器发生不可预期的错误。服务器出异常了赶紧看日志去吧。 503 Service Unavailable 服务器尚未准备好处理请求服务器刚刚启动还未初始化好。 511 Network Authentication Required 客户端需要进行身份验证才能获得网络访问权限。