`

Webservice中获取Servlet的相关对象

 
阅读更多
第一种方式:
通过注入WebServiceContext ,获取request、session等
 
Java代码  收藏代码
@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进行传递
Java代码  收藏代码
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中的登陆信息
Java代码  收藏代码
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
Xml代码  收藏代码
<!-- 在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变量来获取数据
Java代码  收藏代码
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;  
    }  
  
  
}  

 

分享到:
评论

相关推荐

    Andriod访问WebService和Servlet.zip

    在Android开发中,访问Web服务,如WebService和Servlet,是常见的需求,这通常涉及到网络通信和数据交换。本文将深入探讨Android如何利用kSOAP2库与基于Axis的WebService进行通信,以及如何处理Servlet返回的数据,...

    java webservice服务器端获取request对象的三种方式

    下面是一个简单的示例方法,用于从`HttpServletRequest`对象中提取客户端IP地址: ```java public static String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); ...

    webservice获取List案例

    Webservice获取List案例是Java开发中常见的应用场景,它涉及到如何通过Web服务接口获取并处理列表类型的数据。在这个案例中,我们将探讨如何创建一个Web服务端点,客户端如何调用该服务,以及如何以Web工程的形式...

    webservice之通俗理解

    在WebService中,Servlet通常用于处理SOAP请求。 #### 四、部署配置 1. **server-config.wsdd**:这是一个配置文件,用于指定WebService的部署细节。其中包括了服务的URL、方法名等信息。 2. **web.xml**:这是...

    java调用webservice.pdf

    文档中的“***”表明了WebService被部署在了Tomcat服务器上,客户端可以通过访问该URL获取WSDL文件描述,并利用它来调用远程服务。 最后,文档中还隐含了一些其他Java WebService开发的知识点,如JAX-WS的注解使用...

    webservice的客户端 页面 JSP servlet 实现

    4. **JSP展示结果**:Servlet处理完请求后,可以将结果存储在HttpSession或HttpServletResponse对象中,然后重定向到JSP页面。在JSP页面中,可以通过EL表达式或者JSTL标签来获取并展示数据。 5. **创建JSP页面**:...

    JSON返回值格式的WebService样例

    在本示例中,“JSON返回值格式的WebService样例”旨在展示如何构建一个Web服务,该服务能够从数据库获取数据,并以JSON格式将结果返回给调用者。 首先,我们需要了解WebService的基本概念。WebService是一种基于...

    webservice 和android 调用客户端

    WebService通常使用XML(可扩展标记语言)进行数据传输,以SOAP(简单对象访问协议)作为通信协议,运行在像Tomcat这样的应用服务器上。 **1. WebService的基本概念** - **WebService**: 是一种基于HTTP协议的,...

    21.集成开发需求方案附件二:OA系统工作流WebService接口使用说明.doc

    在实际应用中,通过这些接口,开发者可以实现与泛微OA系统进行深度集成,比如获取员工的待办事项并在自己的应用程序中显示,或者统计已处理的流程数量以用于报告和分析。需要注意的是,`conditions`参数允许自定义...

    WebService

    通过以上介绍,我们可以看到在不同的WebService框架中,获取客户端IP地址的方式虽然有所不同,但核心思想都是利用HTTP请求对象中的相关信息。在实际开发过程中,选择合适的框架和技术方案对于提高开发效率和降低维护...

    java调用webservice实例代码

    Java调用WebService是一种常见的在Java应用中集成外部服务或与不同平台进行数据交换的技术。本实例将通过两个Web小项目,一个是客户端(Client),另一个是WebService服务器端,来阐述如何在Java中实现这一功能。 ...

    泛微 ecology9.0 文档(DocService)WebService接口使用说明

    - 功能描述:获取用户有权限访问的所有文档对象数组,但不包含具体内容和附件。 #### 四、接口调用示例 以下是一个简单的示例代码,展示如何使用Eclipse自动生成的客户端程序来调用DocService接口的方法: ```...

    webService

    - **UserService接口**:定义了获取用户的接口方法,使用`@WebService`注解标记为Web服务接口。 - **UserServiceImpl类**:实现了`UserService`接口,提供了具体的业务逻辑,如模拟数据库查询并返回用户信息。 ####...

    WebService Axis 搭建开发

    - `web.xml`文件通常可以从Axis的示例项目中复制相关配置。 3. **配置web.xml** - 添加`servlet`元素,包括`AxisServlet`和`AdminServlet`,这些servlet负责处理Web服务请求和管理。 - 更新`web.xml`,确保它...

    基于Servlet发送、接收SOAP消息的java源程序

    - 接收SOAP请求:Servlet通过`HttpServletRequest`对象获取HTTP请求体,然后解析SOAP消息。 - 处理SOAP请求:根据SOAP请求中的内容,服务器执行相应业务逻辑,并构建SOAP响应。 - 发送SOAP响应:利用`...

    在JAX-WS 中实现多个WebService间会话保持

    在JAX-WS中实现多个WebService间的会话保持是一个关键的技术需求,特别是在处理涉及多步骤交互的业务逻辑时。JAX-WS(Java API for XML Web Services)是Java平台上的Web服务开发框架,它简化了服务端和客户端的创建...

    webservice

    通过以上步骤,我们不仅可以了解WebService的基本概念,还可以掌握如何在MyEclipse中使用XFire框架来创建、配置和测试WebService。这种技术对于实现不同系统之间的通信非常有用,尤其是在企业级应用中。

    JAVA用WebService实现调用天气预报功能

    通过运行这个项目,我们可以看到如何实际操作这些步骤,实现从Java应用调用WebService获取天气预报数据的过程。 总的来说,这个项目展示了Java如何利用WebService技术实现跨系统的信息交互,特别是与中央气象台的...

Global site tag (gtag.js) - Google Analytics