这个工程运用struts2+spring2+hibernate3架构,工程需要开放一个webservice接口供其它客户端调用并操作数据库,因此采用了xfire集成工程里,因为xfrie能和spring方便地集成.xfire的集成、拦截器等全部调试通过,现在最大的问题就是webservice怎么来获取工程里的session方便验证用户是否处于登陆状态呢?
xfire开发的webservice的主要文件:
接口类:
package com.jcurrent.ws.inf;
public interface SnsServiceInf {
public String example(String message);
}
实现类:
package com.jcurrent.ws.service;
import java.util.List;
import com.jcurrent.bean.TestBean;
import com.jcurrent.dao.HibernateSuperDAO;
import com.jcurrent.ws.inf.SnsServiceInf;
/**
*接口类集成了数据库操作,这个webservice开放给用户对远程数据库进行操作
**/
public class SnsService extends HibernateSuperDAO<TestBean> implements SnsServiceInf{
public String example(String message) {
List<TestBean> list=this.getAll();
return message+";总记录数是:"+list.size();
}
}
拦截器:
package com.jcurrent.ws.handler;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import javax.servlet.http.HttpServletRequest;
import org.codehaus.xfire.transport.Session;
import org.codehaus.xfire.transport.http.XFireServletController;
import org.codehaus.xfire.transport.http.XFireHttpSession;
/**
*拦截器用于身份验证,接收客户端的用户信息,在拦截器里进行身份验证,验证通过后需要获取web应用的session
**/
public class MyHandler extends AbstractHandler{
public void invoke(MessageContext context) throws Exception {
String uri=context.getInMessage().getUri();
Element handler=context.getInMessage().getHeader();
HttpServletRequest request=XFireServletController.getRequest(); //得到客户端调用的信息
XFireHttpSession session=new XFireHttpSession(request); //这里产生了webservice的session
/**
** 怎么获取web应用的session,做到webservice和ssh应用共享session还没有研究透彻,有好方法的朋友提醒下
** xfire和spring集成的文档看了N遍,没有这方面的描述
**/
if(handler!=null){
String token=handler.getChild("token").getValue();
Session sess=context.getSession();
sess.put("token", token);
System.out.println(sess.get("token").toString());
System.out.println("session-username=:");
}else{
System.out.println("请求必须包含验证信息!!");
}
}
}
spring的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans default-autowire="no" default-lazy-init="false" default-dependency-check="none">
<!--xfire和spring集成-->
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
<bean id="snsServiceBean" class="com.jcurrent.ws.service.SnsService">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="myHandler" class="com.jcurrent.ws.handler.MyHandler"/>
<bean name="snsService" class="org.codehaus.xfire.spring.ServiceBean">
<property name="serviceBean" ref="snsServiceBean"/>
<property name="serviceClass" value="com.jcurrent.ws.inf.SnsServiceInf"/>
<property name="inHandlers">
<list><ref bean="myHandler"/></list>
</property>
</bean>
</beans>
web.xml配置文件:
<!-- begin XFire 配置 -->
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
<!--看清楚这个XFireSpringServlet,集成到spring里用这个servlet,别用错了-->
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
xfire开发的webservice的主要文件:
接口类:
package com.jcurrent.ws.inf;
public interface SnsServiceInf {
public String example(String message);
}
实现类:
package com.jcurrent.ws.service;
import java.util.List;
import com.jcurrent.bean.TestBean;
import com.jcurrent.dao.HibernateSuperDAO;
import com.jcurrent.ws.inf.SnsServiceInf;
/**
*接口类集成了数据库操作,这个webservice开放给用户对远程数据库进行操作
**/
public class SnsService extends HibernateSuperDAO<TestBean> implements SnsServiceInf{
public String example(String message) {
List<TestBean> list=this.getAll();
return message+";总记录数是:"+list.size();
}
}
拦截器:
package com.jcurrent.ws.handler;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import javax.servlet.http.HttpServletRequest;
import org.codehaus.xfire.transport.Session;
import org.codehaus.xfire.transport.http.XFireServletController;
import org.codehaus.xfire.transport.http.XFireHttpSession;
/**
*拦截器用于身份验证,接收客户端的用户信息,在拦截器里进行身份验证,验证通过后需要获取web应用的session
**/
public class MyHandler extends AbstractHandler{
public void invoke(MessageContext context) throws Exception {
String uri=context.getInMessage().getUri();
Element handler=context.getInMessage().getHeader();
HttpServletRequest request=XFireServletController.getRequest(); //得到客户端调用的信息
XFireHttpSession session=new XFireHttpSession(request); //这里产生了webservice的session
/**
** 怎么获取web应用的session,做到webservice和ssh应用共享session还没有研究透彻,有好方法的朋友提醒下
** xfire和spring集成的文档看了N遍,没有这方面的描述
**/
if(handler!=null){
String token=handler.getChild("token").getValue();
Session sess=context.getSession();
sess.put("token", token);
System.out.println(sess.get("token").toString());
System.out.println("session-username=:");
}else{
System.out.println("请求必须包含验证信息!!");
}
}
}
spring的配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans default-autowire="no" default-lazy-init="false" default-dependency-check="none">
<!--xfire和spring集成-->
<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
<bean id="snsServiceBean" class="com.jcurrent.ws.service.SnsService">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="myHandler" class="com.jcurrent.ws.handler.MyHandler"/>
<bean name="snsService" class="org.codehaus.xfire.spring.ServiceBean">
<property name="serviceBean" ref="snsServiceBean"/>
<property name="serviceClass" value="com.jcurrent.ws.inf.SnsServiceInf"/>
<property name="inHandlers">
<list><ref bean="myHandler"/></list>
</property>
</bean>
</beans>
web.xml配置文件:
<!-- begin XFire 配置 -->
<servlet>
<servlet-name>XFireServlet</servlet-name>
<servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
<!--看清楚这个XFireSpringServlet,集成到spring里用这个servlet,别用错了-->
</servlet>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/servlet/XFireServlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>