监听器
- 概念
,事件处理模型涉及到三个组件:事件源、事件对象、事件监听器。
- WebServerlt监听器
在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象
Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:
- 监听域对象自身的创建和销毁的事件监听器。
- 监听域对象中的属性的增加和删除的事件监听器。
- 监听绑定到HttpSession域中的某个对象的状态的事件监听器。
- 或者使用实现对应的类,ServletContextListener,HttpSessionListener ,ServletRequestListener 来实现监听内容,在web.xml注册监听器,实现监听,作用于程序使用全过程
拦截器
作用于方法前后,也就是Aop面向切面编程,动态代理是一个拦截器实现
过滤器
作用于请求action的前后,
拦截器于过滤器区别
两者的本质区别:拦截器是基于Java的反射机制的,而过滤器是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,他都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。
常用应用场景
1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。
2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);
4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。
5、OpenSessionInView:如Hibernate,在进入处理器打开Session,在完成后关闭Session。
…………本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现
Springboot的filter实现,通过配置urlPatterns去实现会使用这个过滤器的请求
package com.topsec.tsm.baseConfig.filter; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; /** * Created by topsec on 2017/12/15. */ @WebFilter(filterName = "loginFilter",urlPatterns = {"/worldMap","/showScreen2","/showScreen3","/showScreen1","/asset/*","/intel/*","/notice/*","/settle/*","/websiteMonitor/*", "/importanceActivity/*", "/log/*", "/user/*", "/departMent", "/role/*", "/clgl/*", "/listResponse/*", "/riskReportMana/*", "/riskReportRecord/*", "/permission/*","/resource/*","/resourceDomain/*","/behaviorDomain/*","/updateRole/*","/showScreen/*","/index","/situation/goThreaten","/commandPost/toControlCenter"}) public class WxbFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest hsr = (HttpServletRequest) request; HttpServletResponse hsrp = (HttpServletResponse) response; String reqUrl = hsr.getRequestURI(); String referer = ((HttpServletRequest) request).getHeader("Referer"); String httphost = ((HttpServletRequest) request).getHeader("host"); String method = hsr.getMethod(); HttpSession session = hsr.getSession(); Object userName = session.getAttribute("userName"); if(null==userName || "".equals(userName)){ hsrp.sendRedirect("/"); return ; } if(httphost!=null && !"".equals(httphost)){ String[] hosts=httphost.split(":"); if(null!=hosts && hosts.length!=0){ httphost=hosts[0]; } } if(httphost == null || "".equals(httphost) ){ hsrp.sendRedirect(httphost); return; } if(userName!=null&&!"".equals(userName)){ chain.doFilter(request, response); return; }else if ("/login".equals(reqUrl) || reqUrl.contains("/logOut") || reqUrl.contains("/subCode")) { /*reqUrl.indexOf(notExclude) != -1 ||"/".equals(reqUrl) || reqUrl.contains("/login") ||*/ chain.doFilter(request, response); return; // 去除固定ip访问限制 // }else if(referer == null || "".equals(referer) || referIp.indexOf(referer)<=0) { }else if(referer == null || "".equals(referer) ) { hsrp.sendRedirect("/"); return; } else{ hsrp.sendRedirect("/"); return; } } @Override public void destroy() { } }
|
Springboot实现拦截器
package com.topsec.tsm.baseConfig.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** * 拦截器配置 * Created by YS on 2017/6/19. */ @Configuration public class WebAppConfigurer extends WebMvcConfigurerAdapter { /** * 配置拦截器 */ @Override public void addInterceptors(InterceptorRegistry registry) { // TODO Auto-generated method stub // 多个拦截器组成一个拦截器链 // addPathPatterns 用于添加拦截规则 // excludePathPatterns 用户排除拦截 // registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/**"); super.addInterceptors(registry); } /** * 添加自定义的静态资源映射 这里使用代码的方式自定义目录映射,并不影响Spring Boot的默认映射,可以同时使用。 */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // registry.addResourceHandler("/new/**").addResourceLocations("classpath:/new/"); // registry.addResourceHandler("/**").addResourceLocations("/"); super.addResourceHandlers(registry); } }
|
自定义注解
package com.topsec.tsm.baseConfig.aspect; import java.lang.annotation.*; /** * Created by topsec on 2017/11/10. */ @Retention(RetentionPolicy.RUNTIME)//注解会在class中存在,运行时可通过反射获取 @Target(ElementType.METHOD)//目标是方法 @Documented//文档生成时,该注解将被包含在javadoc中,可去掉 public @interface OperationLogger { /** * 模块名字 */ String name() default ""; /** * 操作类型 */ String option(); }
|
使用
@OperationLogger(name = "大屏通报处置", option = "通报总数与不同处置状态数量统计")
|
Shrio认证原理:
* Shiro登录认证(原理:用户提交 用户名和密码 --- shiro 封装令牌 ---- realm 通过用户名将密码查询返回 ---- shiro 自动去比较查询出密码和用户输入密码是否一致---- 进行登陆控制 )
集合不变
private static final Set<String> ALLOWED_PATHS = Collections.unmodifiableSet(new HashSet<>( Arrays.asList("/services/riskEvent")));
|
抛出异常
extend Exception 处理一些可预料的异常,或者try catch throw new Exception("保存主机数据异常!接口返回:respMsg="+respMsg);
|