SpringBoot实践之(一)--- 过滤器、监听器的使用

过滤器(Filter)文件

MyFilter.java

package org.springboot.sample.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * 使用注解标注过滤器
 * @WebFilter将一个实现了javax.servlet.Filter接口的类定义为过滤器
 * 属性filterName声明过滤器的名称,可选
 * 属性urlPatterns指定要过滤 的URL模式,也可使用属性value来声明.(指定要过滤的URL模式是必选属性)
 * 
 * @author   单红宇(365384722)
 * @myblog  http://blog.csdn.net/catoop/
 * @create    2016年1月6日
 */
@WebFilter(filterName="myFilter",urlPatterns="/*")
public class MyFilter implements Filter {

    @Override
    public void destroy() {
        System.out.println("过滤器销毁");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("执行过滤操作");
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        System.out.println("过滤器初始化");
    }

}

ServletContext监听器(Listener)文件

MyServletContextListener.java

package org.springboot.sample.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * 使用@WebListener注解,实现ServletContextListener接口
 *
 * @author   单红宇(365384722)
 * @myblog  http://blog.csdn.net/catoop/
 * @create    2016年1月6日
 */
@WebListener
public class MyServletContextListener implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContex初始化");
        System.out.println(sce.getServletContext().getServerInfo());
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("ServletContex销毁");
    }

}

ServletContext监听器(Listener)文件

MyHttpSessionListener.java

package org.springboot.sample.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * 监听Session的创建与销毁
 *
 * @author   单红宇(365384722)
 * @myblog  http://blog.csdn.net/catoop/
 * @create    2016年1月6日
 */
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("Session 被创建");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("ServletContex初始化");
    }

}

注意不要忘记在 SpringBootSampleApplication.java 上添加 @ServletComponentScan 注解。

在启动的过程中我们会看到输出:

ServletContex初始化
Apache Tomcat/8.0.30
过滤器初始化

服务启动后,随便访问一个页面,会看到输出:

执行过滤操作
Session 被创建

补充

很多人说HttpSessionListener没有不能执行 ,自己验证后springboot如果只是若原作者说的配置的话,确实没调用。
只有经过DispatcherServlet 的请求, 才会调用httpsessionlistener
用如下方法,session的创建,可以触发httpsessionlistener

    @RequestMapping("/login")
    public String loginHtml(HashMap<String,Object> map, HttpServletRequest request, HttpServletResponse response ){
        request.getSession().setAttribute("name","XXX");
        String text  = request.getParameter("name");
        map.put("hello",text);
//   return new ModelAndView("redirect:/hello");
        return"/hello";
    }

页面请求后,会触发后台打印 “Session 被创建”

====补充=============================================
假设客户端在http请求中,已经加入了Header的认证信息,例如:

[java] view plain copy
HttpPost post = new HttpPost(“http://localhost:8990/sendMail“);
StringEntity entity = new StringEntity(json, “utf-8”);
entity.setContentType(“application/json”);
post.setEntity(entity);
// 设置验证头信息
post.addHeader(“token”, “WEFGYHJIKLTY4RE6DF29HNBCFD13ER87”);
那么服务端怎么通过Filter,来验证客户端的token是否有效了?请接着往下看。
一、实现自定义Filter

1、实现Filter接口

我们要自定义Filter,只需实现Filter接口即可

2、覆写doFilter方法

根据业务逻辑,来覆写doFilter方法

示例如下:

[java] view plain copy
@Slf4j
@Component
@WebFilter(urlPatterns={“/sendMail/*”}, filterName=”tokenAuthorFilter”)
public class TokenAuthorFilter implements Filter {

@Autowired  
private AuthorizationRepository repository;  

@Override  
public void destroy() {  

}  

@Override  
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)  
        throws IOException, ServletException {  
    HttpServletRequest req = (HttpServletRequest)request;  
    response.setCharacterEncoding("UTF-8");  
    response.setContentType("application/json; charset=utf-8");  
    String token = req.getHeader("token");  
    Response res = new Response();  
    boolean isFilter = false;  
    if (null == token || token.isEmpty()) {  
        res.setSuccess(false);  
        res.setErrorCode("403");  
        res.setErrorMessage("token没有认证通过!原因为:客户端请求参数中无token信息");  
    } else {  
        Authorization auth = repository.findByToken(token);  
        if (null == auth) {  
            res.setSuccess(false);  
            res.setErrorCode("403");  
            res.setErrorMessage("token没有认证通过!原因为:客户端请求中认证的token信息无效,请查看申请流程中的正确token信息");  
        }else if((auth.getStatus() == 0)){  
            res.setSuccess(false);  
            res.setErrorCode("401");  
            res.setErrorMessage("该token目前已处于停用状态,请联系邮件系统管理员确认!");  
        }else{  
            isFilter = true;  
            res.setSuccess(true);  
        }  
    }  
    if(!res.isSuccess()){  
        PrintWriter writer = null;  
        OutputStreamWriter osw = null;  
        try {  
            osw = new OutputStreamWriter(response.getOutputStream() , "UTF-8");  
            writer = new PrintWriter(osw, true);  
            String jsonStr = ObjectMapperInstance.getInstance().writeValueAsString(res);  
            writer.write(jsonStr);  
            writer.flush();  
            writer.close();  
            osw.close();  
        } catch (UnsupportedEncodingException e) {  
            log.error("过滤器返回信息失败:" + e.getMessage(), e);  
        } catch (IOException e) {  
            log.error("过滤器返回信息失败:" + e.getMessage(), e);  
        } finally {  
            if (null != writer) {  
                writer.close();  
            }  
            if(null != osw){  
                osw.close();  
            }  
        }  
        return;  
    }  
    if(isFilter){  
        log.info("token filter过滤ok!");  
        chain.doFilter(request, response);  
    }  
}  

@Override  
public void init(FilterConfig arg0) throws ServletException {  

}  

}

通过上面的几步,就实现了一个自定义的Filter。
3、注册Filter

接下来,需要注册这个过滤器,spring boot提供了以下两种注册方式。

3.1 是用注解注册

在Filter上添加如下注解即可

[java] view plain copy
@Slf4j

@Component
@WebFilter(urlPatterns={“/sendMail/*”}, filterName=”tokenAuthorFilter”)
public class TokenAuthorFilter implements Filter {
@WebFilter注解的作用就是用来注册Filter,通过这种方式注册的Filter,需要在启动类上加上@ServletComponentScan注解才能生效,如下:

[java] view plain copy
@ServletComponentScan
public class MailserviceApplication {

public static void main(String[] args) {  
    SpringApplication.run(MailserviceApplication.class, args);  
}  

}

3.2 手动配置Filter

[java] view plain copy
@Configuration
@Component
public class FilterConfig {

@Autowired  
private TokenAuthorFilter filter;  

@Bean  
public FilterRegistrationBean  filterRegistrationBean() {  
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();  
    registrationBean.setFilter(filter);  
    List<String> urlPatterns = new ArrayList<String>();  
    urlPatterns.add("/sendMail/*");// 设置匹配的url  
    registrationBean.setUrlPatterns(urlPatterns);  
    return registrationBean;  
}  

}
上面两种方式虽然使用上有些不一样,但是本质都是一样的,都会调用FilterRegistrationBean来进行注册。

二、spring boot内置的Filter

为了方便我们的开发,spring boot内置了许多有用的Filter,我们可以根据业务的需求,选择适合业务的Filter。

三、拓展

通过前面的N篇博客,我们会发现spring boot处理Servlet,Listener,Filter的思路大致都是一样,对应的注解分别为@WebServlet 、@WebListener、@WebFilter,对应的注册Bean分别为ServletRegistrationBean,ServletListenerRegistrationBean,FilterRegistrationBean,无论哪种方式,都大大的简化了我们的开发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值