首先下载一个cxf实例,里面包含cxf的jar包。我下的是apache-cxf-2.5.9

1、为什么要设置拦截器?

为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器.

2、拦截器分类

1. 按所处的位置分:服务器端拦截器,客户端拦截器

2. 按消息的方向分:入拦截器,出拦截器

3. 按定义者分:系统拦截器,自定义拦截器

3、拦截器API

Interceptor(拦截器接口)

AbstractPhaseInterceptor(自定义拦截器从此继承)

LoggingInInterceptor(系统日志入拦截器类)

LoggingOutInterceptor(系统日志出拦截器类)

4、编写实现拦截器

• 使用日志拦截器,实现日志记录

– LoggingInInterceptor

– LoggingOutInterceptor

• 使用自定义拦截器,实现用户名与密码的检验

– 服务器端的in拦截器

– 客户端的out拦截器

– benjamin/123456

系统日志拦截器代码实现:

Server:

SEI:

[html] view plaincopy print?
  1. package com.wiseweb.ws;
  2. import javax.jws.WebMethod;
  3. import javax.jws.WebService;
  4. /**
  5. * SEI
  6. * @author piqiu
  7. *
  8. */
  9. @WebService
  10. public interface HelloWS {
  11. @WebMethod
  12. public String sayHello(String name) ;
  13. }

SEI的实现:

[html] view plaincopy print?
  1. package com.wiseweb.ws;
  2. import javax.jws.WebService;
  3. /**
  4. * SEI的实现
  5. * @author piqiu
  6. *
  7. */
  8. @WebService
  9. public class HelloWSImpl implements HelloWS {
  10. @Override
  11. public String sayHello(String name) {
  12. System.out.println("server sayHello():" + name);
  13. return "Hello: " + name;
  14. }
  15. }

ServerTest:

[html] view plaincopy print?
  1. package com.wiseweb.ws.server;
  2. import java.util.List;
  3. import javax.xml.ws.Endpoint;
  4. import org.apache.cxf.interceptor.Interceptor;
  5. import org.apache.cxf.interceptor.LoggingInInterceptor;
  6. import org.apache.cxf.interceptor.LoggingOutInterceptor;
  7. import org.apache.cxf.jaxws22.EndpointImpl;
  8. import org.apache.cxf.message.Message;
  9. import com.wiseweb.ws.HelloWSImpl;
  10. /**
  11. * 发布webservice
  12. * @author piqiu
  13. *
  14. */
  15. public class ServerTest {
  16. public static void main(String[] args) {
  17. String address = "http://10.211.55.3:8888/day01_ws/hellows" ;
  18. Endpoint endpoint = Endpoint.publish(address, new HelloWSImpl()) ;
  19. EndpointImpl endpointImpl = (EndpointImpl) endpoint ;
  20. List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors() ;
  21. inInterceptors.add(new LoggingInInterceptor()) ;
  22. List<Interceptor<? extends Message>> outInterceptors = endpointImpl.getOutInterceptors() ;
  23. outInterceptors.add(new LoggingOutInterceptor()) ;
  24. System.out.println("发布webservice成功!");
  25. }
  26. }

Client:

把下载下来的apache-cxf-2.5.9的bin目录配置到系统环境变量的path中去,以便可以在cmd中执行bin中的bat文件

在cmd中输入wsdl2java SEI地址就可以生成客户端代码了,同样也可以使用wsimport命令。

项目截图:

ClientTest:

[html] view plaincopy print?
  1. package com.wiseweb.client;
  2. import java.util.List;
  3. import org.apache.cxf.endpoint.Client;
  4. import org.apache.cxf.frontend.ClientProxy;
  5. import org.apache.cxf.interceptor.Interceptor;
  6. import org.apache.cxf.interceptor.LoggingInInterceptor;
  7. import org.apache.cxf.interceptor.LoggingOutInterceptor;
  8. import org.apache.cxf.message.Message;
  9. import com.wiseweb.ws.HelloWS;
  10. import com.wiseweb.ws.HelloWSImplService;
  11. public class ClientTest {
  12. public static void main(String[] args) {
  13. HelloWSImplService helloWSImplService = new HelloWSImplService() ;
  14. HelloWS helloWS = helloWSImplService.getHelloWSImplPort() ;
  15. Client client = ClientProxy.getClient(helloWS) ;
  16. List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors() ;
  17. outInterceptors.add(new LoggingOutInterceptor()) ;
  18. List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors() ;
  19. inInterceptors.add(new LoggingInInterceptor()) ;
  20. String result = helloWS.sayHello("benjaminwhx") ;
  21. System.out.println(result);
  22. }
  23. }

运行结果Server端和Client端比较:

Client:

[html] view plaincopy print?
  1. 信息: Outbound Message
  2. ---------------------------
  3. ID: 1
  4. Address: http://10.211.55.3:8888/day01_ws/hellows
  5. Encoding: UTF-8
  6. Content-Type: text/xml
  7. Headers: {Accept=[*/*], SOAPAction=[""]}
  8. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHello xmlns:ns2="http://ws.wiseweb.com/"><arg0>benjaminwhx</arg0></ns2:sayHello></soap:Body></soap:Envelope>
  9. --------------------------------------
  10. 三月 03, 2015 11:03:17 上午 org.apache.cxf.services.HelloWSImplService.HelloWSImplPort.HelloWS
  11. 信息: Inbound Message
  12. ----------------------------
  13. ID: 1
  14. Response-Code: 200
  15. Encoding: UTF-8
  16. Content-Type: text/xml;charset=UTF-8
  17. Headers: {Content-Length=[224], content-type=[text/xml;charset=UTF-8], Server=[Jetty(7.5.4.v20111024)]}
  18. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHelloResponse xmlns:ns2="http://ws.wiseweb.com/"><return>Hello: benjaminwhx</return></ns2:sayHelloResponse></soap:Body></soap:Envelope>
  19. --------------------------------------
  20. Hello: benjaminwhx

Server:

[html] view plaincopy print?
  1. 发布webservice成功!
  2. 三月 03, 2015 11:03:15 上午 org.apache.cxf.services.HelloWSImplService.HelloWSImplPort.HelloWS
  3. 信息: Inbound Message
  4. ----------------------------
  5. ID: 1
  6. Address: http://10.211.55.3:8888/day01_ws/hellows?wsdl
  7. Encoding: UTF-8
  8. Http-Method: GET
  9. Content-Type: text/xml
  10. Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], content-type=[text/xml], Host=[10.211.55.3:8888], Pragma=[no-cache], User-Agent=[Apache CXF 2.5.9]}
  11. --------------------------------------
  12. 三月 03, 2015 11:03:16 上午 org.apache.cxf.services.HelloWSImplService.HelloWSImplPort.HelloWS
  13. 信息: Inbound Message
  14. ----------------------------
  15. ID: 2
  16. Address: http://10.211.55.3:8888/day01_ws/hellows
  17. Encoding: UTF-8
  18. Http-Method: POST
  19. Content-Type: text/xml; charset=UTF-8
  20. Headers: {Accept=[*/*], Cache-Control=[no-cache], connection=[keep-alive], Content-Length=[197], content-type=[text/xml; charset=UTF-8], Host=[10.211.55.3:8888], Pragma=[no-cache], SOAPAction=[""], User-Agent=[Apache CXF 2.5.9]}
  21. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHello xmlns:ns2="http://ws.wiseweb.com/"><arg0>benjaminwhx</arg0></ns2:sayHello></soap:Body></soap:Envelope>
  22. --------------------------------------
  23. server sayHello():benjaminwhx
  24. 三月 03, 2015 11:03:17 上午 org.apache.cxf.services.HelloWSImplService.HelloWSImplPort.HelloWS
  25. 信息: Outbound Message
  26. ---------------------------
  27. ID: 2
  28. Encoding: UTF-8
  29. Content-Type: text/xml
  30. Headers: {}
  31. Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:sayHelloResponse xmlns:ns2="http://ws.wiseweb.com/"><return>Hello: benjaminwhx</return></ns2:sayHelloResponse></soap:Body></soap:Envelope>
  32. --------------------------------------

自定义拦截器代码实现:

Server:

SEI和SEI实现都不做变动,增加一个interceptor:

[html] view plaincopy print?
  1. package com.wiseweb.ws.interceptor;
  2. import javax.xml.namespace.QName;
  3. import org.apache.cxf.binding.soap.SoapMessage;
  4. import org.apache.cxf.headers.Header;
  5. import org.apache.cxf.interceptor.Fault;
  6. import org.apache.cxf.phase.AbstractPhaseInterceptor;
  7. import org.apache.cxf.phase.Phase;
  8. import org.w3c.dom.Element;
  9. public class CheckUserInterceptor extends AbstractPhaseInterceptor<SoapMessage>{
  10. public CheckUserInterceptor() {
  11. super(Phase.PRE_PROTOCOL);
  12. }
  13. @Override
  14. public void handleMessage(SoapMessage message) throws Fault {
  15. Header header = message.getHeader(new QName("wiseweb")) ;
  16. if(header != null) {
  17. Element element = (Element)header.getObject() ;
  18. String username = element.getElementsByTagName("username").item(0).getTextContent() ;
  19. String password = element.getElementsByTagName("password").item(0).getTextContent() ;
  20. if(username.equals("benjamin") && password.equals("123456")) {
  21. System.out.println("用户名与密码正确,通过验证!");
  22. return ;
  23. }else {
  24. throw new Fault(new RuntimeException("请输入正确的用户名和密码!")) ;
  25. }
  26. }else {
  27. throw new Fault(new RuntimeException("请输入用户名和密码!")) ;
  28. }
  29. }
  30. }

ServerTest:

[html] view plaincopy print?
  1. package com.wiseweb.ws.server;
  2. import java.util.List;
  3. import javax.xml.ws.Endpoint;
  4. import org.apache.cxf.interceptor.Interceptor;
  5. import org.apache.cxf.jaxws22.EndpointImpl;
  6. import org.apache.cxf.message.Message;
  7. import com.wiseweb.ws.HelloWSImpl;
  8. import com.wiseweb.ws.interceptor.CheckUserInterceptor;
  9. public class ServetTest2 {
  10. public static void main(String[] args) {
  11. String address = "http://10.211.55.3:8888/day01_ws/hellows" ;
  12. Endpoint endpoint = Endpoint.publish(address, new HelloWSImpl()) ;
  13. EndpointImpl endpointImpl = (EndpointImpl) endpoint ;
  14. List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors() ;
  15. inInterceptors.add(new CheckUserInterceptor()) ;
  16. System.out.println("发布webservice成功!");
  17. }
  18. }

Client:

通过构造方法传入要比较的用户名和密码:

[html] view plaincopy print?
  1. package com.wiseweb.client.interceptor;
  2. import java.util.List;
  3. import javax.xml.namespace.QName;
  4. import javax.xml.parsers.DocumentBuilder;
  5. import javax.xml.parsers.DocumentBuilderFactory;
  6. import javax.xml.parsers.ParserConfigurationException;
  7. import org.apache.cxf.binding.soap.SoapMessage;
  8. import org.apache.cxf.headers.Header;
  9. import org.apache.cxf.interceptor.Fault;
  10. import org.apache.cxf.phase.AbstractPhaseInterceptor;
  11. import org.apache.cxf.phase.Phase;
  12. import org.w3c.dom.Document;
  13. import org.w3c.dom.Element;
  14. public class AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage>{
  15. private String username ;
  16. private String password ;
  17. public AddUserInterceptor(String username, String password) {
  18. super(Phase.PRE_PROTOCOL);
  19. this.username = username ;
  20. this.password = password ;
  21. }
  22. @Override
  23. public void handleMessage(SoapMessage message) throws Fault {
  24. List<Header> headers = message.getHeaders() ;
  25. DocumentBuilder builder = null ;
  26. try {
  27. builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
  28. } catch (ParserConfigurationException e) {
  29. e.printStackTrace();
  30. }
  31. Document document = builder.newDocument() ;
  32. Element root = document.createElement("wiseweb") ;
  33. Element username = document.createElement("username") ;
  34. username.setTextContent(this.username);
  35. Element password = document.createElement("password") ;
  36. password.setTextContent(this.password);
  37. root.appendChild(username) ;
  38. root.appendChild(password) ;
  39. headers.add(new Header(new QName("wiseweb"), root)) ;
  40. }
  41. }

ClientTest:

[html] view plaincopy print?
  1. package com.wiseweb.client;
  2. import java.util.List;
  3. import org.apache.cxf.endpoint.Client;
  4. import org.apache.cxf.frontend.ClientProxy;
  5. import org.apache.cxf.interceptor.Interceptor;
  6. import org.apache.cxf.interceptor.LoggingInInterceptor;
  7. import org.apache.cxf.interceptor.LoggingOutInterceptor;
  8. import org.apache.cxf.message.Message;
  9. import com.wiseweb.client.interceptor.AddUserInterceptor;
  10. import com.wiseweb.ws.HelloWS;
  11. import com.wiseweb.ws.HelloWSImplService;
  12. public class ClientTest2 {
  13. public static void main(String[] args) {
  14. HelloWSImplService helloWSImplService = new HelloWSImplService() ;
  15. HelloWS helloWS = helloWSImplService.getHelloWSImplPort() ;
  16. Client client = ClientProxy.getClient(helloWS) ;
  17. List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors() ;
  18. outInterceptors.add(new AddUserInterceptor("benjamin", "123456")) ;
  19. String result = helloWS.sayHello("benjaminwhx") ;
  20. System.out.println(result);
  21. }
  22. }

运行结果Server和Client比较:

Server:

[html] view plaincopy print?
  1. 发布webservice成功!
  2. 用户名与密码正确,通过验证!
  3. server sayHello():benjaminwhx

Client:

[html] view plaincopy print?
  1. Hello: benjaminwhx

如果输入的用户名和密码不正确,运行结果为:

Server:

[html] view plaincopy print?
  1. org.apache.cxf.interceptor.Fault: 请输入正确的用户名和密码!
  2. at com.wiseweb.ws.interceptor.CheckUserInterceptor.handleMessage(CheckUserInterceptor.java:29)
  3. at com.wiseweb.ws.interceptor.CheckUserInterceptor.handleMessage(CheckUserInterceptor.java:1)
  4. at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
  5. at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:122)
  6. at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:348)
  7. at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:312)
  8. at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72)
  9. at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:943)
  10. at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:879)
  11. at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
  12. at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
  13. at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
  14. at org.eclipse.jetty.server.Server.handle(Server.java:349)
  15. at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:441)
  16. at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:936)
  17. at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:801)
  18. at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:224)
  19. at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:51)
  20. at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:586)
  21. at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:44)
  22. at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
  23. at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
  24. at java.lang.Thread.run(Thread.java:745)
  25. Caused by: java.lang.RuntimeException: 请输入正确的用户名和密码!
  26. ... 23 more

Client:

[html] view plaincopy print?
  1. Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: 请输入正确的用户名和密码!
  2. at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:156)
  3. at com.sun.proxy.$Proxy25.sayHello(Unknown Source)
  4. at com.wiseweb.client.ClientTest2.main(ClientTest2.java:26)
  5. Caused by: org.apache.cxf.binding.soap.SoapFault: 请输入正确的用户名和密码!
  6. at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:75)
  7. at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:46)
  8. at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:35)
  9. at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
  10. at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:114)
  11. at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
  12. at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
  13. at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
  14. at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:801)
  15. at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1679)
  16. at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1517)
  17. at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1425)
  18. at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
  19. at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:650)
  20. at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
  21. at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:263)
  22. at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531)
  23. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:462)
  24. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:365)
  25. at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:318)
  26. at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:95)
  27. at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134)
  28. ... 2 more

这样就可以有效的验证访客的身份。

WebServices中使用cxf开发日志拦截器以及自定义拦截器相关推荐

  1. Struts2第七篇【介绍拦截器、自定义拦截器、执行流程、应用】

    什么是拦截器 拦截器Interceptor-..拦截器是Struts的概念,它与过滤器是类似的-可以近似于看作是过滤器 为什么我们要使用拦截器 前面在介绍Struts的时候已经讲解过了,Struts为 ...

  2. flume拦截器及自定义拦截器

    拦截器做什么呢? 时间拦截器 以时间拦截器为例.会在Event的header中添加一个属性进去,属性的key叫做timestamp, value是当前的毫秒值. 问题是写到header然后呢?有啥用呢 ...

  3. ElasticSearch入门:ES分词器与自定义分词器

    ES入门:ES分词器与自定义分词器 分词器的简单介绍 不同分词器的效果对比 自定义分词器的应用 分词器的简单介绍 分词器是es中的一个组件,通俗意义上理解,就是将一段文本按照一定的逻辑,分析成多个词语 ...

  4. Elasticsearch 分布式搜索引擎 -- 自动补全(拼音分词器、自定义分词器、自动补全查询、实现搜索框自动补全)

    文章目录 1. 自动补全 1.1 拼音分词器 1.2.1 自定义分词器 1.2.2 小结 1.2 自动补全 1.3 实现酒店搜索框自动补全 1.3.1 修改酒店映射结构 1.3.2 修改HotelDo ...

  5. Elasticsearch7 分词器(内置分词器和自定义分词器)

    文章目录 Elasticsearch7 分词器(内置分词器和自定义分词器) analysis 概览 char_filter html_strip mapping pattern_replace fil ...

  6. 59、Docker ElasticSearch安装拼音分词器及自定义分词器

    一.使用拼音分词器 1.拼音分词器 2.docker下安装拼音分词器插件 3.测试拼音分词器 # 测试拼音分词器 POST /_analyze {   "text": [" ...

  7. 使用struts2中默认的拦截器以及自定义拦截器

    转自:http://blog.sina.com.cn/s/blog_82f01d350101echs.html 如何使用struts2拦截器,或者自定义拦截器.特别注意,在使用拦截器的时候,在Acti ...

  8. 从struts2拦截器到自定义拦截器

    http://www.cnblogs.com/withyou/p/3170440.html 拦截器可谓struts2的核心了,最基本的bean的注入就是通过默认的拦截器实现的,一般在struts2.x ...

  9. Struts2内置拦截器和自定义拦截器

    内置拦截器 Struts2中内置类许多的拦截器,它们提供了许多Struts2的核心功能和可选的高级特性.这些内置的拦截器在struts-default.xml中配置.只有配置了拦截器,拦截器才可以正常 ...

最新文章

  1. Python培训入门基础知识学什么?
  2. php如何操作文本框,php如何清除文本框
  3. R语言构建仿真列联表并进行卡方检验(chisq.test):检验两个分类变量是否独立、输出期望的列联表
  4. 系统延时任务和定时任务
  5. koa2 从入门到进阶之路 (七)
  6. 大学什么专业学c语言和机械制图,机械设计工程师大学时应该学什么
  7. 电赛公开课整理(二),电路基础,截图+模电知识【16000字】【原创】
  8. 洛谷试炼场P1035 级数求和
  9. Win10安装Ubuntu双系统导致Win10时间有问题
  10. Android Studio 手动创建活动(Activity) 第一行代码 第二章
  11. Protel DXP 使用教程 - 自定义集成库
  12. java自旋锁使用_10.Java锁之自旋锁
  13. “百度杯”CTF比赛 十一月场Mangager
  14. JS JSP HTML CSS概念
  15. window7系统怎么给电脑安装
  16. 崩溃边缘 on No getter method for property
  17. python在园林中的应用_攀缘植物在园林中的应用
  18. busybox的init
  19. 有符号数与无符号数的运算
  20. C语言作用域(变量生存的空间)学习

热门文章

  1. xslt中的Javascript取得xml中的参数
  2. 单位四元数(unit quaternion)
  3. 上传图片时 , 返回 nginx 出现413 Request Entity Too Large 问题
  4. 如何用vue-router为每个路由配置各自的title
  5. 最简单的基于JavaEE和FFmpeg的视频网站
  6. Spring MVC配置静态资源的正常访问
  7. 记录一个班级的成绩练习一维数组
  8. centeros php 实战
  9. JavaScript绑定事件的方法[3种]
  10. Linux驱动程序开发 - 设备IO