面向切面编程
什么叫面向切面编程呢,就是说监听一切相关的类或者方法,这个被监听者就是==切面==
常见的切面
- 方法的切面
- interceptor拦截器
- filter过滤器
在ssm文件夹下创建一个叫aop的文件夹
方法的切面
可以在被监听的方法的前后或者环绕进行拦截,下面是环绕的示例代码
// aop/aop.java @Component @Aspect public class aop { // Pointcut定义切点函数 @Pointcut("execution(* com.pdt.ssm.service.*.*(..))") private void myPointcut() { } @Around("myPointcut()") public Object aroundAdvice(ProceedingJoinPoint jp) throws Throwable { System.out.println("--->BindingResultAop start..."); String className = jp.getTarget().getClass().getName(); String methodName = jp.getSignature().getName(); System.out.println("before " + className + "." + methodName + "() invoking!"); // 执行目标方法 return jp.proceed(); } }
interceptor拦截器
这个最常用在对未登陆用户的监听
// aop/interceptor.java public class interceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object arg2) throws Exception { // 在这个可以判断访问路径, // 常用于 判断req是不是有指定的token或者session表示登录状态 // 也可以用来判断访问路径存不存在,没有返回404页面 // 返回true是放行,false就是 // 如果不放行,先用req.getRequestDispatcher(路径).forword(req,res),再return false return true; } }
filter过滤器
我设定了3个过滤器
- whiteList,白名单过滤器
// config.java 添加白名单 public class config { public static final ArrayList whiteList = new ArrayList(); static { whiteList.add("127.0.0.1:80"); whiteList.add("127.0.0.1:3000"); whiteList.add("127.0.0.1:8080"); whiteList.add("127.0.0.1:8848"); whiteList.add("127.0.0.1:9528"); whiteList.add("localhost:9528"); whiteList.add("pdt1997.top"); whiteList.add("xxx.pdt1997.top"); whiteList.add("www.pdt1997.top"); whiteList.add("wx.pdt1997.top"); whiteList.add("xcc.pdt1997.top"); } public static boolean isWhiteList(String ip) { if(whiteList.indexOf(ip)==-1){ return false; } return true; } } // WebFilter注解就不需要去web.xml里配置filter标签 @WebFilter(filterName = "whiteListFilter", urlPatterns = "/*",/*通配符(*)表示对所有的web资源进行拦截*/ initParams = { @WebInitParam(name = "charset", value = "utf-8")/*这里可以放一些初始化的参数*/ }) public class whiteListFilter implements Filter { private String filterName; public void destroy() { /*销毁时调用*/ System.out.println(filterName + "销毁"); } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { HttpServletRequest httpreq = (HttpServletRequest)req; String Origin = httpreq.getHeader("Origin"); System.out.println(Origin); // String Referer = httpreq.getHeader("Referer"); if(StringUtils.isEmpty(Origin)){ chain.doFilter(req,resp); //放行 }else{ Origin = Origin.split("//")[1]; System.out.println(Origin); if(config.isWhiteList(Origin)){ chain.doFilter(req,resp); //放行 }else{ System.out.println("不在白名单之内"); } } } public void init(FilterConfig config) throws ServletException { /*初始化方法 接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/ filterName = config.getFilterName(); System.out.println("过滤器:" + filterName + "启动"); } }
- 日记过滤器
// WebFilter注解就不需要去web.xml里配置filter标签 @WebFilter(filterName = "loggerFilter", urlPatterns = "/*",/*通配符(*)表示对所有的web资源进行拦截*/ initParams = { @WebInitParam(name = "charset", value = "utf-8")/*这里可以放一些初始化的参数*/ }) public class loggerFilter implements Filter { private String filterName; final Logger log = Logger.getLogger(loggerFilter.class); public void destroy() { /*销毁时调用*/ System.out.println(filterName + "销毁"); } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { HttpServletRequest httpreq = (HttpServletRequest)req; System.out.println(new Date().getTime()+"---"+httpreq.getMethod()+"---"+httpreq.getRequestURL()); /*过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理*/ log.info("这是日志") chain.doFilter(req,resp); //放行 } public void init(FilterConfig config) throws ServletException { /*初始化方法 接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/ filterName = config.getFilterName(); System.out.println("过滤器:" + filterName + "启动"); } }
- 跨域过滤器
// WebFilter注解就不需要去web.xml里配置filter标签 @WebFilter(filterName = "crosFilter", urlPatterns = "/*",/*通配符(*)表示对所有的web资源进行拦截*/ initParams = { @WebInitParam(name = "charset", value = "utf-8")/*这里可以放一些初始化的参数*/ }) public class crosFilter implements Filter { private String filterName; public void destroy() { /*销毁时调用*/ System.out.println(filterName + "销毁"); } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { System.out.println(filterName); /*过滤方法 主要是对request和response进行一些处理,然后交给下一个过滤器或Servlet处理*/ HttpServletResponse httpResponse = (HttpServletResponse)resp; httpResponse.setHeader("Access-Control-Allow-Origin", "*"); httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); httpResponse.setHeader("Access-Control-Max-Age", "1800"); httpResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With,Content-Type,Accept,accept,Access-Control-Request-Method,Access-Control-Request-Headers,token,x-token"); httpResponse.setHeader("Access-Control-Allow-Credentials", "true"); chain.doFilter(req,resp); //放行 } public void init(FilterConfig config) throws ServletException { /*初始化方法 接收一个FilterConfig类型的参数 该参数是对Filter的一些配置*/ filterName = config.getFilterName(); System.out.println("过滤器:" + filterName + "启动"); } }
来源:https://www.cnblogs.com/pengdt/p/12240602.html