day13 Filter&Listener&书城项目第六阶段

day13 Filter&Listener&书城项目第五阶段

第一章 Filter

1. 目标

  • 了解什么是Filter
  • 了解Filter的作用
  • 掌握Filter的使用
  • 了解Filter的生命周期
  • 掌握过滤器链的使用

2. 内容讲解

2.1 Filter的概念

Filter:一个实现了特殊接口(Filter)的Java类. 实现对请求资源(jsp,servlet,html,)的过滤的功能. 过滤器是一个运行在服务器的程序, 优先于请求资源(Servlet或者jsp,html)之前执行. 过滤器是javaweb技术中最为实用的技术之一

在这里插入图片描述

2.2 Filter的作用

Filter的作用是对目标资源(Servlet,jsp)进行过滤,其应用场景有: 登录权限检查,解决网站乱码,过滤敏感字符等等

  1. 在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。

  2. 在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。

  3. Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源进行拦截后,Web服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,doFilter方法中有一个filterChain对象,用于继续传递给下一个filter,在传递之前我们可以定义过滤请求的功能,在传递之后,我们可以定义过滤响应的功能

2.3 Filter的入门案例
2.3.1 案例目标

实现在请求到达HelloServlet之前解决请求参数的中文乱码

2.3.2 代码实现
2.3.2.1 创建HelloServlet

web.xml代码

    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.atguigu.filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/hello</url-pattern>
    </filter-mapping>

HelloServlet代码

package com.atguigu.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("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet 执行了");
        resp.getWriter().println("HelloServlet 访问成功");
    }
}

前端页面代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="hello">HelloServlet</a> <br>

</body>
</html>

如果此时没有Filter,那么客户端发送的请求直接到达HelloServlet,中文请求参数就会发生乱码

2.3.2.2 创建EncodingFilter

web.xml代码

    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.atguigu.filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/hello</url-pattern>
    </filter-mapping>

EncodingFilter代码

package com.atguigu.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class EncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("------------ EncodingFilter init ----------------");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 解决请求乱码和响应乱码
        HttpServletRequest req = (HttpServletRequest)servletRequest;
        HttpServletResponse resp = (HttpServletResponse) servletResponse;

        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        System.out.println("--------- EncodingFilter 过滤器 放行前 --------");
        // 放行请求 去往servlet
        filterChain.doFilter(servletRequest, servletResponse);
        System.out.println("--------- EncodingFilter 过滤器 放行后 ---------");
    }

    @Override
    public void destroy() {
        System.out.println("------------ EncodingFilter destroy -------------");
    }
}

2.4 Filter的生命周期
2.4.1 回顾Servlet生命周期
2.4.1.1 Servlet的创建时机

Servlet默认在第一次接收请求的时候创建,我们可以通过<load-on-startup>标签配置Servlet在服务器启动的时候创建

2.4.1.2 Servlet的销毁时机

Servlet会在服务器关闭或者将项目从服务器上移除的时候销毁

2.4.2 Filter的生命周期和生命周期方法
生命周期阶段执行时机生命周期方法
创建对象Web应用启动时init方法,通常在该方法中做初始化工作
拦截请求接收到匹配的请求doFilter方法,通常在该方法中执行拦截过滤
销毁Web应用卸载前destroy方法,通常在该方法中执行资源释放
2.5 过滤器匹配规则
2.5.1 过滤器匹配的目的

过滤器匹配的目的是指定当前过滤器要拦截哪些资源

2.5.2 四种匹配规则
2.5.2.1 精确匹配

指定被拦截资源的完整路径:

<!-- 配置Filter要拦截的目标资源 -->
<filter-mapping>
    <!-- 指定这个mapping对应的Filter名称 -->
    <filter-name>FilterDemo01</filter-name>

    <!-- 通过请求地址模式来设置要拦截的资源 -->
    <url-pattern>/demo01</url-pattern>
</filter-mapping>

上述例子表示要拦截映射路径为/demo01的这个资源

2.5.2.2 模糊匹配

相比较精确匹配,使用模糊匹配可以让我们创建一个Filter就能够覆盖很多目标资源,不必专门为每一个目标资源都创建Filter,提高开发效率。

在我们配置了url-pattern为/user/*之后,请求地址只要是/user开头的那么就会被匹配。

<filter-mapping>
    <filter-name>Target02Filter</filter-name>

    <!-- 模糊匹配:前杠后星 -->
    <!--
        /user/demo01
        /user/demo02
        /user/demo03
		/demo04
    -->
    <url-pattern>/user/*</url-pattern>
</filter-mapping>

极端情况:/*匹配所有请求

2.5.2.3 扩展名匹配
<filter>
    <filter-name>Target04Filter</filter-name>
    <filter-class>com.atguigu.filter.filter.Target04Filter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Target04Filter</filter-name>
    <url-pattern>*.png</url-pattern>
</filter-mapping>

上述例子表示拦截所有以.png结尾的请求

2.5.2.4 匹配Servlet名称
<filter-mapping>
    <filter-name>Target05Filter</filter-name>

    <!-- 根据Servlet名称匹配 -->
    <servlet-name>Target01Servlet</servlet-name>
</filter-mapping>
2.6 过滤器链
2.6.1 过滤链的概念

一个请求可能被多个过滤器所过滤,只有当所有过滤器都放行,请求才能到达目标资源,如果有某一个过滤器没有放行,那么请求则无法到达后续过滤器以及目标资源,多个过滤器组成的链路就是过滤器链

在这里插入图片描述

在这里插入图片描述

2.6.2 过滤器链的顺序

过滤器链中每一个Filter执行的顺序是由web.xml中filter-mapping配置的顺序决定的。如果某个Filter是使用ServletName进行匹配规则的配置,那么这个Filter执行的优先级要更低

2.6.3 过滤器链案例

HelloServlet代码

package com.atguigu.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("/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet 执行了");
        resp.getWriter().println("HelloServlet 访问成功");
    }
}

2.6.3.2 创建多个Filter拦截Servlet
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/hello</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>FirstFilter</filter-name>
        <url-pattern>/hello</url-pattern>
    </filter-mapping>

第二章 Listener(了解)

1. 目标

  • 了解观察者模式
  • 了解监听器的概念
  • 掌握ServletContextListener的使用

2. 内容讲解

2.1 观察者模式简介

观察者模式是二十三中设计模式之一,它是指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式

  • 观察者:监控『被观察者』的行为,一旦发现『被观察者』触发了事件,就会调用事先准备好的方法执行操作。
  • 被观察者:『被观察者』一旦触发了被监控的事件,就会被『观察者』发现。

在这里插入图片描述

2.2 监听器的简介
2.2.1 监听器的概念

监听器:专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。
Servlet监听器:Servlet规范中定义的一种特殊类,它用于监听Web应用程序中的ServletContext,HttpSession 和HttpServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。

在这里插入图片描述

2.2.2 Servlet监听器的分类(了解)

一共有哪些监听器?分别处理的是什么事情?java中一共给我们提供了八个监听器接口,分别用于监听三个域对象,每个监听器都有专门监听的事件

  • Request

    • ServletRequestListener (处理request对象创建和销毁)
    • ServleRequestAttributeListener (处理域对象中的数据添加 替换 删除)
  • Session

    • HttpSessionListener (处理session对象创建和销毁)
    • HttpSessionAttributeListener (处理session域对象中的数据添加 修改 删除)
    • HttpSessionBindingListener (处理session对象监听器绑定和解绑定接口)
    • HttpSessionActivationListener (处理session对象钝化和活化状态接口)
  • Application

    • ServletContextListener (处理application对象创建和销毁 ServletContext)
    • ServletContextAttributeListener (处理application域对象中的数据添加 修改 删除)
2.2.2.1 ServletContextListener

作用:监听ServletContext对象的创建与销毁

方法名作用
contextInitialized(ServletContextEvent sce)ServletContext创建时调用
contextDestroyed(ServletContextEvent sce)ServletContext销毁时调用

ServletContextEvent对象代表从ServletContext对象身上捕获到的事件,通过这个事件对象我们可以获取到ServletContext对象。

2.2.2.2 HttpSessionListener

作用:监听HttpSession对象的创建与销毁

方法名作用
sessionCreated(HttpSessionEvent hse)HttpSession对象创建时调用
sessionDestroyed(HttpSessionEvent hse)HttpSession对象销毁时调用

HttpSessionEvent对象代表从HttpSession对象身上捕获到的事件,通过这个事件对象我们可以获取到触发事件的HttpSession对象。

创建监听器

package com.atguigu.listener;

import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MyListener2 implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("Session创建成功:" + httpSessionEvent.getSession().getId());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("Session销毁成功:" + httpSessionEvent.getSession().getId());
    }
}

注册监听器

<listener>
    <listener-class>com.atguigu.listener.MyListener2</listener-class>
        </listener>

servlet代码

package com.atguigu.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 javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/created")
public class SessionCreateServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        String id = session.getId();
        resp.getWriter().println("created:" + id);
    }
}

package com.atguigu.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 javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet("/destroy")
public class SessionDestroyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        String id = session.getId();

        // 清空session
        session.invalidate();

        resp.getWriter().println("destroy:" + id);

    }
}

html代码

<a href="created"> 创建Session </a> <br>
<a href="destroy"> 销毁Session </a> <br>
2.2.2.3 ServletRequestListener

作用:监听ServletRequest对象的创建与销毁

方法名作用
requestInitialized(ServletRequestEvent sre)ServletRequest对象创建时调用
requestDestroyed(ServletRequestEvent sre)ServletRequest对象销毁时调用

ServletRequestEvent对象代表从HttpServletRequest对象身上捕获到的事件,通过这个事件对象我们可以获取到触发事件的HttpServletRequest对象。另外还有一个方法可以获取到当前Web应用的ServletContext对象。

2.2.2.4 ServletContextAttributeListener

作用:监听ServletContext中属性的添加、移除和修改

方法名作用
attributeAdded(ServletContextAttributeEvent scab)向ServletContext中添加属性时调用
attributeRemoved(ServletContextAttributeEvent scab)从ServletContext中移除属性时调用
attributeReplaced(ServletContextAttributeEvent scab)当ServletContext中的属性被修改时调用

ServletContextAttributeEvent对象代表属性变化事件,它包含的方法如下:

方法名作用
getName()获取修改或添加的属性名
getValue()获取被修改或添加的属性值
getServletContext()获取ServletContext对象
2.2.2.5 HttpSessionAttributeListener

作用:监听HttpSession中属性的添加、移除和修改

方法名作用
attributeAdded(HttpSessionBindingEvent se)向HttpSession中添加属性时调用
attributeRemoved(HttpSessionBindingEvent se)从HttpSession中移除属性时调用
attributeReplaced(HttpSessionBindingEvent se)当HttpSession中的属性被修改时调用

创建监听器

package com.atguigu.listener;

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;

public class MyListener1 implements ServletRequestAttributeListener {
    @Override
    public void attributeAdded(ServletRequestAttributeEvent event) {
        String name = event.getName();
        Object value = event.getValue();
        System.out.println("添加了属性 name = " + name + ", value = " + value);
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent event) {
        String name = event.getName();
        System.out.println("删除了属性 name = " + name );
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent event) {
        String name = event.getName();
        System.out.println("替换了属性 name = " + name);
    }
}


注册监听器

    <listener>
        <listener-class>com.atguigu.listener.MyListener1</listener-class>
    </listener>

servlet代码

package com.atguigu.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("/attribute")
public class AttributeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 向请求域中添加值
        req.setAttribute("uname", "张三");
        // 想请求域中获取值
        Object uname = req.getAttribute("uname");
        System.out.println("uname = " + uname);

        // 修改值
        req.setAttribute("uname", "李四");

        // 获取值
        uname = req.getAttribute("uname");
        System.out.println("uname = " + uname);


        // 删除值
        req.removeAttribute("uname");

        // 获取值
        uname = req.getAttribute("uname");
        System.out.println("uname = " + uname);
    }
}

html代码

<a href="attribute">AttributeServlet</a> <br>
2.2.2.6 ServletRequestAttributeListener

作用:监听ServletRequest中属性的添加、移除和修改

方法名作用
attributeAdded(ServletRequestAttributeEvent srae)向ServletRequest中添加属性时调用
attributeRemoved(ServletRequestAttributeEvent srae)从ServletRequest中移除属性时调用
attributeReplaced(ServletRequestAttributeEvent srae)当ServletRequest中的属性被修改时调用

ServletRequestAttributeEvent对象代表属性变化事件,它包含的方法如下:

方法名作用
getName()获取修改或添加的属性名
getValue()获取被修改或添加的属性值
getServletRequest ()获取触发事件的ServletRequest对象
2.2.2.7 HttpSessionBindingListener

作用:监听某个对象在Session域中的创建与移除

方法名作用
valueBound(HttpSessionBindingEvent event)该类的实例被放到Session域中时调用
valueUnbound(HttpSessionBindingEvent event)该类的实例从Session中移除时调用

HttpSessionBindingEvent对象代表属性变化事件,它包含的方法如下:

方法名作用
getName()获取当前事件涉及的属性名
getValue()获取当前事件涉及的属性值
getSession()获取触发事件的HttpSession对象
2.2.2.8 HttpSessionActivationListener

作用:监听某个对象在Session中的序列化与反序列化。

方法名作用
sessionWillPassivate(HttpSessionEvent se)该类实例和Session一起钝化到硬盘时调用
sessionDidActivate(HttpSessionEvent se)该类实例和Session一起活化到内存时调用

HttpSessionEvent对象代表事件对象,通过getSession()方法获取事件涉及的HttpSession对象。

Session序列化和反序列化

1、序列化与反序列

把对象转化为字节序列的过程称为序列化(保存到硬盘,持久化)

把字节序列转化为对象的过程称为反序列化(存放于内存)

2、序列化的用途

把对象的字节序列永久保存到硬盘上,通常放到一个文件中。

把网络传输的对象通过字节序列化,方便传输本节作业

3、实现步骤

A、新建文件如图所示:

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>

  <Context>

       <Manager className="org.apache.catalina.session.PersistentManager">

         <Store className="org.apache.catalina.session.FileStore" directory="d:/session"/>

      </Manager>

  </Context>

C、注意实体类必须实现serializable 接口

D、监听Session的钝化和活化

监听器代码

/**
 * 监听session的钝化与活化
 */
public class MySessionActiveListener implements HttpSessionActivationListener, Serializable {
    @Override
    public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
        System.out.println(httpSessionEvent.getSession().getId()+" 钝化");
    }

    @Override
    public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {

        System.out.println(httpSessionEvent.getSession().getId()+" 活化");

    }
}

Servlet中使用该监听器代码

@WebServlet("/servlet3")
public class Servlet3 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();

        System.out.println(session.getId()+" session.isNew() = " + session.isNew());
        session.setAttribute("user", new User("lb", 20));
        //绑定监听器
        session.setAttribute("listener", new MySessionActiveListener());
    }
}
2.3 ServletContextListener的使用
2.3.1 作用

ServletContextListener是监听ServletContext对象的创建和销毁的,因为ServletContext对象是在服务器启动的时候创建、在服务器关闭的时候销毁,所以ServletContextListener也可以监听服务器的启动和关闭

2.3.2 使用场景

将来学习SpringMVC的时候,会用到一个ContextLoaderListener,这个监听器就实现了ServletContextListener接口,表示对ServletContext对象本身的生命周期进行监控。

2.3.3 代码实现
2.3.3.1 创建监听器类
package com.atguigu.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * 包名:com.atguigu.listener
 *
 * 编写监听器的步骤:
 * 1. 写一个类实现对应的:Listener的接口(我们这里使用的是ServletContextListener),并且实现它里面的方法
 *    1.1 contextInitialized()这个方法在ServletContext对象被创建出来的时候执行,也就是说在服务器启动的时候执行
 *    1.2 contextDestroyed()这个方法会在ServletContext对象被销毁的时候执行,也就是说在服务器关闭的时候执行
 *
 * 2. 在web.xml中注册(配置)监听器
 */
public class MyListener3 implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("服务器启动了 你可以做些事情");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("服务器即将关闭了 你可以做些事情");
    }
}

2.3.3.2 注册监听器
    <listener>
        <listener-class>com.atguigu.listener.MyListener3</listener-class>
    </listener>

第三章 书城项目第六阶段

功能一 登录检查

1.1 目标

把项目中需要保护的功能保护起来,没有登录不允许访问

  • 购物车功能
  • 订单功能
1.2 思路

在这里插入图片描述

1.3 代码实现
1.3.1 拦截受保护资源的请求
  1. 修改受保护的Servlet的映射路径

    购物车资源地址:/protected/CartServlet

    订单资源地址(明天学):/protected/OrderServlet

  2. Filter拦截的地址:/protected/*

1.3.2 对访问购物车资源的地址进行修改

所有异步请求访问购物车的路径,都需要在cart前面加上protected/

1.3.3 CartServlet类的webServlet注解修改路径
@WebServlet("/protected/cart")
public class CartServlet extends ModelBaseServlet {
1.3.4 创建执行登录检查的Filter
1.3.4.1 Filter类
package com.atguigu.filter;

import com.atguigu.pojo.CommonResult;
import com.atguigu.pojo.Constants;
import com.atguigu.pojo.User;
import com.atguigu.utils.JSONUtils;

import javax.servlet.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 1.获取用户信息
        // 向下转型
        HttpServletRequest req = (HttpServletRequest)servletRequest;
        HttpServletResponse resp = (HttpServletResponse)servletResponse;
        // 2.获取登录的用户
        HttpSession session = req.getSession();
        User user = (User) session.getAttribute(Constants.SESSION_LOGON_USER);



        // 没有登录
        if (user == null){
            // 获取方法名
            String methodName = req.getParameter("method");
            // 如果是同步方法 则直接跳转到登录页面
            if ("toCartPage".equals(methodName) || "clearCart".equals(methodName)){
                resp.sendRedirect(req.getContextPath() + "/user?method=toLoginPage");
            }else{
                // 如果是异步方法 则返回一个标识给前端
                CommonResult commonResult = CommonResult.error("unLogin");
                JSONUtils.writeJson(resp, commonResult);
            }

        }else{
            // user不为空 说明已登录 则放行
            filterChain.doFilter(servletRequest, servletResponse);
        }
        
    }

    @Override
    public void destroy() {

    }
}

1.3.4.2 在web.xml中注册Filter类
    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.atguigu.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/protected/*</url-pattern>
    </filter-mapping>
1.3.5 修改所有发送与购物车相关的异步请求的代码

判断响应数据的flag如果为false,并且message为unLogin,那么则使用location.href跳转到登录页面

then(function (value) {
    // 获取后台发送的数据
    console.log(value.data);
    if (value.data.flag){
        vue.cart = value.data.resultData;

    }else{
        if(value.data.message=='unLogin'){

            location.href="user?method=toLoginPage";

        }

    }

})
1.3.6更改首页添加购物车
          "addCart":function () {
            // event.target 获取触发事件的元素
            var id = event.target.value;
            layer.msg( "加入购物车成功")
            axios({
              "url":"protected/cart",
              "method":"post",
              "params":{
                "method":"addCart",
                "id":id
              }
            }).then(function (value) {
              console.log(value.data);
              if (value.data.flag){
                vue.totalCount = value.data.resultData;
              }else{
                if(value.data.message=='unLogin'){

                  location.href="user?method=toLoginPage";

                }

              }
            })
          }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值