Webservice中获取Servlet的相关对象

 第一种方式:

通过注入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;
	}


}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值