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;  
    }  
  
  
}  

猜你喜欢

转载自xiaoshanjnby.iteye.com/blog/2078941