过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西;
1)过滤敏感词汇(防止sql注入)
2)设置字符编码
3)URL级别的权限访问控制
4)压缩响应信息
拦截器可以简单理解为“拒你所想拒” 关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。
拦截器本质上是面向切面编程(AOP),符合横切关注点的功能都可以放在拦截器中来实现,主要的应用场景包括:
监听器:listener是servlet规范中定义的一种特殊类。用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件。
用于在事件发生前、发生后做一些必要的处理。其主要可用于以下方面:
1、统计在线人数和在线用户
2、系统启动时加载初始化信息
3、统计网站访问量
4、记录用户访问路径
// /* 过滤全部请求 urlPatterns 可以使用{"",""}指定过滤
@WebFilter(urlPatterns = "/*",filterName = "filter1")
public class FilterDemo1 implements Filter { //可以创建多个过滤器
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("过滤器1开始初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("过滤器1开始工作");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
System.out.println("过滤器1销毁");
}
}
然后在启动类上加上 @ServletComponentScan 注解就会自动注册到容器里
// 拦截器 可以定义多个
public class InterceptorDemo1 extends HandlerInterceptorAdapter {
//预处理 ,controller方法执行前执行
//如果 return false 那么就不会执行后面的方法 包括将要执行的控制器的方法
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
StringBuffer requestURL = httpServletRequest.getRequestURL();
System.out.println("前置拦截器1 preHandle: 请求的uri为:"+requestURL.toString());
return true;
}
// 后处理
// 当执行完controller方法 还有没 return前执行
//切记如果预处理返回值为false 后处理就不会执行
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器1 postHandle: ");
}
// 最终处理
// 执行完controller方法后 并且return后 才会执行
// 如果预处理 retrun fasle; 最终处理 就不会执行了
// 但是这个无法跳转页面了 因为都执行完了 还跳个屁啊 一般都用于资源释放
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("拦截器1 afterCompletion: ");
}
}
注册拦截器
@Configuration
public class InterceptorConfiguration implements WebMvcConfigurer {
/** * 注册自定义拦截器 */
@Override
public void addInterceptors(InterceptorRegistry registry) {
// /** 代表拦截所有请求 执行顺序和配置顺序有关系,即先配置顺序就在前
// 添加拦截器
new InterceptorDemo1();
registry.addInterceptor(new InterceptorDemo1() )
// 定义拦截路径
.addPathPatterns("/**")
// 定义放行路径
.excludePathPatterns("/index/**");
}
拦截器中的handler参数使用
//必须Controller请求
if(handler.getClass().isAssignableFrom(HandlerMethod.class)){
HandlerMethod handlerMethod = (HandlerMethod) handler;
System.out.println("当前拦截的方法为:"+handlerMethod.getMethod().getName());
System.out.println("当前拦截的方法参数长度为:"+handlerMethod.getMethod().getParameters().length);
System.out.println("当前拦截的类为:"+handlerMethod.getBean().getClass().getName());
String uri = request.getRequestURI();
System.out.println("拦截的uri:"+uri);
}
常用监听器有三种
//应用启动监听
@WebListener
public class ServletContextListenerDemo implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
System.out.println("ServletContextListenerDemo监听器初始化。。。。。。。。。。。。");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContextListenerDemo监听器销毁。。。。。。。。。。。");
}
}
//请求监听
@WebListener
public class ServletRequestListenerDemo implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
ServletRequest servletRequest = sre.getServletRequest();
System.out.println("ServletRequestListenerDemo监听器初始化。。。。。。。。。。。。");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("ServletRequestListenerDemo监听器销毁。。。。。。。。。。。");
}
}
//监听session监听器
@WebListener
public class SessionListenerDemo implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println("SessionListenerDemo。。。创建session成功");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("SessionListenerDemo。。。销毁session");
}
}
然后在启动类上加上 @ServletComponentScan 注解就会自动注册到容器里
ssionListenerDemo。。。创建session成功");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("SessionListenerDemo。。。销毁session");
}
}
然后在启动类上加上 @ServletComponentScan 注解就会自动注册到容器里
更深层次的用法需要根据业务来定,自己进行设计
<center><font color=#FF3366 size=5 >点赞 -收藏-关注-便于以后复习和收到最新内容</font></center>
<center> <font color=#FF3366 size=4 >有其他问题在评论区讨论-或者私信我-收到会在第一时间回复</font></center>
<center><font color=#FF3366 size=6 >如有侵权,请私信联系我</font></center>
<center> <font color=#FF3366 size=6 >感谢,配合,希望我的努力对你有帮助^_^ </font></center>
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_45203607/article/details/120250823
内容来源于网络,如有侵权,请联系作者删除!