SpringMVC文件上传、异常处理、拦截器

news2024/9/29 7:32:22

SpringMVC文件上传、异常处理、拦截器

基本配置准备:maven项目模块

在这里插入图片描述

application.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
    <!--    加载扫描-->
    <context:component-scan base-package="com.etime"></context:component-scan>

    <!--处理器映射器:根据请求路径匹配映射路径找到对应的执行器-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>

    <!--处理器适配器:根据处理器映射器返回的执行器对象,去执行执行器对象-->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

    <!--视图解析器:解析视图-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

    <mvc:annotation-driven/>

    <mvc:default-servlet-handler></mvc:default-servlet-handler>

<!--    文件解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

<!--    配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
<!--            拦截器路径-->
            <mvc:mapping path="/**"/>
<!--            放行路径-->
            <mvc:exclude-mapping path="/interceptor/test02"/>
<!--            指定当前配置的拦截器-->
            <bean class="com.etime.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>

        <mvc:interceptor>
<!--            拦截器路径-->
            <mvc:mapping path="/**"/>
<!--            放行路径-->
            <mvc:exclude-mapping path="/interceptor/test02"/>
<!--            指定前配置的拦截器-->
            <bean class="com.etime.interceptor.SecondInterceptor"></bean>
        </mvc:interceptor>

        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/loginController/login"/>
            <bean class="com.etime.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>
</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:application.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>characterEncoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>hiddenMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hiddenMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.etime</groupId>
    <artifactId>day08</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <spring.version>5.2.5.RELEASE</spring.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>

    </dependencies>

</project>

SpringMVC的文件上传

文件上传需要做的准备

form表单的enctype取值必须是:multipart/form-data(默认值是:application/x-www-form-urlencoded)enctype:是表单请求正文的类型

method属性取值必须是Post

提供一个文件选择域< input type="file"/>

文件上传原理

当form表单的enctype取值不是默认值后,request.getParameter()将失效。enctype="application/x-www-form-urlencoded"时,form表单的正文内容是:key=value&key=value&key=value;

当form表单的enctype 取值Mutilpart/form-data时,请正文内容就变成:每一部都是MIME类型描述的正文:

enctype="application/x-www-form-urlencoded"

key=value&key=value&key=value;

request.getParameter();

底层:form表单是一个大的请求体:

每一个组件都是一个小的请求体:

enctype=Mutilpart/form-data

request.getParameter();失效

每一组都是一个小的请求体:

username = lisi

age = 21

file = xxx.jpg

SpringMVC的文件上传

构建maven工程添加相关依赖

  <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
  </dependency>

commons-fileupload 依赖了commons-io Apache提供的

编写jsp页面

index.jsp

//多文件上传

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="upload/test" method="post" enctype="multipart/form-data">
        选中文件:<input type="file" name="photo"><br>
        选中文件:<input type="file" name="photo"><br>
        选中文件:<input type="file" name="photo"><br>
        <input type="submit">
    </form>
<%--<a href="exception/test">测试</a>--%>
</body>
</html>

控制器

UploadController.java

package com.etime.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Controller
@RequestMapping("upload")
public class UploadController {

    @PostMapping("test")
    public String test(MultipartFile[] photo){
        String path = "D:\\test";
        File file = new File(path);
        if (!file.exists()){
            file.mkdirs();
        }
//        //获取文件名
//        String fileName = photo.getOriginalFilename();
//        //上传
//        try {
//            photo.transferTo(new File(file, fileName));
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
        for (MultipartFile f:photo) {
            String fileName = f.getOriginalFilename();
            try {
                f.transferTo(new File(file,fileName));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "main";
    }
}

配置文件解析器

注意: id必须固定~  
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

运行结果:

在这里插入图片描述

SpringMVC的异常处理

项目开发中异常处理的方式

系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试等手段减少运行时异常的发生。

异常处理的设计思路

系统的dao、service、controller 出现都通过 throws Exception 向上抛出,最后由 springmvc 前端控制器交由异常处理器进行异常处理。

异常处理的步骤

编写异常类和错误页面
package com.etime.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("exception")
public class ExceptionController {

    @GetMapping("test")
    public String test(){
        System.out.println("进啦");
        int num = 7/0;
        return "main";
    }
}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
臭宝~前路不通!!!
</body>
</html>

自定义异常处理器
package com.etime.util;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class MyException implements HandlerExceptionResolver {
    //只是掩盖了异常,该处理的异常还是得处理
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

运行结果:当该异常出现时,捕获到异常然后接连的通过跳转到提示页面,将该页面出现的页面掩饰,但是异常依然存在,仍然要处理

在这里插入图片描述

SpringMVC的拦截器

拦截器的介绍和作用

SpringMVC的处理器拦截器类似于 Servlet 开发中的过滤器Filter,用于处理器进行预处理和后处理。用户可以自己定义一些拦截器来实现特定的功能。还要向大家提到一个词为Interceptor Chain。拦截器就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

拦截器与过滤器的区别

过滤器是servlet规范中的一部分,任何java web 工程可以使用。拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能用。

过滤器在web.xml中的url-pattern 标签中配置了/*之后,可以对所有要访问的资源拦截。html js css image

拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp 是不会进行拦截的。它也是AOP思想的具体应用。

我们要想自定义拦截器,要求必须实现:HandlerInterceptor接口

过滤器:/* : js css html

拦截器: /** :只是拦截控制器方法。

自定义拦截器

jsp:


package com.etime.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("interceptor")
public class InterceptorController {

    @GetMapping("test01")
    public String test01(){
        System.out.println("test01真的进来了");
        return "main";
    }

    @GetMapping("test02")
    public String test02(){
        System.out.println("test02真的进来了");
        return "main";
    }
}

编写一个普通类实现HandlerInterceptor接口

package com.etime.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {

    //Controller方法运行前运行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Controller方法运行前");
        //返回值为false拦截器Controller方法不执行
        //返回值为true拦截器Controller方法执行
        return false;
    }

    //Controller方法返回值时
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Controller方法返回值时");
        //return;
    }

    //Controller方法运行后
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Controller方法运行后");
        //return;
    }
}

配置拦截器

application.xml
<!--    配置拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
<!--            拦截器路径-->
            <mvc:mapping path="/**"/>
<!--            放行路径-->
            <mvc:exclude-mapping path="/interceptor/test02"/>
<!--            指定当前配置的拦截器-->
            <bean class="com.etime.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
     </mvc:interceptors>

在这里插入图片描述

拦截器的注意事项

拦截器的放行

拦截器中的放行指的是:如果下一个拦截器就执行下一个,如果该拦截器处于拦截器链的最后一个,则执行控制器中的方法。

public boolean preHandle(HttpServletRequest request , HttpServletResponse response,Object handler)方法返回true表示继续执行控制层执行器方法,返回false表示方法结束,不会执行控制层执行器方法。

多个拦截器的执行顺序

拦截器1package com.etime.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {

    //Controller方法运行前运行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Controller方法运行前");
        //返回值为false拦截器Controller方法不执行
        //返回值为true拦截器Controller方法执行
        return false;
    }

    //Controller方法返回值时
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Controller方法返回值时");
        //return;
    }

    //Controller方法运行后
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("Controller方法运行后");
        //return;
    }
}


拦截器2package com.etime.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class SecondInterceptor implements HandlerInterceptor {
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("第二个拦截器,Controller方法执行前");
        return true;
    }

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("第二个拦截器,Controller方法返回数据");
    }

    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("第二个拦截器,Controller方法执行后");
    }
}

配置:
    
    application.xml
            <mvc:interceptor>
<!--            拦截器路径-->
            <mvc:mapping path="/**"/>
<!--            放行路径-->
            <mvc:exclude-mapping path="/interceptor/test01"/>
<!--            指定前配置的拦截器-->
            <bean class="com.etime.interceptor.SecondInterceptor"></bean>
        </mvc:interceptor>
            

运行结果:

在这里插入图片描述

拦截器综合案例

实现思路分析:

1、定义登录页面,并定义请求映射。
2、判断用户名密码是否正确
3、如果正确 向 session 中写入用户信息
4、返回登录成功。
5、拦截用户请求,判断用户是否登录
6、如果用户已经登录。放行
7、如果用户未登录,跳转到登录页面

示例代码:

login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="loginController/login" method="post" >
        账号:<input type="text" name="username" >
        密码:<input type="password" name="password">
        <input type="submit" value="登录">
    </form>
</body>
</html>

    控制器:
    package com.etime.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/loginController")
public class LoginController {

    @PostMapping("login")
    public ModelAndView login(String username, String password, ModelMap modelMap){
        boolean res=true;
        ModelAndView modelAndView = new ModelAndView();
        if (res){
            modelMap.addAttribute("username",username);
            modelAndView.setViewName("success");
        }
        return modelAndView;
    }
}

拦截器:
    
    package com.etime.interceptor;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Controller
@RequestMapping("/loginInterceptor")
public class LoginInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //登录过滤,未登录的情况,某些功能不能使用
        HttpSession session = request.getSession();
        if (session.getAttribute("username")==null){
            //未登录
            System.out.println("未登录");
            response.sendRedirect("../login.jsp");
            return  false;
        }else {
            System.out.println("已登录");
            return true;
        }
    }
}

application.xml
            <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/loginController/login"/>
            <bean class="com.etime.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>

运行结果:
在这里插入图片描述

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

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

相关文章

数据库系统-数据物理存储

文章目录 一、DBMS原理1.1 DB物理存储1.1.1 磁盘的结构&特性1.1.2 DBMS数据存储&查询原理记录&#xff1a;磁盘块 1.2 DB文件组织方法1.2.1 无序文件组织1.2.2 有序记录文件1.2.3 散列文件(Hash File)1.2.4 聚簇文件(Clustering File) 1.3 Oracle 物理存储简介 一、DBM…

程序员最常见的谎言

小伙伴们大家好&#xff0c;我是阿秀。 上周看到知乎上有位网友总结了自己的10年程序员生涯中最常说的一些谎言&#xff0c;一共有15条&#xff0c;看完我直呼内行&#xff01;&#xff01; 全中&#xff01;每一枪都中了&#xff01;每一条我都说过。 我基本都说过他说过的那些…

下载VMware安装Ubuntu18.04.6系统

文章目录 前言&#xff1a;1. 下载VMWare与Ubuntu镜像2. 安装VMware3. VMware下安装Ubuntu 前言&#xff1a; 这篇文章是为交叉编译做的铺垫&#xff0c;本文内容比较简单&#xff0c;按步骤操作即可。 1. 下载VMWare与Ubuntu镜像 为了节约大家时间&#xff0c;省的各种找&am…

【Unity VR开发】结合VRTK4.0:摄像机碰撞变黑

语录&#xff1a; 人是要长大的&#xff0c;有天你也会推着婴儿车幸福地在街上行走&#xff0c;而曾经的喜欢&#xff0c;不管曾经怎样&#xff0c;都会幻化成风&#xff0c;消失在时光的隧道。所以向前走&#xff0c;向前走&#xff0c;无须回头。 前言&#xff1a; 往往我们在…

基于html+css的图片展示12

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

新品发布 | 智安网络【零信任SDP访问控制系统】正式上线!

近日&#xff0c;根据《2022年云办公行业研究报告》显示&#xff0c;2021-2023年&#xff0c;中国协同办公行业保持每年10%以上的增长率&#xff0c;远程办公人员的数量在过去十年中增长了115%&#xff0c;互联网时代已迎来远程办公需求大潮。 风口之下&#xff0c;员工对企业…

Go语言基础——通过获取网站API的cUrl,生成可直接执行的request代码(附:详细实战案例和源码)

作者&#xff1a;非妃是公主 专栏&#xff1a;《Golang》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 一、cUrl是什么&#xff1f;二、cUrl如何获取…

OpenAI-ChatGPT最新官方接口《从0到1生产最佳实例》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(十一)(附源码)

Production Best Practices 生产最佳实例 前言Introduction 导言Setting up your organization 设置您的组织Managing billing limits 管理计费限额API keys API密钥Staging accounts 演示账户 Building your prototype 构建您的原型Additional tips 其它技巧 Techniques for i…

【Java 数据结构】队列的实现及相关OJ题

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

图的搜索算法---8.2 ZOJ1002-Fire Net--合理布置碉堡

目录 问题&#xff1a; 分析&#xff1a; 主要的算法代码&#xff1a; 完整代码&#xff1a; 出问题的代码&#xff1a; 原因&#xff1a; 正确代码&#xff1a; 代码分析&#xff1a; 算法函数讲解&#xff1a; CanPut函数 solve函数 运行结果&#xff1a; 问题&am…

勇创世界一流!移动云为我国数字经济发展提供有力支撑

今年2月&#xff0c;中共中央、国务院印发了《数字中国建设整体布局规划》&#xff0c;通过顶层设计及布局&#xff0c;擘画了我国数字经济发展蓝图。近日在国新办举行的第六届数字中国建设峰会新闻发布会上&#xff0c;相关负责人也对我国数字经济现阶段取得的成绩进行了总结&…

IPWorks VoIP 2022 Crack

网络电话组件 IPWorks VoIP 提供 SIP 和 IVR 组件&#xff0c;旨在促进 CTI 应用程序中的常见 VoIP 操作。快速集成功能以建立拨出电话、接听来电以及根据您的自定义 IVR 菜单路由呼叫。还支持其他 SIP 功能&#xff0c;例如文本到语音、播放预先录制的消息、通话录音和电话会议…

总结:helm

一、介绍 Helm是k8s的包管理工具&#xff0c;类似Linux系统常用的 apt、yum等包管理工具&#xff0c;基于go 语言开发。使用helm可以简化k8s应用部署 二、基本概念 Helm的基本概念 Chart&#xff1a;一个 Helm 包&#xff0c;其中包含了运行一个应用所需要的镜像、依赖和资源…

flask实际开发:flask和nginx如何配置支持websocket

使用pycharm启动flask项目有坑&#xff0c;先修改pycharm设置 1、点击Edit Confiturations 2、配置启动方式 1 新增启动配置 2 选择使用python命令执行 3 给配置设置一个名字 4 设置要启动的模块的位置&#xff0c;flask基本都是app.py 模块 最后别忘记&#xff1a;点击右侧的…

Linux网络-传输层UDP/TCP详解

目录 计算机网络的层状结构 UDP协议 UDP报文格式 理解UDP/TCP报文的本质 UDP的特点 UDP的缓冲区 sendto/recvfrom/send/recv/write/read IO类接口 UDP是全双工的 UDP注意事项 UDP协议&#xff0c;实现简单聊天室&#xff08;服务端客户端&#xff09; TCP协议 TCP协…

SpringBoot集成 ElasticSearch

Spring Boot 集成 ElasticSearch 对于ElasticSearch比较陌生的小伙伴可以先看看ElasticSearch的概述ElasticSearch安装、启动、操作及概念简介 好的开始啦~ 1、基础操作 1.1、导入依赖 <dependency><groupId>org.springframework.boot</groupId><arti…

【是C++,不是C艹】 第一个C++程序 | 命名空间 | 输入输出

&#x1f49e;&#x1f49e; 欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e; &#x1f449;专栏&#xff1a;《是C&#xff0c;不是C艹》&#x1f448; 前言&#xff1a; 在认识了C的来历之后&#xff0c;我们就要开始正式学习C了&#xff0c;系好安全带&#xff0c;准备…

阿里云安全ACP认证考试实验之云盾之云安全中心与态势感知入门体验

“更多玩转云产品” 1、实验概述 通过本实验可对云安全中心&#xff0c;态势感知的一些基本操作有深入了解以及如何来对实例进行安全监控 2、实验目标 完成此实验可以掌握的能力有&#xff1a; 在安骑士中添加白名单、登录安全设置 通过态势感知查看实例的相关告警威胁 3…

数值区间的模糊匹配,二分查找的应用

先看图: 需求很明确,要根据左边的值,显示右边的值。 比如,现在拿到的值是 17.12,那么应该显示成 15;拿到 17.599 ,那么应该显示成 20. 先找规律: 为了便于说明,暂且将左边的值设为 x, 右边的值设为 y. 第一行和最后一行可以写死成 0 与 1500;余下的每行,x 的区间是…

Vue CLI 创建一个项目

vue create 运行以下命令来创建一个新项目&#xff1a; vue create hello-world警告 如果你在 Windows 上通过 minTTY 使用 Git Bash&#xff0c;交互提示符并不工作。你必须通过 winpty vue.cmd create hello-world 启动这个命令。不过&#xff0c;如果你仍想使用 vue crea…