SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】下

简介: SpringBoot的Web开发支持【超详细【一篇搞定】果断收藏系列】

文件上传与下载


项目目录


新建个项目:springboot-file

1.png


pom.xml


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.keafmd</groupId>
    <artifactId>springboot-file</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
        <!--devtools-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- 解析jsp类库  -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
    </dependencies>
</project>

启动类


启动类AppFile:


package com.keafmd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * Keafmd
 *
 * @ClassName: AppFile
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 15:08
 * @Blog: https://keafmd.blog.csdn.net/
 */
@SpringBootApplication
public class AppFile {
    public static void main(String[] args) {
        SpringApplication.run(AppFile.class,args);
    }
}

controller


BootConstants:

package com.keafmd.controller;
/**
 * Keafmd
 *
 * @ClassName: BootConstants
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 16:07
 * @Blog: https://keafmd.blog.csdn.net/
 */
public interface BootConstants {
    public static final String UPLOAD_DIR ="D:\\upload";
}

FileUploadController :

package com.keafmd.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
/**
 * Keafmd
 *
 * @ClassName: FileUploadController
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 15:05
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Controller
public class FileUploadController {
    @PostMapping("upload")
    String upload(MultipartFile pic) throws IOException {
        //1 将临时空间的文件,转储到 D:\\upload
        String originalFileName = pic.getOriginalFilename();
        //扩展名
        String ext = originalFileName.substring(originalFileName.lastIndexOf("."));
        //转储的新文件名
        String newFileName = UUID.randomUUID().toString() + ext;
        //转储到 D:\\upload 下的  uuid.png/uuid.jpg
        pic.transferTo(new File(BootConstants.UPLOAD_DIR, newFileName));
        //2 将数据存储到 db
        /**
         * 当前时间
         * 上传的ip
         * 操作的工号
         * 上传的文件名
         *
         */
        //3 跳转到列表页
        return "redirect:/list";
    }
    @GetMapping("list")
    String list(Model model) throws IOException {
        File[] list = new File(BootConstants.UPLOAD_DIR).listFiles();
        model.addAttribute("fileList",list);
        return "/list.jsp";
    }
}

DownloadController :


package com.keafmd.controller;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
/**
 * Keafmd
 *
 * @ClassName: DownloadController
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 16:10
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Controller
public class DownloadController {
    /**
     * 3000
     *
     * 1024  1024 (2048)   954
     *
     *
     * @param path
     * @param response
     * @throws IOException
     */
    @GetMapping("/d1/{path}")
    public void download(@PathVariable String path , HttpServletResponse response) throws IOException {
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        response.addHeader(HttpHeaders.CONTENT_DISPOSITION,"attachment;filename="+path);
        InputStream is = new FileInputStream(new File(BootConstants.UPLOAD_DIR,path));
        OutputStream os = response.getOutputStream();
        int len = -1;
        byte[] bytes = new byte[1024];
        while (   (len = is.read(bytes)) != -1){
            os.write(bytes,0,len);
        }
        os.close();
        is.close();
    }
    @GetMapping("/d2/{path}")
    public ResponseEntity download2(@PathVariable String path ) throws IOException {
        return ResponseEntity.ok().
                header(HttpHeaders.CONTENT_TYPE,"application/octet-stream").
                header(HttpHeaders.CONTENT_DISPOSITION,"attachment;filename="+path).
                body(new FileSystemResource(new File(BootConstants.UPLOAD_DIR,path)));
    }
}

AppConfig :


package com.keafmd.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
 * Keafmd
 *
 * @ClassName: AppConfig
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-07 16:05
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Configuration
public class AppConfig implements WebMvcConfigurer {
    /**
     * http://127.0.0.1/form
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/form").setViewName("/upload.jsp");
    }
    /**
     * http://127.0.0.1/down/ae37a66f-aec3-4e23-b2ed-7267adcfb2bb.png
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/down/**").addResourceLocations("file:D:\\upload\\");
    }
}

application.yml


server:
  port: 80

SpringBoot集成使用jsp(超详细)


点这里:SpringBoot集成使用jsp(超详细)


jsp


list.jsp:


<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/4/7
  Time: 15:07
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="0" width="100%">
    <tr>
        <th>序号</th>
        <th>文件名称</th>
        <th>操作</th>
    </tr>
    <c:forEach items="${fileList}" var="file" varStatus="stat">
        <tr>
            <td>${stat.count}</td>
            <td>${file.getName()}</td>
            <td>
                <a href="${pageContext.request.contextPath}/down/04971284-d789-470a-a991-4d690c36b4ac.jpg">下载1</a>
                <a href="${pageContext.request.contextPath}/d1/04971284-d789-470a-a991-4d690c36b4ac.jpg">下载2</a>
                <a href="${pageContext.request.contextPath}/d2/04971284-d789-470a-a991-4d690c36b4ac.jpg">下载3</a>
            </td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

upload.jsp:


<%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2021/4/7
  Time: 16:10
  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>
<form method="post" action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data">
    <input type="file" name="pic">
    <input type="submit" value="上传头像" >
</form>
</body>
</html>

效果


上传:

1.png

下载:

2.png


SpringBoot数据校验


问题引入


     我们在传参的时候,有时候需要对传的参数进行验证是否符合要求,这就需要就行数据校验了。


样例代码


说明:SpringBoot的2.2.x版本之前,如果使用starter-web默认包含校验框架,2.3.x之后或者没有使用starter-web,需要添加starter-validation的校验框架。

1.png


common的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">
    <parent>
        <artifactId>spring-boot-02</artifactId>
        <groupId>com.keafmd</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>common</artifactId>
<dependencies>
    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
    </dependency>
</dependencies>
</project>

spring-boot-06的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.keafmd</groupId>
    <artifactId>spring-boot-06</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-06</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.keafmd</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

common的实体类User:


package com.keafmd.entity;
import lombok.Data;
import javax.validation.constraints.Max;
import java.util.Date;
/**
 * Keafmd
 *
 * @ClassName: User
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-08 9:07
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Data
public class User {
    private String id;
    @Max(value = 18,message = "年龄不符合")
    private Integer age;
    private String address;
    private Date createTime;
}

UserController:


package com.keafmd.controller;
import com.keafmd.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * Keafmd
 *
 * @ClassName: UserController
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-08 9:10
 * @Blog: https://keafmd.blog.csdn.net/
 */
@RestController
@RequestMapping("user")
public class UserController {
    /**
     * http://127.0.0.1/user/save?age=20
     * @param user
     * @return
     */
    @RequestMapping("save")
    User save(@Validated User user,BindingResult bindingResult){
        System.out.println(bindingResult.getFieldError().getDefaultMessage());
        return user;
    }
}

SpringBoot06Application


package com.keafmd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBoot06Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringBoot06Application.class, args);
    }
}

效果


浏览器访问:http://127.0.0.1/user/save?age=20

1.png


idea控制台的输出信息:

2.png


注册Servlet三大组件【Servlet、Filter、Listener】


使用ServletComponentScan注解扫描

1.png


在启动类上添加@ServletComponentScan


SpringBoot06Application:


package com.keafmd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan
public class SpringBoot06Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringBoot06Application.class, args);
    }
}

定义Servlet


FirstSerlvet :


package com.keafmd.servletcomponent;
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;
/**
 * Keafmd
 *
 * @ClassName: FirstSerlvet
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-08 9:55
 * @Blog: https://keafmd.blog.csdn.net/
 */
/**
 * http://127.0.0.1/my
 */
@WebServlet(urlPatterns = "/my")
public class FirstSerlvet 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("FirstSerlvet.doPost");
        System.out.println("sessionid: "+req.getSession().getId());
    }
}

定义的Filter


FirstFilter:


package com.keafmd.servletcomponent;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
 * Keafmd
 *
 * @ClassName: FirstFilter
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-08 9:56
 * @Blog: https://keafmd.blog.csdn.net/
 */
@WebFilter(urlPatterns="/*")
public class FirstFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("FirstFilter.doFilter");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

定义Listener


FirstListener:


package com.keafmd.servletcomponent;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
 * Keafmd
 *
 * @ClassName: FirstListener
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-08 9:57
 * @Blog: https://keafmd.blog.csdn.net/
 */
@WebListener
public class FirstListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("FirstListener.sessionCreated: Session被创建");
    }
}

效果


访问:http://127.0.0.1/my

1.png

访问后,前端不会有什么效果。


idea的控制台的输出证明使用成功。2.png


注意:当我们二次访问http://127.0.0.1/my的时候session应该是一样的。

3.png


使用registration的Bean注册组件


三大组件使用代码(不需要,@WebListener、@WebServlet(urlPatterns = “/servlet”)、@WebFilter(urlPatterns = “/*”))

1.png


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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.keafmd</groupId>
    <artifactId>spring-boot-07</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-07</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

application.yml:


server:

 port: 80


使用@Bean配合RegistrationBean类型注册


Appconfig:


package com.keafmd.servlet.config;
import com.keafmd.servlet.component.MySessionListener;
import com.keafmd.servlet.component.SecondFilter;
import com.keafmd.servlet.component.SecondServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
 * Keafmd
 *
 * @ClassName: Appconfig
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-08 17:40
 * @Blog: https://keafmd.blog.csdn.net/
 */
@Configuration(proxyBeanMethods = false)
public class Appconfig implements WebMvcConfigurer {
    // 使用@Bean配合RegistrationBean类型注册 -- star
    /**
     *  http://127.0.0.1:80/sec
     *  http://127.0.0.1:80/second
     * @return
     */
    @Bean
    ServletRegistrationBean getServletRegistrationBean(){
        ServletRegistrationBean<SecondServlet> registrationBean = new ServletRegistrationBean<SecondServlet>();
        registrationBean.setServlet(new SecondServlet());
        registrationBean.addUrlMappings("/sec","/second");
        return registrationBean;
    }
    @Bean
    FilterRegistrationBean getFilterRegistrationBean(){
        FilterRegistrationBean<SecondFilter> registrationBean = new FilterRegistrationBean<SecondFilter>();
        registrationBean.setFilter(new SecondFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
    @Bean
    ServletListenerRegistrationBean getServletListenerRegistrationBean(){
        ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean();
        registrationBean.setListener(new MySessionListener());
        return registrationBean;
    }
    // 使用@Bean配合RegistrationBean类型注册 -- end
    /* 使用Bean注解定义跨域的Filter*/
    @Bean
    FilterRegistrationBean<CorsFilter> cors(){
        FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<CorsFilter>();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        CorsFilter filter = new CorsFilter(source);
        registrationBean.setFilter(filter);
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
  // 另外一种跨域方式
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedHeaders("*").allowedOrigins("*").allowedMethods("*");
    }
}

定义Servlet


SecondServlet:


package com.keafmd.servlet.component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * Keafmd
 *
 * @ClassName: SecondServlet
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-08 17:41
 * @Blog: https://keafmd.blog.csdn.net/
 */
public class SecondServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("SecondServlet.doGet");
        System.out.println("sessionid: "+req.getSession().getId());
    }
}

定义Filter


SecondFilter:


package com.keafmd.servlet.component;
import javax.servlet.*;
import java.io.IOException;
/**
 * Keafmd
 *
 * @ClassName: SecondFilter
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-08 17:41
 * @Blog: https://keafmd.blog.csdn.net/
 */
public class SecondFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("SecondFilter.doFilter 生效了");
        chain.doFilter(request, response);
    }
}

定义Listener


package com.keafmd.servlet.component;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
 * Keafmd
 *
 * @ClassName: MySessionListener
 * @Description:
 * @author: 牛哄哄的柯南
 * @Date: 2021-04-08 17:42
 * @Blog: https://keafmd.blog.csdn.net/
 */
public class MySessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("Session对象被创建");
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
    }
}

使用Bean注解定义跨域的Filter


Appconfig部分代码:


// 使用Bean注解定义跨域的Filter
    @Bean
    FilterRegistrationBean<CorsFilter> cors(){
        FilterRegistrationBean<CorsFilter> registrationBean = new FilterRegistrationBean<CorsFilter>();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        CorsFilter filter = new CorsFilter(source);
        registrationBean.setFilter(filter);
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }

第二种跨域方式


Appconfig部分代码:


@Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedHeaders("*").allowedOrigins("*").allowedMethods("*");
    }

效果

访问:http://127.0.0.1/sec

1.png

访问:http://127.0.0.1/second

2.png

idea控制台输出效果:

3.png


以上就是SpringBoot的Web开发支持【超详细【一篇搞定】】的全部内容。


相关文章
|
22天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
1月前
|
Web App开发 前端开发 开发工具
介绍Web开发的基础知识
介绍Web开发的基础知识
29 7
|
1月前
|
缓存 关系型数据库 API
后端开发:构建高效、可扩展的Web应用程序的关键
后端开发:构建高效、可扩展的Web应用程序的关键
22 0
|
2天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
8天前
|
JSON Java fastjson
Spring Boot 底层级探索系列 04 - Web 开发(2)
Spring Boot 底层级探索系列 04 - Web 开发(2)
16 0
|
8天前
|
安全 编译器 PHP
PHP 8.1版本发布:引领Web开发新潮流
PHP编程语言一直是Web开发的主力军,而最新发布的PHP 8.1版本则为开发者们带来了更多创新和便利。本文将介绍PHP 8.1版本的主要特性,包括更快的性能、新的语言功能和增强的安全性,以及如何利用这些功能来提升Web应用程序的质量和效率。
|
11天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
|
11天前
|
前端开发 数据挖掘 API
使用Python中的Flask框架进行Web应用开发
【4月更文挑战第15天】在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架。它简洁、灵活且易于扩展,使得开发者能够快速地构建出高质量的Web应用。本文将深入探讨Flask框架的核心特性、使用方法以及在实际开发中的应用。
|
20天前
|
安全 前端开发 Java
Java Web开发知识点学习总结
Java Web开发涉及Java基础、Servlet、JSP、数据库操作(SQL+JDBC)、MVC设计模式、Spring框架、Hibernate ORM、Web服务(SOAP&RESTful)、安全认证(HTTP Basic/Digest/OAuth)及性能优化(缓存、异步、负载均衡)。
18 3
|
23天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。