第一种方式:
通过注入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;
}
}