首页 > 其他分享 >SpringBoot02

SpringBoot02

时间:2023-06-20 15:34:25浏览次数:34  
标签:web SpringBoot02 boot class Filter Override public

Springboot02

1.Springboot注册三大组件Servlet、Filter、 Listener

  • 三大组件和我们之前学习的web阶段中Servlet、Filter、Listener一样

servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,并且可 以动态的生成web页面,它工作在客户端请求与服务器响应的中间层。

通过listener可以监听web服务器中某一个执行动作,并根据其要求作出相应的响应。 通俗的语言说就是在application,session,request三个对象创建消亡或者往其中添 加修改删除属性时自动执行代码的功能组件。

filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter 不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修 改从某一的响应。

  • springboot中没有web.xml可以使用自动配置类来进行三大组件配置

引入起步依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

servlet

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("MyServlet......");
        req.getSession().setAttribute("name","aaa");
    }
}

listener

public class MyListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("调用了Listener......");
    }
}

Filter

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse
            servletResponse, FilterChain filterChain) throws IOException,
            ServletException {
        System.out.println("调用了Filter.......");
        filterChain.doFilter(servletRequest,servletResponse);
    }
    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}
@Configuration
public class MyConfiguration {
    //注册servlet
    @Bean
    public ServletRegistrationBean myServlet(){
        //注入myServlet,并设置servlet的访问地址
        return new ServletRegistrationBean(new MyServlet(),"/myServlet");
    }
    @Bean
    public ServletListenerRegistrationBean myListener(){
        return new ServletListenerRegistrationBean(new MyListener());
    }
    @Bean
    public FilterRegistrationBean myFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new MyFilter());
        bean.addUrlPatterns("/*");
        return bean;
    }
}
  • 如果不想在配置类中构建listener实例,也可以使用注解的方式以listener为例
@Component
@WebListener
public class MyListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("调用了Listener......");
    }
}
  • 如果不想在配置类中构建Filter实例,也可以使用注解的方式以Filter为例
@Component
@WebFilter("/*")
public class MyFilter implements Filter {
    //初始化时执行的方法
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        Filter.super.init(filterConfig);
    }
    //filter具体操作执行的方法
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse
            servletResponse, FilterChain filterChain) throws IOException,
            ServletException {
        System.out.println("MyFilter执行了...");
        filterChain.doFilter(servletRequest,servletResponse);//放行操作
    }
    //销毁时执行的方法
    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

2.Springboot添加拦截器

案例:登录,通过拦截器判断用户名、密码是否为null。

2.1.什么拦截器

拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求 并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否 登录等。其实就是springmvc的Interceptor拦截器

2.2.添加自己的拦截器

添加起步依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

LoginController.java

@RestController
public class LoginController {
    @RequestMapping("/login")
    public String login(String name,String password){
        System.out.println("登录成功,欢迎:"+name);
        return "登录成功";
    }
}

LoginInterceptor.java

public class LoginInterceptor implements HandlerInterceptor {
    //调用controller方法之前执行
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        //判断用户名、密码是否为null,为null拦截,不为null放行
        String name = request.getParameter("name");
        String password = request.getParameter("password");
        if (name==null && password==null){
            System.out.println("Interceptor拦截了.....");
            return false;
        }
        return true;
    }
    //执行controller方法之后,返回前端数据之前
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse
            response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler,
                modelAndView);
    }
    //流程执行结束调用
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler, Exception ex) throws
            Exception {
        HandlerInterceptor.super.afterCompletion(request, response,
                handler, ex);
    }
}

2.3.编写拦截器的配置类

@Configuration
public class InterceptorConfiguration implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(new LoginInterceptor());
        interceptorRegistration.addPathPatterns("/**");//拦截的访问路径 /**所有路径
        interceptorRegistration.excludePathPatterns("/tologin");//忽略哪些访问路径
    }
}

3.Springboot的错误处理机制

3.1.springboot默认错误页面显示的内容

image

源码分析

spring-boot-autoconfigure.jar中org.springframework.boot.autoconfigure.web.servlet.error 中的ErrorMvcAutoConfiguration.java

image

3.2.如何进行错误的请求

spring-boot-autoconfigure.jar中的 org.springframework.boot.autoconfigure.web.servlet.error中的DefaultErrorViewResolver.java

image

3.3.静态资源中如何进行处理

spring-boot-autoconfigure.jar中的 org.springframework.boot.autoconfigure.web.servlet.erro中的 DefaultErrorViewResolver.java

image

3.4.容易漏掉(具体的匹配不到会进行模糊匹配 4xx 5xx)

spring-boot-autoconfigure.jar中的 org.springframework.boot.autoconfigure.web.servlet.erro中的 DefaultErrorViewResolver.java

image

3.5.自定义错误页面定制

引入依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

创建静态资源页面

image

4.Springboot中异常的处理方式

引入依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

4.1.第一种:只在当前Controller中起作用

  • 编写controller测试
@Controller
public class ExceptionController {
    @RequestMapping("/test1")
    public String test1(){
        String s=null;
        int length = s.length();
        return "success";
    }
    @ExceptionHandler(value = NullPointerException.class)
    public ModelAndView exceptionHandler(Exception e){
        ModelAndView modelAndView = new ModelAndView();
        System.out.println(e.toString());
        modelAndView.setViewName("NullPointerException");
        return modelAndView;
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>
	空指针异常
</body>
</html>

image

image

4.2.第二种:配置全局的方式

  • 编写全局异常处理的类
@ControllerAdvice
public class MyException {
    @ExceptionHandler(value = NullPointerException.class)
    public ModelAndView exceptionHandler(Exception e){
        ModelAndView modelAndView = new ModelAndView();
        System.out.println(e.toString());
        modelAndView.setViewName("NullPointerException");
        return modelAndView;
    }
}

运行测试,发现全局都有效

标签:web,SpringBoot02,boot,class,Filter,Override,public
From: https://www.cnblogs.com/jiabaolatiao/p/17493755.html

相关文章

  • SpringBoot02_Mybatis和配置文件
    关于本文的大体框架在上一篇博客一、SpringBoot整合Mybatis(一)配置文件​ 引入springboot与mybatis整合包以及java-connector<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><versi......
  • SpringBoot02 - 基础配置
    SpringBoot基础配置1.属性配置​ SpringBoot通过配置文件application.properties就可以修改默认的配置,那咱们就先找个简单的配置下手,当前访问tomcat的默认端口是8080,好熟......
  • SpringBoot02-对yaml的介绍(配置环境)
    一、SpringBoot配置文件的分类和优先级配置的介绍:yaml二、介绍yaml格式1-他和其他传统格式的不同2-yaml的基本语法3-yaml数据格式代码块解析:server:port:80......