Webservice中获取Servlet的有关对象
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; } }