Java-Web过滤器

news2024/11/29 22:32:10

文章目录

    • 1.基本介绍
        • 1.为什么需要过滤器?
        • 2.基本介绍
        • 3.过滤器的基本原理
    • 2.快速入门
        • 1.文件目录
        • 2.环境配置
          • 创建maven项目,导入依赖
        • 3.代码实现
          • 1.login.jsp
          • 2.LoginCheck.java
          • 3.ManagerFilter.java编写过滤规则
          • 4.配置web.xml告诉tomcat
          • 5.admin.jsp
    • 3.Filter的执行流程
        • 1.服务器启动
        • 2.请求匹配
        • 3.细节说明
    • 4.url-pattern
    • 5.Filter生命周期
    • 6.FilterConfig
        • 1.基本介绍
        • 2.代码演示
          • 1.FilterConfig.java
          • 2.web.xml
          • 5.结果
        • 3.课后练习
          • 1.FilterConfig.java
          • 2.结果
    • 7.FilterChain
        • 1.基本原理
        • 2. 代码实例
          • 1.AFilter.java
          • 2.BFilter.java
          • 3.web.xml
          • 4.结果
        • 3.注意事项
    • 8.作业练习
          • 1.homeworkFilter.java
          • 2.web.xml
          • 3.topic.jsp
          • 4.showTopic.jsp
          • 5.演示结果

1.基本介绍

1.为什么需要过滤器?

image-20240131110102229

2.基本介绍

image-20240131110221013

3.过滤器的基本原理

image-20240131131339776

2.快速入门

image-20240131131520402

1.文件目录

image-20240131153518356

2.环境配置
创建maven项目,导入依赖
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.taglibs</groupId>
      <artifactId>taglibs-standard-impl</artifactId>
      <version>1.2.5</version>
      <scope>runtime</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.taglibs</groupId>
      <artifactId>taglibs-standard-spec</artifactId>
      <version>1.2.5</version>
    </dependency>
  </dependencies>
3.代码实现
1.login.jsp
<%--
  Date: 2024/1/31
  Time: 13:34
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/loginCheck" method="post">
    username:<input type="text" name="username"><br>
    password:<input type="password" name="password"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

2.LoginCheck.java
package 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;

/**
 * @author 孙显圣
 * @version 1.0
 * 验证信息是否正确,如果正确则设置session
 */
@WebServlet(urlPatterns = "/loginCheck")
public class LoginCheck extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if ("666666".equals(password)) {
            //设置session
            HttpSession session = req.getSession();
            session.setAttribute("name", username);

            req.getRequestDispatcher("manager/admin.jsp").forward(req, resp);
        }
        else {
            //不合法直接返回登录界面
            req.getRequestDispatcher("login.jsp").forward(req, resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

3.ManagerFilter.java编写过滤规则

image-20240131160748082

package filter;

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

/**
 * @author 孙显圣
 * @version 1.0
 */
public class ManagerFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {
        //当filter创建后会调用这个方法初始化
        System.out.println("初始化");
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //每次调用该filter时该方法就会被调用
        //检查是否有session,将servletRequest向下转型为httpServletRequest
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = httpServletRequest.getSession();
        //获取session中的name
        Object name = session.getAttribute("name");
        if (name != null) {
            //继续访问目标资源
            filterChain.doFilter(servletRequest,servletResponse);
        }
        else {
            httpServletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
        }
    }

    public void destroy() {
        //filter被销毁时会调用
        System.out.println("destroy");
    }
}

4.配置web.xml告诉tomcat
<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name>Archetype Created Web Application</display-name>
<!--  filter一般写在最前面 -->
<!--  url-pattern就是当请求的url与之匹配的时候tomcat就会调用filter-->
<!--  /manager/*指的就是manager下面所有的资源-->
<filter>
  <filter-name>ManagerFilter</filter-name>
  <filter-class>filter.ManagerFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>ManagerFilter</filter-name>
  <url-pattern>/manager/*</url-pattern>
</filter-mapping>
</web-app>

image-20240131153805916

5.admin.jsp
<%--
  Date: 2024/1/31
  Time: 13:37
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <base href="<%=request.getContextPath()%>/manager/">
</head>
<body>
<h1 align="center">
    管理员界面
</h1>
<img src="1.png" height="600" border="1">
</body>
</html>

3.Filter的执行流程

1.服务器启动
  1. 读取web.xmlimage-20240131144336978
  2. 根据全类名反射创建过滤器的实例,将其放在name - 实例的容器中,并将url - name容器也填充
  3. 一共有两个容器
    1. url - name
    2. name - 实例
  4. 创建FilterConfig对象,调用 init(FilterConfig filterConfi g)方法初始化过滤器
2.请求匹配
  1. 遍历a容器,匹配url
  2. 如果匹配到,则找到里面的name,并且遍历b容器,根据name找到filter实例
  3. 调用doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)方法
3.细节说明
  1. 过滤器起到一个浏览器请求拦截的作用,请求转发不经过过滤器
  2. 过滤器实例只有一个
  3. 一旦匹配到过滤器,过滤器只要不做任何操作,就会卡在这个页面,并不会继续匹配servlet
  4. 除非过滤器调用filterChain.doFilter(servletRequest, servletResponse)才会放行
  5. 过滤器里面的servletRequest和servletResponse是httpServletRequest和httpServletResponse的父类,可以向下转型

4.url-pattern

image-20240131154650106

5.Filter生命周期

image-20240131155307334

6.FilterConfig

1.基本介绍

image-20240131160529086

2.代码演示
1.FilterConfig.java
package filter;

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class FilterConfig implements Filter {
    public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {
        //通过filterConfig获取相关的参数
        //1.获取filter的名字
        String filterName = filterConfig.getFilterName();
        System.out.println("filterName: " + filterName);
        //2.获取filter配置参数
        String ip = filterConfig.getInitParameter("ip");
        System.out.println("ip: " + ip);
        //3.获取filter的所有配置参数的名字
        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
        while (initParameterNames.hasMoreElements()){
            System.out.println("filterNames: " + initParameterNames.nextElement());
        }
        //4.获取servletContext
        ServletContext servletContext = filterConfig.getServletContext();
        System.out.println("servletContext: " + servletContext);
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    }

    public void destroy() {

    }
}

2.web.xml
    <filter>
        <filter-name>filterConfig</filter-name>
        <filter-class>filter.FilterConfig</filter-class>
        <!--配置参数-->
        <init-param>
            <param-name>ip</param-name>
            <param-value>12.344.123.12</param-value>
        </init-param>
        <init-param>
            <param-name>qq</param-name>
            <param-value>1721469477@qq.com</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>filterConfig</filter-name>
        <url-pattern>/abc/*</url-pattern>
    </filter-mapping>

image-20240131162333676

5.结果

image-20240131162353898

3.课后练习

image-20240131162638216

1.FilterConfig.java
package filter;

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

/**
 * @author 孙显圣
 * @version 1.0
 */
public class FilterConfig implements Filter {
    public void init(javax.servlet.FilterConfig filterConfig) throws ServletException {

        //获取filter配置参数
        String ip = filterConfig.getInitParameter("ip");
        //获取servletContext
        ServletContext servletContext = filterConfig.getServletContext();
        //把禁用的网段放入servletContext
        servletContext.setAttribute("ip", ip);
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ServletContext servletContext = servletRequest.getServletContext();
        Object ip = servletContext.getAttribute("ip");
        if (ip != null) {
            String ip_ = (String) ip; //获取禁用网段ip
        }
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        //获取请求的ip
        String remoteAddr = httpServletRequest.getRemoteAddr();
        //使用正则表达式匹配
        String regStr = ip + ".*";
        if (!remoteAddr.matches(regStr)) {
            //如果不是禁用网段跳转到登录页面
            httpServletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
        }
    }

    public void destroy() {

    }
}

2.结果

image-20240131163907870

7.FilterChain

1.基本原理

image-20240131164502850

2. 代码实例
1.AFilter.java
package filter;

import javax.servlet.*;
import javax.servlet.FilterConfig;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class AFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("AFilter的前置代码");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("AFilter的后置代码");
    }

    public void destroy() {

    }
}

2.BFilter.java
package filter;

import javax.servlet.*;
import javax.servlet.FilterConfig;
import java.io.IOException;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class BFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("BFilter的前置代码");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("BFilter的后置代码");
    }

    public void destroy() {

    }
}

3.web.xml
    <filter>
        <filter-name>A</filter-name>
        <filter-class>filter.AFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>A</filter-name>
        <url-pattern>/aaa</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>B</filter-name>
        <filter-class>filter.BFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>B</filter-name>
        <url-pattern>/aaa</url-pattern>
    </filter-mapping>

image-20240131171025524

4.结果

image-20240131171059724

image-20240131171112703

3.注意事项

image-20240131172007410

8.作业练习

image-20240131173309811

1.homeworkFilter.java
package filter;


import javax.servlet.*;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class homeworkFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        //动态获取评论,并将评论都放到servletContext中
        ServletContext servletContext = filterConfig.getServletContext();
        Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
        ArrayList<String> comments = new ArrayList<String>();
        while (initParameterNames.hasMoreElements()) {
            String s = initParameterNames.nextElement();
            String initParameter = filterConfig.getInitParameter(s);
            comments.add(initParameter);
        }
        servletContext.setAttribute("comments", comments);
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //获取所有评论
        ServletContext servletContext = servletRequest.getServletContext();
        Object comments = servletContext.getAttribute("comments");
        //获取填写的评论
        String comment = servletRequest.getParameter("comment");
        //没有禁止的评论就直接放行
        if (comments == null) {
            filterChain.doFilter(servletRequest, servletResponse);
        }
        //禁止的评论不为空则遍历判断
        ArrayList<String> coms = (ArrayList<String>) comments;
        for (String com : coms) { //遍历禁用词
            if (com.equals(comment)) {
                //请求转发到主页面并将禁用词传进去
                servletRequest.setAttribute("badComment", comment);
                servletRequest.getRequestDispatcher("/topic.jsp")
                        .forward(servletRequest, servletResponse);
            }
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

    public void destroy() {

    }
}

2.web.xml
    <filter>
        <filter-name>homeworkFilter</filter-name>
        <filter-class>filter.homeworkFilter</filter-class>
        <init-param>
            <param-name>com1</param-name>
            <param-value>苹果</param-value>
        </init-param>
        <init-param>
            <param-name>com2</param-name>
            <param-value>香蕉</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>homeworkFilter</filter-name>
        <url-pattern>/showTopic.jsp</url-pattern>
    </filter-mapping>

image-20240131184923102

3.topic.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Date: 2024/1/31
  Time: 17:36
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h4>敏感词:苹果、香蕉
    <c:if test="${!empty requestScope.badComment}">
        ---有敏感词:${requestScope.badComment}
    </c:if>
</h4>
<form action="showTopic.jsp" method="get">
    评论:<input type="text" name="comment"><br>
    <input type="submit" value="提交">
</form>

</body>
</html>

4.showTopic.jsp
<%--
  Date: 2024/1/31
  Time: 17:39
  User: 孙显圣
  Version:1.0
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h4>您的评论是:<%=request.getParameter("comment")%></h4>
</body>
</html>

5.演示结果

image-20240131185058643

image-20240131185106755

image-20240131185126405

image-20240131185135564

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1586486.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMD + CEEMDAN 二次分解,Transformer-BiGRU预测模型

创新点&#xff1a;二次分解 多头注意力特征融合 往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Py…

CSGO游戏搬砖,落袋为安才是王道

1.市场燃了&#xff0c;都在赚钱&#xff0c;谁在赔钱&#xff1f; 首先要分清“纸面富贵”和“落袋为安”。市场燃了&#xff0c;你库存里的渐变大狙从5000直接涨到了1W&#xff0c;你赚到5000了吗&#xff1f;严格讲&#xff0c;你需要把库存里的渐变大狙卖出去&#xff0c;…

ruoyi-nbcio-plus基于vue3的flowable的支持自定义业务流程处理页面detail.vue的升级修改

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

Training - PyTorch Lightning 分布式训练的 global_step 参数 (accumulate_grad_batches)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/137640653 在 PyTorch Lightning 中&#xff0c;pl.Trainer 的 accumulate_grad_batches 参数允许在执行反向传播和优化器步骤之前&…

priority_queue的使用以及模拟实现

前言 上一期我们对stack和queue进行了使用的介绍&#xff0c;以及对底层的模拟实现&#xff01;以及容器适配器做了介绍&#xff0c;本期我们在来介绍一个容器适配器priority_queue&#xff01; 本期内容介绍 priority_queue的使用 仿函数介绍 priority_queue的模拟实现 什么…

2024年3月文章一览

2024年3月编程人总共更新了12篇文章&#xff1a; 1.2024年2月文章一览 2.Programming Abstractions in C阅读笔记&#xff1a;p308-p311 3.Programming Abstractions in C阅读笔记&#xff1a;p312-p326 4.Programming Abstractions in C阅读笔记&#xff1a;p327-p330 5.…

更改el-cascade默认的value和label的键值

后端返回的树结构中&#xff0c;label的key不是el-cascade默认的label&#xff0c;我需要改成对应的字段&#xff0c;但是一直没有成功&#xff0c;我也在文档中找到了说明&#xff0c;但是我没注意这是在props中改&#xff0c;导致一直不成功 这是我一开始错误的写法&#xf…

超越ChatGPT,国内快速访问的强大 AI 工具 Claude

claude 3 opus面世后&#xff0c;网上盛传吊打了GPT-4。网上这几天也已经有了许多应用&#xff0c;但竟然还有很多小伙伴不知道国内怎么用gpt&#xff0c;也不知道怎么去用这个据说已经吊打了gpt-4的claude3。 今天我们想要进行的一项尝试就是—— 用claude3和gpt4&#xff0c…

互联网大厂ssp面经(操作系统:part1)

1. 什么是进程和线程&#xff1f;它们之间有什么区别&#xff1f; a. 进程是操作系统中运行的一个程序实例。它拥有独立的地址空间和资源&#xff0c;可以独立执行。 b. 线程是进程内的一个执行单元&#xff0c;一个进程可以包含多个线程。 c. 线程共享进程的资源&#xff0c;…

liunx系统发布.net core项目

liunx系统发布.net core项目 准备.net6程序运行环境部署nginx&#xff0c;通过一个地址既能访问web api&#xff0c;又能访问web项目有一个客户把web api放到docker中&#xff0c;想通过nginx转发&#xff0c;nginx也支持配置多个程序api接口的其它 liunx系统&#xff1a;cento…

程序员生产力工具推荐

1.SSH客户端 XTerminal Xterminal - 更好用的开发工具&#xff0c;但不止于(SSH/控制台/More) 有着比XShell好看的多的界面&#xff0c;免费版使用起来绰绰有余。 2.文件内容搜索工具 FileLocator FileLocator Pro 专业全文检索工具文件搜索软件丨中文网站特价购买 everyth…

Excel 记录单 快速录入数据

一. 调出记录单 ⏹记录单功能默认是隐藏的&#xff0c;通过如下如图所示的方式&#xff0c;将记录单功能显示出来。 二. 录入数据 ⏹先在表格中录入一行数据&#xff0c;给记录单一个参考 ⏹将光标至于表格右上角&#xff0c;然后点击记录单按钮&#xff0c;调出记录单 然后点…

Terraform 状态不同步处理

背景 在使用 Terraform 创建 TencentCloud TKE 的时候&#xff0c;手贱把 node pool 删掉了。导致执行 destroy, plan 都会报错。 │ Error: [TencentCloudSDKError] CodeInternalError.UnexpectedInternal, Messagerelated node pool query err(get node pool failed: [E501…

kaggle 泰坦尼克号1(根据男女性存活率)

kaggle竞赛 泰坦尼克号 流程 下载kaggle数据集导入所要使用的包引入kaggle的数据集csv文件查看数据集的大小和长度去除冗余数据建立特征工程导出结果csv文件 1.下载kaggle数据集 2.导入所要使用的包 import pandas as pd import numpy as np import matplotlib.pyplot as …

2024.4.12蚂蚁庄园今日答案:豆腐在烹调时容易碎有什么办法可以避免?

原文来源&#xff1a;蚂蚁庄园今日答案 - 词令 蚂蚁庄园是一款爱心公益游戏&#xff0c;用户可以通过喂养小鸡&#xff0c;产生鸡蛋&#xff0c;并通过捐赠鸡蛋参与公益项目。用户每日完成答题就可以领取鸡饲料&#xff0c;使用鸡饲料喂鸡之后&#xff0c;会可以获得鸡蛋&…

构建高效网络:深入理解正向与反向代理的作用与配置

正向代理 如果把局域网外的互联网环境想象成一个巨大的资源库&#xff0c;则局域网中的客户端要访问互联网则需要通过代理服务器来访问&#xff0c;这种代理成为正向代理。 示例&#xff1a; 用户想要访问 https://chensir.ink &#xff08;目标服务器&#xff09;&#xff0…

vivado 在硬件中调试逻辑设计

在硬件中调试逻辑设计 设计中包含调试核后 &#xff0c; 您可使用运行时间逻辑分析器功能来对硬件中的设计进行调试。 使用 Vivado Logic Analyzer 进行设计调试 Vivado Logic Analyzer 功能可用于与设计中运行的新 ILA 、 VIO 和 JTAG-to-AXI Master 调试核进行交互。…

02 Windows操作系统密钥激活流程

Windows系统的激活流程通常包括以下步骤&#xff1a; AI步骤 1. 购买正版产品密钥&#xff1a;在正式激活Windows系统之前&#xff0c;你需要购买一个合法的产品密钥。你可以通过Microsoft官方网站或授权的零售商购买密钥。 2. 输入产品密钥&#xff1a;在购买后&#xff0c;你…

1.8V LDO电路 ➕1.2V bandgap电路

1.8V LDO电路 ➕1.2V bandgap电路&#xff08;WX:didadidadidida313&#xff0c;加我备注&#xff1a;CSDN LDO&#xff0c;谢绝白嫖哈&#xff09; 1.8V LDO电路 ➕1.2V bandgap电路,基于tsmc180nm工艺库 带设计仿真报告&#xff0c;非常适合新手入门&#xff01; 本文采用…

【智能算法应用】灰狼算法求解TSP问题

目录 1.算法原理2.TSP数学模型3.结果展示4.参考文献 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.TSP数学模型 旅行商问题&#xff08;TSP&#xff09;是一种著名的组合优化问题&#xff0c;它涉及寻找给定一组城市及其之间的距离或成本&#…