第一种方式:
通过注入WebServiceContext ,获取request、session等
@Resource private WebServiceContext webServiceContext; public String getLoginUser() { HttpServletRequest request = (HttpServletRequest) webServiceContext.getMessageContext().get(MessageContext.SERVLET_REQUEST); HttpSession session = request.getSession(); return session.getAttribute("loginUser").toString(); }
第二种方式:
通过ThreadLocal进行传递
package com.hqh.student.ws.util; /** * 通过ThreadLocal传递session中的信息 * 也可以用来传递其它信息,如request对象等 * @author lenovo * */ public class LoginUserContext { private static ThreadLocal<String> loginUser = new ThreadLocal<String>(); public static String getLoginUser() { return loginUser.get(); } public static void setLoginUser(String _loginUser) { loginUser.set(_loginUser); } public static void remove() { loginUser.remove(); } }
编写一个Filter,通过Filter为ThreadLocal设置需要传递的值
主要是从filter中获取servlet对象,再获取session中的登陆信息
package com.hqh.student.ws.util; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; /** * 通过filter获取servlet相关信息 * 然后设置到ThreadLocal中,方便一些不能被spring管理的对象使用 * */ public class LoginUserFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { try { HttpServletRequest request = (HttpServletRequest)req; HttpSession session = request.getSession(); String username = (String) session.getAttribute("loginUser"); System.out.println("LoginUserFilter get username from session:"+username); if(username!=null) { //throw new RuntimeException("用户未登陆!"); System.out.println("设置用户信息到LoginUserContext的ThreadLocal属性中"); LoginUserContext.setLoginUser(username); } chain.doFilter(req, resp); } finally { //释放ThreadLocal中存放的信息 LoginUserContext.remove(); } } public void init(FilterConfig arg0) throws ServletException { } }
web.xml中加入filter
<!-- 在filter中获取servlet的相关对象,设置到ThreadLocal中 --> <filter> <filter-name>LoginUserFilter</filter-name> <filter-class>com.hqh.student.ws.util.LoginUserFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginUserFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
在Handler中通过ThreadLocal变量来获取数据
package com.hqh.student.ws.handler; import java.util.Set; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.xml.namespace.QName; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPConstants; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; import javax.xml.ws.WebServiceContext; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.handler.soap.SOAPHandler; import javax.xml.ws.handler.soap.SOAPMessageContext; import com.hqh.student.ws.util.LoginUserContext; public class LicenseHandler implements SOAPHandler<SOAPMessageContext> { public void close(MessageContext ctx) { } public boolean handleFault(SOAPMessageContext ctx) { return false; } public boolean handleMessage(SOAPMessageContext context) { try { Boolean out = (Boolean) context.get(SOAPMessageContext.MESSAGE_OUTBOUND_PROPERTY); if(out) { System.out.println("message outing..."); SOAPEnvelope soapEnv = context.getMessage().getSOAPPart().getEnvelope(); SOAPBody soapBody = soapEnv.getBody(); //获取当前在调用服务的哪个方法 String localName = soapBody.getFirstChild().getLocalName(); // System.out.println(localName); if(!"getStudent".equals(localName)) { return true; } //如果是getStudent,则加入头信息 SOAPHeader soapHeader = soapEnv.getHeader(); if(soapHeader==null) { soapHeader = soapEnv.addHeader(); } //创建QName String nameSpace = "http://ws.student.hqh.com";//wsdl的targetNamespace String part = "license";//message的name,必须与wsdl中定义的一致 String prefix = "ns";//前缀 QName headerQName = new QName(nameSpace, part, prefix); /** * 从SOAPMessageContext中获取session中存放的信息 * 由于Handler没有被spring管理,所以获取不到HttpServletRequest */ //HttpServletRequest request = (HttpServletRequest) context.get(MessageContext.SERVLET_REQUEST); //String loginUser = request.getSession().getAttribute("loginUser").toString(); //从ThreadLocal中取出登陆用户信息 String loginUser = LoginUserContext.getLoginUser(); System.out.println("get loginUser from session:"+loginUser); if(loginUser==null) { System.out.println("loginUser is null"); } //将QName加入Header,并设定值 soapHeader.addHeaderElement(headerQName).setValue(loginUser); } else { System.out.println("message come back..."); } return true; } catch (SOAPException e) { e.printStackTrace(); } return false; } public Set<QName> getHeaders() { return null; } }
相关推荐
在Android开发中,访问Web服务,如WebService和Servlet,是常见的需求,这通常涉及到网络通信和数据交换。本文将深入探讨Android如何利用kSOAP2库与基于Axis的WebService进行通信,以及如何处理Servlet返回的数据,...
下面是一个简单的示例方法,用于从`HttpServletRequest`对象中提取客户端IP地址: ```java public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); ...
Webservice获取List案例是Java开发中常见的应用场景,它涉及到如何通过Web服务接口获取并处理列表类型的数据。在这个案例中,我们将探讨如何创建一个Web服务端点,客户端如何调用该服务,以及如何以Web工程的形式...
在WebService中,Servlet通常用于处理SOAP请求。 #### 四、部署配置 1. **server-config.wsdd**:这是一个配置文件,用于指定WebService的部署细节。其中包括了服务的URL、方法名等信息。 2. **web.xml**:这是...
文档中的“***”表明了WebService被部署在了Tomcat服务器上,客户端可以通过访问该URL获取WSDL文件描述,并利用它来调用远程服务。 最后,文档中还隐含了一些其他Java WebService开发的知识点,如JAX-WS的注解使用...
4. **JSP展示结果**:Servlet处理完请求后,可以将结果存储在HttpSession或HttpServletResponse对象中,然后重定向到JSP页面。在JSP页面中,可以通过EL表达式或者JSTL标签来获取并展示数据。 5. **创建JSP页面**:...
在本示例中,“JSON返回值格式的WebService样例”旨在展示如何构建一个Web服务,该服务能够从数据库获取数据,并以JSON格式将结果返回给调用者。 首先,我们需要了解WebService的基本概念。WebService是一种基于...
WebService通常使用XML(可扩展标记语言)进行数据传输,以SOAP(简单对象访问协议)作为通信协议,运行在像Tomcat这样的应用服务器上。 **1. WebService的基本概念** - **WebService**: 是一种基于HTTP协议的,...
在实际应用中,通过这些接口,开发者可以实现与泛微OA系统进行深度集成,比如获取员工的待办事项并在自己的应用程序中显示,或者统计已处理的流程数量以用于报告和分析。需要注意的是,`conditions`参数允许自定义...
通过以上介绍,我们可以看到在不同的WebService框架中,获取客户端IP地址的方式虽然有所不同,但核心思想都是利用HTTP请求对象中的相关信息。在实际开发过程中,选择合适的框架和技术方案对于提高开发效率和降低维护...
Java调用WebService是一种常见的在Java应用中集成外部服务或与不同平台进行数据交换的技术。本实例将通过两个Web小项目,一个是客户端(Client),另一个是WebService服务器端,来阐述如何在Java中实现这一功能。 ...
- 功能描述:获取用户有权限访问的所有文档对象数组,但不包含具体内容和附件。 #### 四、接口调用示例 以下是一个简单的示例代码,展示如何使用Eclipse自动生成的客户端程序来调用DocService接口的方法: ```...
- **UserService接口**:定义了获取用户的接口方法,使用`@WebService`注解标记为Web服务接口。 - **UserServiceImpl类**:实现了`UserService`接口,提供了具体的业务逻辑,如模拟数据库查询并返回用户信息。 ####...
- `web.xml`文件通常可以从Axis的示例项目中复制相关配置。 3. **配置web.xml** - 添加`servlet`元素,包括`AxisServlet`和`AdminServlet`,这些servlet负责处理Web服务请求和管理。 - 更新`web.xml`,确保它...
- 接收SOAP请求:Servlet通过`HttpServletRequest`对象获取HTTP请求体,然后解析SOAP消息。 - 处理SOAP请求:根据SOAP请求中的内容,服务器执行相应业务逻辑,并构建SOAP响应。 - 发送SOAP响应:利用`...
在JAX-WS中实现多个WebService间的会话保持是一个关键的技术需求,特别是在处理涉及多步骤交互的业务逻辑时。JAX-WS(Java API for XML Web Services)是Java平台上的Web服务开发框架,它简化了服务端和客户端的创建...
通过以上步骤,我们不仅可以了解WebService的基本概念,还可以掌握如何在MyEclipse中使用XFire框架来创建、配置和测试WebService。这种技术对于实现不同系统之间的通信非常有用,尤其是在企业级应用中。
通过运行这个项目,我们可以看到如何实际操作这些步骤,实现从Java应用调用WebService获取天气预报数据的过程。 总的来说,这个项目展示了Java如何利用WebService技术实现跨系统的信息交互,特别是与中央气象台的...