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

简介:

首先下载一个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 plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.wiseweb.ws;  
  2.   
  3. import javax.jws.WebMethod;  
  4. import javax.jws.WebService;  
  5.   
  6. /**  
  7.  * SEI  
  8.  * @author piqiu  
  9.  *  
  10.  */  
  11. @WebService  
  12. public interface HelloWS {  
  13.   
  14.     @WebMethod  
  15.     public String sayHello(String name) ;  
  16. }  

SEI的实现:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.wiseweb.ws;  
  2.   
  3. import javax.jws.WebService;  
  4.   
  5. /**  
  6.  * SEI的实现  
  7.  * @author piqiu  
  8.  *  
  9.  */  
  10. @WebService  
  11. public class HelloWSImpl implements HelloWS {  
  12.   
  13.     @Override  
  14.     public String sayHello(String name) {  
  15.         System.out.println("server sayHello():" + name);  
  16.         return "Hello: " + name;  
  17.     }  
  18.   
  19. }  

ServerTest:

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

Client:

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



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

项目截图:



ClientTest:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.wiseweb.client;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.cxf.endpoint.Client;  
  6. import org.apache.cxf.frontend.ClientProxy;  
  7. import org.apache.cxf.interceptor.Interceptor;  
  8. import org.apache.cxf.interceptor.LoggingInInterceptor;  
  9. import org.apache.cxf.interceptor.LoggingOutInterceptor;  
  10. import org.apache.cxf.message.Message;  
  11.   
  12. import com.wiseweb.ws.HelloWS;  
  13. import com.wiseweb.ws.HelloWSImplService;  
  14.   
  15. public class ClientTest {  
  16.   
  17.     public static void main(String[] args) {  
  18.         HelloWSImplService helloWSImplService = new HelloWSImplService() ;  
  19.         HelloWS helloWS = helloWSImplService.getHelloWSImplPort() ;  
  20.           
  21.         Client client = ClientProxy.getClient(helloWS) ;  
  22.         List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors() ;  
  23.         outInterceptors.add(new LoggingOutInterceptor()) ;  
  24.           
  25.         List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors() ;  
  26.         inInterceptors.add(new LoggingInInterceptor()) ;  
  27.           
  28.         String result = helloWS.sayHello("benjaminwhx") ;  
  29.         System.out.println(result);  
  30.           
  31.     }  
  32. }  

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

Client:

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

ServerTest:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.wiseweb.ws.server;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.xml.ws.Endpoint;  
  6.   
  7. import org.apache.cxf.interceptor.Interceptor;  
  8. import org.apache.cxf.jaxws22.EndpointImpl;  
  9. import org.apache.cxf.message.Message;  
  10.   
  11. import com.wiseweb.ws.HelloWSImpl;  
  12. import com.wiseweb.ws.interceptor.CheckUserInterceptor;  
  13.   
  14. public class ServetTest2 {  
  15.   
  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.           
  21.         List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors() ;  
  22.         inInterceptors.add(new CheckUserInterceptor()) ;  
  23.           
  24.         System.out.println("发布webservice成功!");  
  25.     }  
  26. }  


Client:

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

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

ClientTest:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.wiseweb.client;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.apache.cxf.endpoint.Client;  
  6. import org.apache.cxf.frontend.ClientProxy;  
  7. import org.apache.cxf.interceptor.Interceptor;  
  8. import org.apache.cxf.interceptor.LoggingInInterceptor;  
  9. import org.apache.cxf.interceptor.LoggingOutInterceptor;  
  10. import org.apache.cxf.message.Message;  
  11.   
  12. import com.wiseweb.client.interceptor.AddUserInterceptor;  
  13. import com.wiseweb.ws.HelloWS;  
  14. import com.wiseweb.ws.HelloWSImplService;  
  15.   
  16. public class ClientTest2 {  
  17.   
  18.     public static void main(String[] args) {  
  19.         HelloWSImplService helloWSImplService = new HelloWSImplService() ;  
  20.         HelloWS helloWS = helloWSImplService.getHelloWSImplPort() ;  
  21.           
  22.         Client client = ClientProxy.getClient(helloWS) ;  
  23.         List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors() ;  
  24.         outInterceptors.add(new AddUserInterceptor("benjamin", "123456")) ;  
  25.           
  26.         String result = helloWS.sayHello("benjaminwhx") ;  
  27.         System.out.println(result);  
  28.           
  29.     }  
  30. }  

运行结果Server和Client比较:

Server:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. 发布webservice成功!  
  2. 用户名与密码正确,通过验证!  
  3. server sayHello():benjaminwhx  


Client:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. Hello: benjaminwhx  


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

Server:

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  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 plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  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  

这样就可以有效的验证访客的身份。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
7天前
|
小程序 前端开发 API
微信小程序全栈开发中的异常处理与日志记录
【4月更文挑战第12天】本文探讨了微信小程序全栈开发中的异常处理和日志记录,强调其对确保应用稳定性和用户体验的重要性。异常处理涵盖前端(网络、页面跳转、用户输入、逻辑异常)和后端(数据库、API、业务逻辑)方面;日志记录则关注关键操作和异常情况的追踪。实践中,前端可利用try-catch处理异常,后端借助日志框架记录异常,同时采用集中式日志管理工具提升分析效率。开发者应注意安全性、性能和团队协作,以优化异常处理与日志记录流程。
|
2月前
|
数据库
什么是计算机软件开发领域的 verbose 代码和日志
什么是计算机软件开发领域的 verbose 代码和日志
31 0
|
3月前
|
调度
kettle开发篇-写日志
kettle开发篇-写日志
82 0
|
2月前
|
供应链 Java 测试技术
开发Java应用时如何用好Log
开发Java应用时如何用好Log
71 3
|
9月前
|
SQL XML 前端开发
Spring Boot + vue-element 开发个人博客项目实战教程(十八、操作日志功能实现)2
Spring Boot + vue-element 开发个人博客项目实战教程(十八、操作日志功能实现)2
90 0
Spring Boot + vue-element 开发个人博客项目实战教程(十八、操作日志功能实现)2
|
5月前
|
监控 Java
Springboot开发系统记录操作日志
Springboot开发系统记录操作日志
94 3
|
7月前
|
人工智能 运维 监控
在日常开发工作中,日志数据该如何利用?
在日常开发工作中,日志数据是一个宝贵的资源,它可以提供关于应用程序运行状态、错误报告、性能指标和用户行为等方面的重要信息。正确地利用和分析日志数据可以帮助开发人员更好地理解应用程序的运行情况,快速定位和解决问题,改进应用程序的性能,并为业务决策提供有力支持。尤其是在现代科技发展的背景下,日志数据作为一种重要的信息资源,对于运维工作具有极大的价值。然而,如何充分利用日志数据,并将其应用于运维和开发工作中,仍然是许多企业和运维和开发人员关注的问题。那么本文就来分享一下在日常开发中关于日志数据的利用方面的探讨。
128 1
在日常开发工作中,日志数据该如何利用?
|
8月前
|
设计模式 API Android开发
用代理模式解决Okhttp日志拦截器在下载文件时的窘境
用代理模式解决Okhttp日志拦截器在下载文件时的窘境
184 0
|
9月前
|
XML SQL Java
Spring Boot + vue-element 开发个人博客项目实战教程(二十、登录日志、用户、分类管理页面开发)2
Spring Boot + vue-element 开发个人博客项目实战教程(二十、登录日志、用户、分类管理页面开发)2
68 0
|
9月前
|
前端开发 NoSQL Java
Spring Boot + vue-element 开发个人博客项目实战教程(二十、登录日志、用户、分类管理页面开发)1
Spring Boot + vue-element 开发个人博客项目实战教程(二十、登录日志、用户、分类管理页面开发)1
113 0