Ⅰ Java实现拦截HTTP请求的几种方式
在Java的服务端开发当中,拦截器是很常见的业务场景,这里对Java开发当中几种常见的拦截器的实现方式进行记录和分析。案例说明基于Spring Boot环境。
一:实现javax.servlet.Filter接口(使用过滤器方式拦截请求)
import org.springframework.stereotype.Component;import javax.servlet.*;import java.io.IOException;import java.util.Date;@Componentpublic class TimeInterceptor implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("time filter init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("time filter start");long start = new Date().getTime();filterChain.doFilter(servletRequest, servletResponse);System.out.println("time filter 耗时:"+(new Date().getTime()-start));System.out.println("time filter finish");}@Overridepublic void destroy() {System.out.println("time filter destroy");}}
如使用@Compent注解声明不需要加入其它配置即可使得拦截器生效,但是默认拦截/*,会拦截所有请求。
二:使用@Bean注入自定义拦截器,依然上面的代码,去掉@Compent注解,创建TimeWebConfig配置类:
import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.ArrayList;import java.util.List;@Configurationpublic class TimeWebConfig {@Beanpublic FilterRegistrationBean timeFilter(){FilterRegistrationBean registrationBean = new FilterRegistrationBean();TimeInterceptor interceptor = new TimeInterceptor();registrationBean.setFilter(interceptor);List<String> urls = new ArrayList<>();urls.add("/user/*");registrationBean.setUrlPatterns(urls);return registrationBean;}}
上面这两种拦截请求的实现是基于JavaEE提供的Filter接口实现的,缺点在于,该拦截器实际上是一个过滤器,执行代码的方法doFilter只提供了request,response等参数,当请求进入被过滤器拦截的时候,我们并不知道这个请求是由哪个控制器的哪个方法来执行的。
三:使用springMVC提供的拦截器,实现org.springframework.web.servlet.HandlerInterceptor接口:
创建自定义的拦截器:
import org.springframework.stereotype.Component;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Date;@Componentpublic class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {System.out.println("preHandler");System.out.println(((HandlerMethod) handler).getBean().getClass().getName());System.out.println(((HandlerMethod) handler).getMethod().getName());httpServletRequest.setAttribute("start", new Date().getTime());return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandler");Long start = (Long) httpServletRequest.getAttribute("start");System.out.println("time interceptor 耗时:"+(new Date().getTime()-start));}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");Long start = (Long) httpServletRequest.getAttribute("start");System.out.println("time interceptor 耗时:"+(new Date().getTime()-start));System.out.println("ex is:"+e);}}
创建配置类:
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter {@Autowiredprivate MyInterceptor interceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(interceptor).addPathPatterns("/user/*").excludePathPatterns("/blog/*");}}
此种方式的拦截器当中我们能够获取拦截的请求对应的类和方法的相关信息,缺点在于该handler对象无法获取具体执行方法的参数信息。
四:利用Spring的切面(AOP)实现拦截器:
引入jar包:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
创建切片类:
import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;import java.util.Date;@Aspect@Componentpublic class TimeAspect {@Around("execution(* com.qinker.controller.UserController.*(..))")public Object handlerControllerMethod(ProceedingJoinPoint point) throws Throwable {System.out.println("time aspect start");long start = new Date().getTime();Object[] args = point.getArgs();for (Object obj : args) {System.out.println("arg is:"+obj);}Object obj = point.proceed();//具体方法的返回值System.out.println("aspect 耗时:"+(new Date().getTime()-start));System.out.println("time aspect end");return obj;}}
aspectj基于AOP实现的拦截器功能十分强大,具体详解请参考spring官网网站的文档。
Ⅱ net引擎是怎样接收到http请求加以处理并返回结果
HttpMole是向实现类提供模块初始化和处置事件。当一个HTTP请求到达HttpMole时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,HttpMole是一个HTTP请求的“必经之路”,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个HTTP请求信息之上,或者针对截获的这个HTTP请求信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用。
1、asp.net的HTTP请求处理过程
说明:
(1)、客户端浏览器向服务器发出一个http请求,此请求会被inetinfo.exe进程截获,然后转交给aspnet_isapi.dll进程,接着它又通过Http Pipeline的管道,传送给aspnet_wp.exe这个进程,接下来就到了.net framework的HttpRunTime处理中心,处理完毕后就发送给用户浏览器。
(2)、当一个http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的http请求,而后这个Http请求会依次进入到如下几个容器中:HttpMole --> HttpHandler Factory --> HttpHandler。当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了,客户端也就得到相应的东东了。
(3)完整的http请求在asp.net framework中的处理流程:
HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpMole-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()
也就是说一个HTTP请求在HttpMole容器的传递过程中,会在某一时刻(ResolveRequestCache事件)将这个HTTP请求传递给HttpHandler容器。在这个事件之后,HttpMole容器会建立一个HttpHandler的入口实例,但是此时并没有将HTTP请求控制权交出,而是继续触发AcquireRequestState事件以及PreRequestHandlerExcute事件。在PreRequestHandlerExcute事件之后,HttpMole窗口就会将控制权暂时交给HttpHandler容器,以便进行真正的HTTP请求处理工作。
而在HttpHandler容器内部会执行ProcessRequest方法来处理HTTP请求。在容器HttpHandler处理完毕整个HTTP请求之后,会将控制权交还给HttpMole,HttpMole则会继续对处理完毕的HTTP请求信息流进行层层的转交动作,直到返回到客户端为止。
PS:红色的HttpApplication实例在HttpMole的Init方法中会用到。
Ⅲ 如何利用apache的过滤器拦截http的post请求,并提取出来postdata
利用ap_get_brigade函数从下一个过滤器中读取数据,在利用存储段转换函数,将bucket转换为字符串,就可以读取出来了,但是具体步骤及函数你要自己去好好参考使用哪些合适
如果您对我的回答有不满意的地方,还请您继续追问;
答题不易,互相理解,互相帮助!
Ⅳ 如果截取某一程序的全部HTTP请求及返回的信息
C# WebBrowser,WebClient对象,
去msdn上看文档研究下,或在搜这两个类的使用方法,说不准就能搜到你想要的
WebBrowser.Navigate方法就能打开网站,然后读出数据就行了
Ⅳ 如何用python脚本过滤到达服务器某个站点的HTTP请求
nginx+Django估计可以做到
Ⅵ SpringBoot 三种拦截http请求方式Filter,interceptor和aop
SpringBoot 三种拦截http请求方式Filter,interceptor和aop。
这三种拦截方式的拦截顺序是:filter—>Interceptor-->ControllerAdvice-->@Aspect -->Controller;
这三种方式的区别:
1.过滤器Filter可以拿到原始的HTTP请求和响应的信息, 但是拿不到你真正处理请求方法的信息,也就是方法的信息。
2.拦截器Interceptor可以拿到原始的HTTP请求和响应的信息,也可以拿到你真正处理请求方法的信息,但是拿不到传进参数的那个值。
3.切片Aspect,既然Spring那么支持AOP,可以拿到原始的HTTP请求和响应的信息, 也可以拿到你真正处理请求方法的信息,也可以传进参数的那个值。
实现Filter接口
实现 HandlerInterceptor 接口,然后配置进Spring。
配置进spring
pom.xml 添加Aop支持
Ⅶ 如何让某些http请求绕过Filter
绕过路由器白名单过滤是不可能的。联网设备通过无线路由器联网,只有获取网关设置权限才能修改路由器白名单过滤功能。无线WiFi白名单功能是MAC过滤的一种,白名单是只允许授权的设备联网的设备名单。无线MAC地址过滤功能通过MAC地址允许或拒绝无线网络中的计算机访问广域网,有效控制无线网络内用户的上网权限。通过无线路由器白名单使允许的用户联网的方法:1.系统连接wifi。2.打开电脑浏览器,输入路由器背后铭牌的网关ip地址(一般是192.168.1.1),进入网关配置界面。3.进入DHCP客户端界面,查看主机名。记录许可的设备主机名及其MAC地址。4.进入路由器安全设置界面,点击MAC地址过滤,启用白名单功能。仅允许模式:只允许指定MAC地址设备联网。 选择仅允许,输入许可的MAC地址并标明注释,点击启用即可使白名单的设备联网访问。
Ⅷ 在分析http数据包重定向的时候应该判断哪些条件来过滤不必要的数据包
你的网址有问题,冒号应是英文模式输入而不是中文模式输入的,网址的结尾一般都是com或者net,你这明显也不对,所以打不开呀,为更好地得到答案,您可以通过文字、截图,对问题进行更详细的描述并悬赏,然后把你疑惑的问题提交!!
如果您对我的回答有不满意的地方,还请您继续追问;
答题不易,互相理解,互相帮助!
Ⅸ android如何过滤http请求
Android客户端捕获http请求包的方法
对于Web测试,我们可以很容易的抓取到相关的http请求包,不用什么专业软件,甚至浏览器都能帮我们完成这个功能,拿到需要的http请求连接 。
http连接对于测试同学来说, 不论做功能、性能或是安全,都是非常重要的, 他过滤了前台的因素,让测试同学直接能对后台进行交互。
以上是http连接的重要性,基本等于废话,下面是正题。
客户端安全测试,同样需要拿到http的请求包,由于客户端的前段限制绕过比较麻烦,那么在做安全测试的过程中,直接拿到http的请求包显得更外重要。
有如下方法可以拿到请求的http包:
1、在不配置代理的情况下,对Android客户端(模拟器)的数据我们可以使用wireshark或者etherpeek等网络层抓包软件抓取,模拟器本身的数据交互是通过电脑主机的网卡进行的,所以我们通过抓包软件抓取主机网卡的数据包,经过过滤,便可得到模拟器客户端中的数据包,类似这样:
访问之后,通过wireshark过滤http请求,便可找到我们刚刚发送的请求。
当然,这是种比较麻烦的方法,不过可以更确切的看到网络包发送的内容。
另一种办法是对模拟器配置代理,让所有请求包可以通过外部主机的七层抓包软件,例如fiddler ,burpsuite等所捕获到,配置代理需要先做一次设置:类似这样:
进 入“设置”选项之后,按照图示设置
这里proxy 设置为10.0.2.2是android模拟器对外部主机地址的硬编码,端口设为8888是外部主机fiddler 的监听地址,当然,如果是burpsuite 可以设置为8080。
Ⅹ wireshark 怎样过滤http协议内容
在wireshark软件的那个filter框框里面输入http,就能只过滤HTTP协议的内容了。