说明:CXF作为Webservice很好的实现框架,让Webservice的开发变得极期方便(Xfire框架居说目前已经不再维护,使用越来越少了),然后在使用中也遇到很多细节问题,如Session会话问题就是其中一个,由于网上好多解决方法试了都不好用,最近刚刚解决了在此备份一下,以便以后使用方便。
一、建立Web工程,加入CXF的jar包,项目中使用的版本为cxf2.6.0。
二、定义两个接口IRegirstInfo、ILoginInfo; IRegirstInfo接口定一个注册方法,ILoginInfo定义一个登录方法。
- @WebService
- publicinterface IRegirstInfo {
- publicvoid UserRegirstInfo();
- }
- @WebService
- publicinterface ILoginInfo {
- public String UserLoginDao(String token);
- }
@WebService public interface IRegirstInfo { public void UserRegirstInfo(); } @WebService public interface ILoginInfo { public String UserLoginDao(String token); }
三、定义两个接口的实现类RegirstInfoService、UserLoginService ; RegirstInfoService服务类里生成一个Token信息,然后将它放到Session里,然后在UserLoginService 服务里我们从Session里取出这个Token信息。
- @WebService
- publicclass RegirstInfoService implements IRegirstInfo {
- @Resource
- private WebServiceContext wsContext;
- private MessageContext mc;
- private HttpSession session;
- publicvoid UserRegirstInfo() {
- // 获取上下文,保存request,session信息.
- mc = wsContext.getMessageContext();
- session = ((javax.servlet.http.HttpServletRequest) mc
- .get(MessageContext.SERVLET_REQUEST)).getSession();
- ((javax.servlet.ServletContext) mc.get(MessageContext.SERVLET_CONTEXT))
- .setAttribute("session", session);// 把session放到ServletContext中。
- String token = UUID.randomUUID().toString(); // 生成Token
- session.setAttribute("token", token); // 将生成的token放入Session
- //生成request,来获取客户端的IP
- HttpServletRequest request = (HttpServletRequest) mc
- .get("HTTP.REQUEST");
- System.out.println("request:" + request.getRemoteAddr());
- }
- }
@WebService public class RegirstInfoService implements IRegirstInfo { @Resource private WebServiceContext wsContext; private MessageContext mc; private HttpSession session; public void UserRegirstInfo() { // 获取上下文,保存request,session信息. mc = wsContext.getMessageContext(); session = ((javax.servlet.http.HttpServletRequest) mc .get(MessageContext.SERVLET_REQUEST)).getSession(); ((javax.servlet.ServletContext) mc.get(MessageContext.SERVLET_CONTEXT)) .setAttribute("session", session);// 把session放到ServletContext中。 String token = UUID.randomUUID().toString(); // 生成Token session.setAttribute("token", token); // 将生成的token放入Session //生成request,来获取客户端的IP HttpServletRequest request = (HttpServletRequest) mc .get("HTTP.REQUEST"); System.out.println("request:" + request.getRemoteAddr()); } }
- @webservice
- publicclass UserLoginService implements ILoginInfo {
- @Resource
- private WebServiceContext wsContext;
- private MessageContext mc;
- private HttpSession session;
- public String UserLoginDao(String token) {
- mc = wsContext.getMessageContext();
- session = (HttpSession) ((javax.servlet.ServletContext) mc
- .get(MessageContext.SERVLET_CONTEXT)).getAttribute("session");
- System.out.println("Token:" + session.getAttribute("token"));
- return"Success--->" + token;
- }
- }
@webservice public class UserLoginService implements ILoginInfo { @Resource private WebServiceContext wsContext; private MessageContext mc; private HttpSession session; public String UserLoginDao(String token) { mc = wsContext.getMessageContext(); session = (HttpSession) ((javax.servlet.ServletContext) mc .get(MessageContext.SERVLET_CONTEXT)).getAttribute("session"); System.out.println("Token:" + session.getAttribute("token")); return "Success--->" + token; } }
四、web.xml
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>WEB-INF/beans.xml</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <display-name>cxf</display-name>
- <servlet>
- <servlet-name>cxf</servlet-name>
- <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>cxf</servlet-name>
- <url-pattern>/*</url-pattern>
- </servlet-mapping>
<context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/beans.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <display-name>cxf</display-name> <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
五、还有一个bean.xml是用来发布服务的
- <importresource="classpath:META-INF/cxf/cxf.xml"/>
- <importresource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
- <importresource="classpath:META-INF/cxf/cxf-servlet.xml"/>
- <!-- ===============具体服务实例============= -->
- <beanid="userLoginService"class="com.dyc.impl.UserLoginService"/>
- <beanid="regirstInfoService"class="com.dyc.impl.RegirstInfoService"/>
- <!-- ===============对外发布服务============= -->
- <jaxws:endpointid="loginService"implementor="#userLoginService"
- address="/LoginService">
- </jaxws:endpoint>
- <jaxws:endpointid="regirstService"implementor="#regirstInfoService"
- address="/RegirstService">
- </jaxws:endpoint>