当前位置: 首页 > news >正文

JavaWeb的小结03

第2章-第3节

一、知识点

Cookie、Session、Filter过滤器、Listener。

二、目标

  1. 理解Cookie和Session的区别。

  2. 掌握Cookie和Session的基本用法。

  3. 理解Filter过滤器的作用。

三、内容分析

  1. 重点

    • 理解Cookie和Session的区别。

    • 掌握Cookie和Session的基本用法。

    • 理解Filter过滤器的作用。

  2. 难点

    • 理解Cookie和Session的区别。

四、内容

1、Cookie

Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

1.1 工作原理

客户端请求服务器后,如果服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据这个响应头存储Cookie信息。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验。

1.2 使用步骤
  1. 创建cookie对象

    new Cookie(String name, String value)

  2. 发送cookie对象

    (默认cookie的有效时间是整个浏览器关闭后才会销毁,哪怕服务器重启也不会没掉)

    response.addCookie(Cookie cookie)

  3. 获取cookie对象,拿到数据

    Cookie[] cookies = request.getCookies()

  4. 设置Cookie时效(单位:秒)(哪怕浏览器关闭了、电脑关闭了,只要时间没到,cookie就不会销毁)

    • 正数:cookie数据写入磁盘中,持久化存储 cookie.setMaxAge(60)。

       cookie.setMaxAge(60)
  - 负数:默认,当浏览器关闭的时候,cookie被销毁。
  - 0:删除cookie信息。

2、Session

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。

2.1 工作原理

Session是依赖于Cookie的,当服务端创建session时,服务端在响应的时候会通知客户端把seesion id存储在cookie,后续的请求会在请求头里面会携带上cookie中的数据,服务端获取cookie携带的session id之后从session映射区里面获取对应的数据进行其他的操作。

2.2 使用步骤
  1. 获取session对象

    HttpSession session = request.getSession();
  2. 设置数据

    session.setAttribute(键, 值);
  3. 手动设置JSESSIONID,可以设置cookie时效性

    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    cookie.setMaxAge(60 * 60);
    response.addCookie(cookie);

注意:

  1. Session是依赖于Cookie。

  2. 当客户端关闭后,服务器不关闭,两次获取的sessionid默认是不一样的,如果需要相同,可以创建cookie,键为JSESSIONID。

  3. 客户端没关闭,服务器关闭后,两次获取的sessionid默认不一样。

2.3 cookie和session的区别
  1. session用于存储一次会话的多次请求的数据,存在服务端。

  2. session可以存储任意类型,任意大小的数据。

  3. session数据存在服务端,cookie存在客户端。

  4. session没有数据大小限制,cookie有(一般是2K)。

  5. session数据安全,cookie相对不安全。

2.4 案例

场景:使用不同账号登录系统,返回的个人信息数据应该是不一样的。

打开两个不同的浏览器;

浏览器1:先调用http://localhost:8080/web/login?username=张三&password=123,再调用http://localhost:8080/web/userinfo,页面显示【张三】。

浏览器2:先调用http://localhost:8080/web/login?username=李四&password=123,再调用http://localhost:8080/web/userinfo,页面显示【李四】。

// 登录接口
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
​@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String password = req.getParameter("password");
​
​HttpSession session = req.getSession();session.setAttribute("username", username);
​resp.setContentType("text/plain;charset=utf8");// 这里假设账号密码没有问题,直接返回登录成功resp.getWriter().write("登录成功");}
}
// 获取用户信息
@WebServlet("/userinfo")
public class UserInfoServlet extends HttpServlet {
​@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
​HttpSession session = req.getSession();String username = (String)session.getAttribute("username");
​resp.setContentType("text/plain;charset=utf8");resp.getWriter().write(username);}
}

3、Filter过滤器

访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊功能。比如可以用于完成通用的操作,如:登录验证、统一编码处理、敏感字符过滤等等。

3.1 使用步骤
  1. 定义一个类,实现接口javax.servlet.Filter。

  2. 重写方法。

  3. doFilter方法实现通用操作。

  4. 配置拦截路径。

    • 第一种:web.xml配置

      <filter><filter-name>demo</filter-name><filter-class>com.test.web</filter-class>
      </filter>
      <filter-mapping><filter-name>demo</filter-name><url-pattern>/*</url-pattern>
      </filter-mapping>
    • 第二种:使用注解

      @WebFilter("路径")
3.2 应用示例

统一处理请求编码格式代码如下:

@WebFilter("/*")
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {
​}
​@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {// 统一设置请求编码格式servletRequest.setCharacterEncoding("utf8");// 放行,不然就卡在这里了filterChain.doFilter(servletRequest, servletResponse);}
​@Overridepublic void destroy() {
​}
}

4、Listener

监听器用于监听web应用中某些对象、信息的创建、销毁、增加、修改、删除等动作的发生,然后作出响应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。

4.1 ServletContext对象监听器

监听web上下文的初始化(服务器已经准备好接收请求)与销毁,通常用来加载框架的配置文件。

  1. 注解

    @WebListener//监听器标识,加载到项目中
    public class MyListener implements ServletContextListener {
    ​@Overridepublic void contextInitialized(ServletContextEvent sce) {// TODO Auto-generated method stub// 用来加载框架xml配置文件//作用:存放在项目启动的前需要执行的逻辑System.out.println("Servlet初始化");
    ​}
    ​@Overridepublic void contextDestroyed(ServletContextEvent sce) {// TODO Auto-generated method stub
    ​}
    ​
    }
  2. web.xml配置

    <listener><listener-class>com.test.web.MyListener</listener-class>
    </listener>
4.2 其他监听器
  1. HttpSession对象监听器:监听session建立与销毁

  2. HttpSessionAttributeListener:监听session属性的增加、移除、以及属性值得改变

  3. ServletRequest对象监听器:监听request的创建于销毁

5、解决跨域问题

resp.setHeader("Access-Control-Allow-Origin", "*");
resp.setHeader("Access-Control-Allow-Methods", "*");
resp.setHeader("Access-Control-Max-Age", "3600");
resp.setHeader("Access-Control-Allow-Headers", "*");

http://www.mrgr.cn/news/46348.html

相关文章:

  • kuberctl工具汇总
  • Halcon 3D应用 - 胶路提取
  • 面试笔记-js基础篇
  • 调用CString::Format接口格式化字符串时产生异常,可能是将当前的CString对象作为参数传给CString::Format接口导致的
  • Transform(二)
  • jwt跨域认证
  • 制造业人工智能的场景应用落地现状、难点和建议
  • Linux基础入门 --17 DAY(软件包管理)
  • 源代码泄密防护系统有哪些?这7款源代码泄密防护系统,企业管理者的福音!
  • apt update报错:ModuleNotFoundError: No module named ‘apt_pkg‘(可能是默认python版本被改坏了)
  • 【10086网上营业厅-注册/登录安全分析报告】
  • RabbitMQ延迟队列
  • 21.数据结构与算法-遍历二叉树/三种遍历算法/递归遍历/非递归遍历/建立,复制二叉树/求二叉树的深度,节点个数,叶子节点个数
  • 嵌入式仿真实验教学平台
  • 理解Web3的互操作性:不同区块链的连接
  • 鸿蒙开发(NEXT/API 12)【ArkWeb接入密码保险箱】系统安全
  • 最好的超声波清洗机是哪款牌子?四款顶流超声波清洗机强烈推荐!
  • java实现桌面程序开机自启动
  • postman变量,断言,参数化
  • sass学习笔记(1.0)