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默认错误页面显示的内容
源码分析
spring-boot-autoconfigure.jar中org.springframework.boot.autoconfigure.web.servlet.error 中的ErrorMvcAutoConfiguration.java
3.2.如何进行错误的请求
spring-boot-autoconfigure.jar中的 org.springframework.boot.autoconfigure.web.servlet.error中的DefaultErrorViewResolver.java
3.3.静态资源中如何进行处理
spring-boot-autoconfigure.jar中的 org.springframework.boot.autoconfigure.web.servlet.erro中的 DefaultErrorViewResolver.java
3.4.容易漏掉(具体的匹配不到会进行模糊匹配 4xx 5xx)
spring-boot-autoconfigure.jar中的 org.springframework.boot.autoconfigure.web.servlet.erro中的 DefaultErrorViewResolver.java
3.5.自定义错误页面定制
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
创建静态资源页面
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>
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