课堂笔记
1. 重定向与请求转发
-
重定向
2. 重定向与请求转发的区别
-
请求转发是服务器行为,重定向是客户端行为。
-
请求转发是用request对象调用的,重定向是response对象调用的。
-
请求转发的浏览器地址栏不会改变,重定向会发生改变。
-
请求转发的效率比较高。
-
请求转发是客户端发送了一次请求,可以刷新request域对象的信息共享;重定向是多次请求,多次响应,request域对象里的信息不能被共享。
-
请求转发只能转发本地资源,重定向可以转达到外部资源上。
3. 请求转发和重定向应用场景
-
页面允许重复刷新的时候使用请求转发:没有更改数据库的时候,-查询操作
-
页面不允许重复属性的时候使用重定向--执行修改操作的时候
4. 域对象
域对象是用来存储和传递参数的 不能的域对象有不同的作用域
-
request 一次请求,请求转发相当于一次请求
-
session 一次会话 ,浏览器从打开到关闭的过程就是一次会话
-
application 整个服务 ,服务器不关闭,数据一致有效。
-
请求转发
package com.ming.servlet;
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;
@WebServlet(name = "FastServlet",value = "/fast")
public class FastServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//存储request域对象
request.setAttribute("requestKey","requestValue");
//存储session域对象
request.getSession().setAttribute("sessionKey","sessionValue");
//存储application域对象
request.getServletContext().setAttribute("applicationKey","applicationValue");
//重定向
//response.sendRedirect("login.jsp");
//转发
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
-
重定向
package com.ming.servlet;
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;
@WebServlet(name = "FastServlet",value = "/fast")
public class FastServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//存储request域对象
request.setAttribute("requestKey","requestValue");
//存储session域对象
request.getSession().setAttribute("sessionKey","sessionValue");
//存储application域对象
request.getServletContext().setAttribute("applicationKey","applicationValue");
//重定向
response.sendRedirect("login.jsp");
//转发
//request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
5. 域对象作用范围
request,session和application里面的key,优先获取request,如果request里面,获取session的,获取application的。
${requestScope.k1}${sessionScope.k1}$lapplicationScope.k1]
package com.ming.servlet;
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;
@WebServlet(name = "FastServlet",value = "/fast")
public class FastServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("k1","requestValue");
request.getSession().setAttribute("k1","sessionValue");
//重定向
//response.sendRedirect("login.jsp");
//转发
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
6. 获取不同作用域对象
package com.ming.servlet;
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;
@WebServlet(name = "FastServlet",value = "/fast")
public class FastServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("k1","requestValue");
request.getSession().setAttribute("k1","sessionValue");
request.getServletContext().setAttribute("k1","applicationValue");
//重定向
//response.sendRedirect("login.jsp");
//转发
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
<%--
Created by IntelliJ IDEA.
User: ming's
Date: 2023/8/2
Time: 16:33
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
requestValue : ${requestScope.k1}<br/>
sessionValue :${sessionScope.k1}<br/>
applicationValue :${applicationScope.k1}<br/>
</body>
</html>
package com.ming.servlet;
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;
@WebServlet(name = "RServlet",value = "/r2")
public class RServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request.getRequestDispatcher("login.jsp").forward(request,response);
Cookie cookie = new Cookie("cookie","cookieValue");
//设置最大存活时间 单位是秒
cookie.setMaxAge(20);
response.addCookie(cookie);
System.out.println("r2");
}
}
7. cookie和session的工作原理
1.Cookie的工作原理 (1)浏览器端第一次发送请求到服务器端 (2)服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端 (3)浏览器端再次访问服务器端时会携带服务器端创建的Cookie (4)服务器端通过Cookie中携带的数据区分不同的用户
Session的工作原理 (1)浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端 (2)浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象 (3)服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户。 name为JSESSIONID的Cookie不存在(关闭或更换浏览器),返回1中重新去创建Session与特殊的Cookie name为JSESSIONID的Cookie存在,根据value中的SessionId去寻找session对象 value为SessionId不存在(Session对象默认存活30分钟),返回1中重新去创建Session与特殊的Cookie value为SessionId存在,返回session对象
package com.ming.servlet;
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;
@WebServlet(name = "RServlet",value = "/r2")
public class RServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request.getRequestDispatcher("login.jsp").forward(request,response);
Cookie cookie = new Cookie("cookie","cookieValue");
//设置最大存活时间 单位是秒
cookie.setMaxAge(20);
response.addCookie(cookie);
System.out.println("r2");
}
}
package com.ming.servlet;
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;
@WebServlet(name = "RServlet",value = "/r2")
public class RServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取cookie
Cookie[] cookies = request.getCookies();
if(cookies != null && cookies.length > 0){
for (Cookie cookie : cookies){
System.out.println(cookie.getName() + " " + cookie.getValue());
}
}
System.out.println("r2");
}
}
Idea-f484707f ad45d497-d1eb-4b1b-9c58-e0f1c5348e49
Pycharm-fcbfaa14 aefa1cb9-9a8a-4392-b9c8-41c1093ed639
JSESSIONID D62492804937C35042C8AE2D7B722BF2
8. cookie和session的区别对比
-
cookie数据存放在客户的浏览器上,session数据放在服务器上
-
cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
-
session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
-
单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
-
所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中
9. 过滤器Filter
package com.ming.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "UserFilter", urlPatterns = "/*")
public class UserFilter implements Filter {
public void destroy() {
System.out.println("过滤器销毁方法!!!");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("准备执行过滤器");
System.out.println("过滤器前");
//放行
chain.doFilter(req, resp);
System.out.println("过滤器后");
}
public void init(FilterConfig config) throws ServletException {
System.out.println("过滤器初始化方法");
}
}
执行过滤器
过滤器前
Idea-f484707f ad45d497-d1eb-4b1b-9c58-e0f1c5348e49
Pycharm-fcbfaa14 aefa1cb9-9a8a-4392-b9c8-41c1093ed639
JSESSIONID 588260171E94D62F82963E8663EFC280
r2
过滤器后
10. 课堂案例
拦截所有请求,放行/r2,其他所有请求都不放行。
package com.ming.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//拦截所有请求
@WebFilter(filterName = "UserFilter", urlPatterns = "/*")
public class UserFilter implements Filter {
public void destroy() {
System.out.println("过滤器销毁方法!!!");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("准备执行过滤器");
System.out.println("过滤器前");
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String requestURI = request.getRequestURI();
//放行r2
if (requestURI.contains("r2") || requestURI.contains("")) {
chain.doFilter(req, resp);
}else {
System.out.println("被拦截咯!!!");
}
System.out.println("过滤器后");
}
public void init(FilterConfig config) throws ServletException {
System.out.println("过滤器初始化方法");
}
}
[2023-08-03 04:02:39,510] Artifact javaweb002:Web exploded: Deploy took 714 milliseconds
准备执行过滤器
过滤器前
过滤器后
准备执行过滤器
过滤器前
过滤器后
准备执行过滤器
过滤器前
过滤器后
03-Aug-2023 16:02:48.584 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [D:\apache-tomcat-8.5.86\webapps\manager]
03-Aug-2023 16:02:48.614 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[D:\apache-tomcat-8.5.86\webapps\manager]的部署已在[30]毫秒内完成
准备执行过滤器
过滤器前
Idea-f484707f ad45d497-d1eb-4b1b-9c58-e0f1c5348e49
Pycharm-fcbfaa14 aefa1cb9-9a8a-4392-b9c8-41c1093ed639
JSESSIONID F2A8DB2355B5B5E52792376C9E27D658
r2
过滤器后