Servlet课堂笔记

课堂笔记

1. 重定向与请求转发

  • 重定向

 

 

 

2. 重定向与请求转发的区别

  1. 请求转发是服务器行为,重定向是客户端行为。

  2. 请求转发是用request对象调用的,重定向是response对象调用的。

  3. 请求转发的浏览器地址栏不会改变,重定向会发生改变。

  4. 请求转发的效率比较高。

  5. 请求转发是客户端发送了一次请求,可以刷新request域对象的信息共享;重定向是多次请求,多次响应,request域对象里的信息不能被共享。

  6. 请求转发只能转发本地资源,重定向可以转达到外部资源上。

3. 请求转发和重定向应用场景

  1. 页面允许重复刷新的时候使用请求转发:没有更改数据库的时候,-查询操作

  2. 页面不允许重复属性的时候使用重定向--执行修改操作的时候

4. 域对象

域对象是用来存储和传递参数的 不能的域对象有不同的作用域

  1. request 一次请求,请求转发相当于一次请求

  2. session 一次会话 ,浏览器从打开到关闭的过程就是一次会话

  3. 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
过滤器后

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值