SpringBoot使用过滤器、 * 和 * 的案例代码(Springboot搭建java项目)

作者:dreamer_0423 时间:2022-11-21 06:08:54 

SpringBoot使用过滤器、 * 和 *

一、SpringBoot使用过滤器

Spring boot过滤器的使用(两种方式)

  • 使用spring boot提供的FilterRegistrationBean注册Filter

  • 使用原生servlet注解定义Filter

两种方式的本质都是一样的,都是去FilterRegistrationBean注册自定义Filter

方式一:

第一步:先定义Filter。

import javax.servlet.*;
import java.io.IOException;
public class MyFilter implements Filter {
   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
   }
   @Override
   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
       // do something 处理request 或response
       System.out.println("filter1");
       // 调用filter链中的下一个filter
       filterChain.doFilter(servletRequest,servletResponse);
   }
   @Override
   public void destroy() {
   }
}

第二步:注册自定义Filter

@Configuration
public class FilterConfig {
   @Bean
   public FilterRegistrationBean registrationBean() {
       FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new MyFilter());
       filterRegistrationBean.addUrlPatterns("/*");
       filterRegistrationBean.setOrder(1);//定义过滤器的执行先后顺序  值越小越先执行 不影响Bean的加载顺序
       return filterRegistrationBean;
   }
}

方式二:

// 注入spring容器
@Order(1)//定义过滤器的执行先后顺序  值越小越先执行 不影响Bean的加载顺序
@Component
// 定义filterName 和过滤的url
@WebFilter(filterName = "my2Filter" ,urlPatterns = "/*")
public class My2Filter implements Filter {
   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
   }
   @Override
   public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
       System.out.println("filter2");
   }
   @Override
   public void destroy() {
   }
}

二、SpringBoot使用 *

第一步:定义 *

public class MyInterceptor implements HandlerInterceptor {
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
       System.out.println("preHandle");
       return true;
   }
   @Override
   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
       System.out.println("postHandle");
   }
   @Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
       System.out.println("afterCompletion");
   }
}

第二步:配置 *

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(new MyInterceptor());
   }
}

三、过滤器和 * 的执行顺序

过滤器的执行顺序是安装@Order注解中的值,或者是setOrder()中值的进行执行顺序排序的,值越小就越靠前。

* 则是先声明的 * preHandle() 方法先执行,而postHandle()方法反而会后执行。也即是:postHandle() 方法被调用的顺序跟 preHandle() 居然是相反的。如果实际开发中严格要求执行顺序,那就需要特别注意这一点。

四、SpringBoot使用 *

1、统计网站最多在线人数 * 的例子

/**
* 上下文 * ,在服务器启动时初始化onLineCount和maxOnLineCount两个变量,
* 并将其置于服务器上下文(ServletContext)中,其初始值都是0。
*/
@WebListener
public class InitListener implements ServletContextListener {
   public void contextDestroyed(ServletContextEvent evt) {
   }
   public void contextInitialized(ServletContextEvent evt) {
       evt.getServletContext().setAttribute("onLineCount", 0);
       evt.getServletContext().setAttribute("maxOnLineCount", 0);
   }
}
/**
* 会话 * ,在用户会话创建和销毁的时候根据情况修改onLineCount和maxOnLineCount的值。
*/
@WebListener
public class MaxCountListener implements HttpSessionListener {
   public void sessionCreated(HttpSessionEvent event) {
       ServletContext ctx = event.getSession().getServletContext();
       int count = Integer.parseInt(ctx.getAttribute("onLineCount").toString());
       count++;
       ctx.setAttribute("onLineCount", count);
       int maxOnLineCount = Integer.parseInt(ctx.getAttribute("maxOnLineCount").toString());
       if (count > maxOnLineCount) {
           ctx.setAttribute("maxOnLineCount", count);
           DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
           ctx.setAttribute("date", df.format(new Date()));
       }
   }
   public void sessionDestroyed(HttpSessionEvent event) {
       ServletContext app = event.getSession().getServletContext();
       int count = Integer.parseInt(app.getAttribute("onLineCount").toString());
       count--;
       app.setAttribute("onLineCount", count);
   }
}

新建一个servlet处理

@WebServlet(name = "SessionServlet",value = "/sessionCount")
public class SessionServlet extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.setContentType("text/html");
       //获取上下文对象
       ServletContext servletContext = this.getServletContext();
       Integer onLineCount = (Integer) servletContext.getAttribute("onLineCount");
       System.out.println("invoke doGet");
       PrintWriter out = resp.getWriter();
       out.println("<html><body>");
       out.println("<h1>" + onLineCount + "</h1>");
       out.println("</body></html>");
   }
}

2、springboot * 的使用(以实现异步Event监听为例子)

定义事件类 Event

创建一个类,继承ApplicationEvent,并重写构造函数。ApplicationEvent是Spring提供的所有应用程序事件扩展类。

public class Event extends ApplicationEvent {
   private static final long serialVersionUID = 1L;
   private String msg ;
   private static final Logger logger=LoggerFactory.getLogger(Event.class);
   public Event(String msg) {
       super(msg);
       this.msg = msg;
       logger.info("add event success! message: {}", msg);
   }
   public String getMsg() {
       return msg;
   }
   public void setMsg(String msg) {
       this.msg = msg;
   }
}

创建一个用于监听指定事件的类,需要实现ApplicationListener接口,说明它是一个应用程序事件的监听类。注意这里需要加上@Component注解,将其注入Spring容器中。

@Component
public class MyListener implements ApplicationListener<Event>{
   private static final Logger logger= LoggerFactory.getLogger(MyListener.class);
   @Override
   public void onApplicationEvent(Event event) {
       logger.info("listener get event,sleep 2 second...");
       try {
           Thread.sleep(2000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       logger.info("event msg is:{}",event.getMsg());
   }
}

事件发布
事件发布很简单,只需要使用Spring 提供的ApplicationEventPublisher来发布自定义事件

@Autowired 注入ApplicationEventPublisher

@RequestMapping("/notice/{msg}")
   public void notice(@PathVariable String msg){
       logger.info("begin>>>>>");
       applicationEventPublisher.publishEvent(new Event(msg));
       logger.info("end<<<<<<<");
   }

来源:https://blog.csdn.net/m0_46616045/article/details/128823964

标签:SpringBoot,过滤器, , , ,
0
投稿

猜你喜欢

  • 通过LinQ查询字符出现次数的实例方法

    2023-12-10 13:40:01
  • SpringBoot使用Atomikos技术整合多数据源的实现

    2021-11-08 23:46:23
  • 使用SpringMVC访问Controller接口返回400BadRequest

    2023-06-05 00:14:01
  • Java带复选框的树(Java CheckBox Tree)实现和应用

    2021-07-25 20:53:46
  • Java 继承与多态的深入理解

    2023-10-05 04:25:41
  • Maven setting.xml配置文件详解

    2023-06-28 00:33:41
  • Android开发中Launcher3常见默认配置修改方法总结

    2023-08-28 06:43:43
  • IDEA调试技巧条件断点实现步骤详解

    2023-11-24 16:02:42
  • 聊一聊SpringBoot服务监控机制

    2023-02-09 02:47:48
  • 基于eclipse.ini内存设置的问题详解

    2021-08-25 02:56:55
  • C#byte数组与Image的相互转换实例代码

    2023-08-15 16:15:51
  • 通过Java实现反向代理集群服务的平滑分配

    2023-05-28 12:51:54
  • C语言深入浅出解析二叉树

    2022-05-12 11:28:21
  • Freemarker如何生成树形导航菜单(递归)

    2023-02-24 13:52:16
  • 浅析C#中StringBuilder类的高效及与String的对比

    2022-09-14 15:54:04
  • struts2中使用注解配置Action方法详解

    2023-08-30 00:01:25
  • Android自定义View绘制的方法及过程(二)

    2023-05-02 14:42:17
  • 详解Mybatis注解写法(附10余个常用例子)

    2023-01-19 03:39:53
  • Android应用中绘制圆形头像的方法解析

    2022-02-06 00:46:52
  • java 微信随机红包算法代码实例

    2022-12-03 12:29:08
  • asp之家 软件编程 m.aspxhome.com