第1集 SpringBoot2.X过滤器讲解
ApplicationContextHeaderFilterOrderedCharacterEncodingFilterOrderedFormContentFilterOrderedRequestContextFilter
那么多过滤器,哪个优先级⾼呢?
Ordered.HIGHEST_PRECEDENCE Ordered.LOWEST_PRECEDENCE
低位值意味着更⾼的优先级 Higher values are interpreted as lower priority、
⾃定义Filter,避免和默认的Filter优先级⼀样,不然会冲突
注册Filter配置两种⽅式
bean FilterRegistrationBean
Servlet3.0 webFileter
第2集 抛弃传统⽅式,使⽤新版Servlet3.0的注解开发⾃定义Filter
简介:使⽤Servlet3.0注解开发⾃定义的过滤器
场景:权限控制、⽤户登录状态控制,也可以交给拦截器处理等
@WebFilter(filterName = "loginFilter",urlPatterns = "/api/v1/pri/*")
public class loginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("执行过滤方法");
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
System.out.println(UserServiceImpl.sessionMap);
String token = request.getHeader("token");
if (StringUtils.isEmpty(token)){
token = request.getParameter("token");
}
if (StringUtils.isEmpty(token)){ //如果是空说明是没有登录的
return ;
}else { //判断是否合法 TODO
User user = UserServiceImpl.sessionMap.get(token);
if (user!=null){
System.out.println("下单成功");
filterChain.doFilter(request,response);
}
}
}
@Override
public void destroy() {
System.out.println("过滤结束");
}
}
第3集 前后端分离-⾃定义Filter 未登录json错误码提示开发
简介:使⽤Servlet3.0注解开发⾃定义的过滤器,返回未登录错误码
在Filter类中创建Json错误信息
private void renderJson(HttpServletResponse response,String json,int code){ //编写错误的Json信息
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
try (PrintWriter writer = response.getWriter()){
writer.print("状态码为:");
writer.println(code);
writer.print("错误信息:");
writer.println(json);
} catch (IOException e) {
e.printStackTrace();
}
}
第4集 回归本质Servlet3.0的注解原⽣Servlet实战
简介:使⽤ Servlet3.0的注解⾃定义原⽣Servlet
- javaweb的使⽤doPost和doGet⽅法使⽤Servlet3.0替代更轻量级
@WebServlet(name = "userServlet", urlPatterns = "/api/v1/test/customs" )
class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write("this is my custom servlet");
writer.flush();
writer.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req,resp);
}
}
第5集 Servlet3.0+SpringBoot2.X 注解Listener常⽤监听器
简介:监听器介绍和Servlet3.0的注解⾃定义原⽣Listener监听器实战
作⽤
- ServletContextListener 应⽤启动监听
- HttpSessionLisener 会话监听
- ServletRequestListener 请求监听
@WebListener
public class ServletListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("应用启动初始化");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("应用启动结束");
}
}
第6集 新版SpringBoot2.X拦截器配置实战
简介: 讲解Spingboot2.x新版本配置拦截器在项⽬中的使⽤
拦截器: 和过滤器⽤途基本类似
按照注册顺序进⾏拦截,先注册,先被拦截
拦截器不⽣效常⻅问题:
- 是否有加 @Configuration- 拦截路径是否有问题 ** 和 *- 拦截器最后路径⼀定要 /** 如果是⽬录的话则是 /*/
在线教育项⽬案例实战:
改造下单 登录 接⼝
场景:权限控制、⽤户登录状态控制等
和Filter过滤器的区别:
Filter 和 Interceptor ⼆者都是 AOP 编程思想的体现,功能基本都可以实现拦截器功能更强⼤些, Filter 能做的事情它都能做Filter 在只在 Servlet 前后起作⽤,⽽ Interceptor 够深⼊到⽅法前后、异常抛出前后等filter 依赖于 Servlet 容器即 web 应⽤中,⽽ Interceptor 不依赖于 Servlet 容器所以可以运⾏在多种环境。在接⼝调⽤的⽣命周期⾥, Interceptor 可以被多次调⽤,⽽ Filter 只能在容器初始化时调⽤⼀次。Filter 和 Interceptor 的执⾏顺序过滤前 -> 拦截前 ->action 执⾏ -> 拦截后 -> 过滤后
拦截器配置类:(可以同时配置多个拦截器)
/**
* 定义SpringBoot的一个拦截器的配置类
*/
@Configuration
//配置不拦截某些路径,⽐如静态资源
//.excludePathPatterns("/**/*.html","/**/*.js"); 如果需要拦截页面的使用
public class CustomWebMvcConfigure implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) { //增加一个拦截器
registry.addInterceptor(new LoginIntercepter()).addPathPatterns("/api/v1/pri/**") ;//配置需要拦截的路径
//调用父类,增加一个拦截器
WebMvcConfigurer.super.addInterceptors(registry);
}
public LoginIntercepter getLoginIntercepter(){
return new LoginIntercepter();
}
}
登录拦截器:(1.需要继承HadlerInterceptor类
2.重写一下三种方法
3.preHandle返回true就说明没有拦截,执行通过)
public class LoginIntercepter implements HandlerInterceptor {
//创建jacksong的Object对象
private static final ObjectMapper ObjectMapper = new ObjectMapper();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行拦截方法");
System.out.println(UserServiceImpl.sessionMap);
String token = request.getHeader("token");
if (StringUtils.isEmpty(token)){
token = request.getParameter("token");
}
if (!StringUtils.isEmpty(token)){
//判断是否合法 TODO
User user = UserServiceImpl.sessionMap.get(token);
if (user!=null){
System.out.println("下单成功");
//允许就说明通过
return true;
}else { //如果是空说明是没有登录的
//使用jacksong将json数据变成String
JsonData jsonData = JsonData.buildError(-2, "token过期");
String jsonStr = ObjectMapper.writeValueAsString(jsonData);
renderJson(response,jsonStr);
return false;
}
}else{
//使用jacksong将json数据变成String
JsonData jsonData = JsonData.buildError(-3, "未登录");
String jsonStr = ObjectMapper.writeValueAsString(jsonData);
renderJson(response,jsonStr);
return false;
}
}
private void renderJson(HttpServletResponse response,String json){ //编写错误的Json信息
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
try (PrintWriter writer = response.getWriter()){
writer.print(json);
} catch (IOException e) {
e.printStackTrace();
}
}
//Controller调用之后,视图渲染之前,如果控制器Controller出现了
//异常,则不会执⾏此⽅法
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
//不管有没有异常这个类都会执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}