• 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 + "启动");
        }
    }
    
  • 相关阅读:
    Cross-Site Scripting(XSS)简介
    nginx查看安装了哪些模块
    Win7系统修改hosts文件不能保存的解决方法
    firefox怎么修改tls协议号
    在Nginx中部署基于IP的虚拟主机
    openssl生成ssl证书
    给kali linux2.0装一个中文输入法
    tenda u1 usb wireless device install driver for kali linux kernal Debian 4.3.3-7kali2 (2016-01-27) x86_64 GNU/Linux
    python2.7.x的字符串编码到底什么鬼?(中文和英文的处理)
    fswatch rsync配置使用 rsync 传输大量细小文件
  • 原文地址:https://www.cnblogs.com/pengdt/p/12240602.html
Copyright © 2020-2023  润新知