代理模式

WebMagic使用代理ip爬数据解决HTTP407问题

匿名 (未验证) 提交于 2019-12-02 21:52:03
手头一个小活儿是爬竞品网站数据。使用webmagic来实现。光公司ip不行,被封了就会影响业务正常访问。刚好公司另一个项目购买了代理IP资源“站大爷”,那个项目夭折了,于是申请借来用用。 调通站大爷提供的获取代理ip的api接口并没什么技术难度。可是,在运行爬数据程序时,收到http的407错误。经了解,407是授权错误,要求代理身份验证。站大爷技术支持提醒说检查一下产品配置。发现“一手私密代理”里当前授权模式是“用户名+密码”。然后,再看webmagic的Proxy类,有一个构造器是除了必传的ip、端口外,还可以传用户名和密码。那就是它了。改正以后,测试ok。 webmagic使用代理IP实现爬虫的部分代码: Request request = new Request("https://www.xxx.com/a/b"); request.setMethod("POST"); try { request.addHeader("Proxy-Authorization","Basic "+ Base64.getEncoder().encodeToString("20190430**********:password".getBytes("utf-8"))); request.addHeader("Authorization","Basic "+ Base64.getEncoder()

HTTP协议详解

試著忘記壹切 提交于 2019-12-02 21:49:13
引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。 HTTP协议的主要特点可概括如下: 1.支持客户/服务器模式。 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 一、HTTP协议详解之URL篇 http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议

Spring4学习回顾之路11-AOP

南楼画角 提交于 2019-12-02 21:42:07
  Srping的核心除了之前讲到的IOC/DI之外,还有一个AOP(Aspect Oriented Programming:面向切面编程):通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。主要的功能: 日志记录,性能统计,安全控制,事务处理,异常处理等等。   在介绍AOP之前,先介绍动态代理;代理设计模式的原理:使用一个 代理将对象包装起来, 然后用该代理对象取代原始对象,任何对原始对象的调用都要通过代理,代理对象决定是否以及何时将方法调用转到原始对象上。 案例:基于接口实现的动态代理:JDK动态代理 首先定义一个接口,用于运算的Operation.java package com.lql.proxy; /** * @author: lql * @date: 2019.10.29 * Description: */ public interface Operation { //加法 int add(int i,int j); //减法 int sub(int i,int j); } 再来定义实现类OperationImpl.java package com.lql.proxy; /** * @author: lql * @date:

Java 动态代理及 RPC 框架介绍

匿名 (未验证) 提交于 2019-12-02 21:35:18
动态代理是什么 java动态代理机制 动态代理的应用 最后 所谓动态代理,指的是语言提供的一种语法,能够将对对象中不同方法的调用重定向到一个统一的处理函数中来。 python重写getattr函数能够做到这一点,就连世界上最好的语言也提供称为魔术方法的__call。 这种语法除了能更好的实现动态代理外,还是RPC框架实现原理的一部分。 动态代理是什么 动态代理提供一种抽象,能够将对象中不同方法的调用重定向到一个统一的处理函数,做自定义的逻辑处理。 但是对于调用者,对此毫无察觉,就好像调用的方法是用传统方式实现的一般。 这种语法,在java中被称为动态代理。之所以叫做动态代理,是因为它能避免传统代理模式实现中人工一个一个的将java函数转发过去, 而是能够让代码自动做到这一点,这样代理类的代码是和业务无关的,不会因为业务类的方法增多而逐渐庞大。 使代码更易维护更易修改,实现自动化搬砖。 实际上,被代理的类不一定位于本机类,动态代理语法提供了一种抽象方式,被代理的类也可以位于远程主机上,这也是RPC框架实现原理的一部分。 理解了动态代理的概念后不难发现,动态代理概念上有着这么几个部分: 给调用者使用的代理类。在java中,我们发现动态代理提供的抽象天然契合面向接口编程,因此它也有可能是接口。 一个统一的处理函数,收集不同函数转发过来的请求,可自定义处理逻辑集中处理

自定义Aspect风格的AOP框架

安稳与你 提交于 2019-12-02 20:14:57
本篇博客参考《架构探险--从零开始写java web框架》4.3章节 1代理接口: package smart.myaop.framework; public interface Proxy { /** * 执行链式调用 */ Object doProxy(ProxyChain proxyChain) throws Throwable; } 2代理链(责任链模式,同一个对象可以被多个Proxy层层代理): package smart.myaop.framework; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; /** * 代理链 */ public class ProxyChain { private final Class<?> targetClass; //目标类 private final Object targetObject; //目标对象 private final Method targetMethod; //目标方法 private final MethodProxy methodProxy; //方法代理,cglib提供的方法代理对象 private final

Java动态代码

烈酒焚心 提交于 2019-12-02 19:21:15
比较C++和java ,后者是编译成java class文件,执行时动态生产java类,所以就有泛型时不能通过设置值就确定了具体的class类型,也有了动态生产可执行的方法和类,这里持续记录 --------------------------------- 一 JDK动态代理 为了方便理解动态代理 ,我先一句话说明白静态代理: 就是代理类和被代理类都继承一个接口,代理类里有个被代理类的field,暴露给外界的时代理类,代理类的每个方法都执行一下代理的逻辑,再调用被代理类。 开始说jdk的动态代理,还是需要一个接口类,就是把原来代码里直接的 被代理类.方法()的调用方式, 换成了反射方式调用,代码的编写上少了许多,不需要每个方法都写一遍了。 二 cglib动态生成类来实现代理模式: public class MainTest5 { public static void main(String[] args) { if (true) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(OOMObject.class); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() { public Object intercept

Spring代理模式

自作多情 提交于 2019-12-02 17:50:19
二者区别: 静态代理模式: 灵活性不强;如果有1000个dao;就有1000个代理类;没有做到通用性 静态代理模式: package StaticProxy; public interface PersonDao { public void sava(); public void update(); } package StaticProxy; public class PersonDaoimpl implements PersonDao { public String user = null; PersonDaoimpl(){} /** * @return the user */ public String getUser() { return user; } /** * @param user the user to set */ public void setUser(String user) { this.user = user; } PersonDaoimpl(String user){ this.user = user; } @Override public void sava() { // TODO Auto-generated method stub System.out.println("进入方法"); } @Override public void update

curl命令

旧巷老猫 提交于 2019-12-02 17:08:34
记录记录 curl命令 网络应用 curl命令 是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具。作为一款强力工具,curl支持包括HTTP、HTTPS、 ftp 等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。做网页处理流程和数据检索自动化,curl可以祝一臂之力。 语法 curl(选项)(参数) 选项 -a/--append 上传文件时,附加到目标文件 -A/--user-agent <string> 设置用户代理发送给服务器 -anyauth 可以使用“任何”身份验证方法 -b/--cookie <name=string/ file > cookie字符串或文件读取位置 --basic 使用HTTP基本验证 -B/--use-ascii 使用ASCII /文本传输 -c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中 -C/--continue- at <offset> 断点续转 -d/--data <data> HTTP POST方式传送数据 --data-ascii <data> 以ascii的方式post数据 --data-binary <data> 以二进制的方式post数据 -

Spring代理模式

久未见 提交于 2019-12-02 16:35:08
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法 举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决.这就是代理思想在现实中的一个例子 用图表示如下: 代理模式的关键点是:代理对象与目标对象.代理对象是对目标对象的扩展,并会调用目标对象 1.1.静态代理(类似于装饰者模式) 静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类. 下面举个案例来解释: 模拟保存动作,定义一个保存动作的接口:IUserDao.java,然后目标对象实现这个接口的方法UserDao.java,此时如果使用静态代理方 式,就需要在代理对象(UserDaoProxy.java)中也实现IUserDao接口.调用的时候通过调用代理对象的方法来调用目标对象. 需要注意的是,代理对象与目标对象要实现相同的接口

mybatis中使用到的设计模式

时光怂恿深爱的人放手 提交于 2019-12-02 16:16:32
Spring中的用到的设计模式大全 spring中常用的设计模式达到九种,我们举例说明: 第一种:简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。如下配置,就是在 HelloItxxz 类中创建一个 itxxzBean。 <beans> <bean id="singletonBean" class="com.itxxz.HelloItxxz"> <constructor-arg> <value>Hello! 这是singletonBean!value> </constructor-arg> </ bean> <bean id="itxxzBean" class="com.itxxz.HelloItxxz" singleton="false"> <constructor-arg> <value>Hello! 这是itxxzBean! value> </constructor-arg> </bean> </beans> 第二种:工厂方法(Factory Method )