Spring-AOP

面向切面编程
什么叫面向切面编程呢,就是说监听一切相关的类或者方法,这个被监听者就是切面

常见的切面

  • 方法的切面
  • 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");
    }
    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