一、过滤器(filter)
介绍:Filter是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
1.SpringBoot默认加载的过滤器
characterEncodingFilter
hiddenHttpMethodFilter
httpPutFormContentFilter
requestContextFilter
2.Filter的优先级
Ordered.HIGHEST_PRECEDENCE
Ordered.LOWEST_PRECEDENCE
地位值意味着更高的优先级,自定义filter避免和默认的filter优先级一样,不然会冲突,注册filter的bean filterRegistrationBean,同模块里面有默认filter web---》servlet---》filter
3.自定义filter
使用servlet3.0注解进行配置
启动类中加载@ServletComponenScan,进行扫描
新建一个filter类,implements Filter,并实现对应的接口
@WebFilter标记一个类为filter,被spring进行扫描 urlPatterns 匹配规则
package com.itcast.filter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebFilter(urlPatterns = "/api/*",filterName = "loginFilter") public class LoginFilter implements Filter { /** * 容器加載的時候調用 * @param filterConfig * @throws ServletException */ @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("init loginFilter"); } /** * 请求被拦截的时候调用 * @param request * @param response * @param filterChain * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { System.out.println("doFilter loginFilter"); HttpServletRequest request1 = (HttpServletRequest) request; HttpServletResponse response1 = (HttpServletResponse) response; String username = request1.getParameter("username"); if ("123".equals(username)){ filterChain.doFilter(request,response); }else { response1.sendRedirect("index.html"); return; } } /** * 容器被销毁的时候调用 */ @Override public void destroy() { System.out.println("destroy loginFilter"); } }
package com.itcast; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication @ServletComponentScan public class springBootAdminT { public static void main(String[] args) { SpringApplication.run(springBootAdminT.class,args); } }
二、servlet
package com.itcast.servlet; 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; @WebServlet(name="userServlet" ,urlPatterns = "/v1/api/test/customs") public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().println("12345"); resp.getWriter().flush(); resp.getWriter().close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
三、Listener(监听器)
介绍:listener是servlet规范中定义的一种特殊类。用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件。用于在事件发生前、发生后做一些必要的处理。其主要可用于以下方面:1、统计在线人数和在线用户2、系统启动时加载初始化信息3、统计网站访问量4、记录用户访问路径。
常用的监听器:servletContextListener httpSessionListtener servletRequestListener
package com.itcast.listener; import javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; import javax.servlet.annotation.WebListener; @WebListener public class RequestListener implements ServletRequestListener { @Override public void requestDestroyed(ServletRequestEvent sre) { System.out.println("===requestDestroyed==="); } @Override public void requestInitialized(ServletRequestEvent sre) { System.out.println("=====requestInitialized======"); } }
四、Intecpter(拦截器)
拦截器: 我们需要对一个类实现HandlerInterceptor接口, 默认会实现其中的三个方法,preHandle,postHandle ,afterCompletion,其中preHandle实在Controller方法调用之前执行,postHandle是在请求处理之后进行调用,但是在视图渲染之前,即Controller方法调用之后执行,afterCompletion方法是在整个请求结束之后被调用,也是在DispatcherServlet渲染了对应识图之后执行,主要用于资源清理工作。路径只有走DispacherServlet,才会被拦截,默认静态资源不会被拦截,拦截器需要注册,一般需要在config中注册该拦截器,才能在项目中使用。
package com.itcast.intecpter; import org.springframework.boot.logging.LoggingInitializationContext; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class CustomWebMvcConfigurer implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginIntercpter()).addPathPatterns("/api2/*/**"); WebMvcConfigurer.super.addInterceptors(registry); } }
package com.itcast.intecpter; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginIntercpter implements HandlerInterceptor { /** *进入Controller之前 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("LoginIntercpter---------->>>preHandle"); return true; } /** * 调用完Controller之后,视图渲染之前 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("LoginIntercpter---------->>>postHandle"); } /** * 整个完成之后,通常用于资源清理 * @param request * @param response * @param handler * @param ex * @throws Exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("LoginIntercpter---------->>>afterCompletion"); } }
区别:
- 拦截器是基于java的反射机制的,而过滤器是基于函数回调
- 过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
- 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
- 拦截器可以访问action上下文、值栈里的对象,而过滤器不能
- 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
用途:
1.过滤器,主要的用途是过滤字符编码、做一些业务逻辑判断等。
2.监听器,做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等
3.拦截器,在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法。是基于JAVA的反射机制