spring boot 创建 webserlet 并加入web listener监听器
spring boot实现过滤器Filter 过滤器
Spring Boot拦截器的作用:
拦截器主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能。
定义拦截器
在 Spring Boot 中定义拦截器十分的简单,只需要创建一个拦截器类,并实现 HandlerInterceptor 接口即可。
HandlerInterceptor 接口中定义以下 3 个方法,如下表。
返回值类型 | 方法声明 | 描述 |
---|---|---|
boolean | preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) | 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。 |
void | postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) | 该方法在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。 |
void | afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) | 该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作。 |
例:
1.自定义拦截器
package com.example.iterceptor;
import cn.hutool.core.util.StrUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//实现HandlerInterceptor接口
public class LoginIterceptor implements HandlerInterceptor {
@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);
}
//实现方法
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler)
throws Exception {
String token = request.getParameter("token");
if (StrUtil.isEmpty(token)) {
response.sendRedirect("/login");
}
return true;
}
}
2.注册拦截器
package com.example.config;
import com.example.iterceptor.LoginIterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 拦截器配置
* 创建一个实现了 WebMvcConfigurer 接口的配置类(使用了 @Configuration 注解的类),
* 重写 addInterceptors()方法,并在该方法中调用 registry.addInterceptor()
* 方法将自定义的拦截器注册到容器中。
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
LoginIterceptor loginIterceptor = new LoginIterceptor();
registry.addInterceptor(loginIterceptor)
.addPathPatterns("/api/**")//拦截路径
.excludePathPatterns("/css/**", "images/**", "/js/**", "/login");//放行路径
}
}
3.测试/api/**
package com.example.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class DemoController {
@RequestMapping("/kiss")
public String kiss(){
return "么么哒";
}
}
结果:
4.测试普通接口路径
package com.example.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LoginController {
@GetMapping("/login")
public String login() {
return "请登录";
}
}
结果: