`
log_cd
  • 浏览: 1098413 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

WebService之CXF使用Session

阅读更多
一、接口与实现
@WebService
public interface IUserLogin {

	public boolean login(String userId, String password);
	
	public boolean logout(String userId);

	public boolean checkLoginState(String userId);
	
}

@Repository
@WebService(endpointInterface = "net.log_cd.ws.IUserLogin")
public class UserLoginImpl implements IUserLogin{

	@Resource     
	private WebServiceContext wsContext;      
	
	@Override
	public boolean login(String userId, String password) {
		MessageContext msgContext = wsContext.getMessageContext();      
		HttpSession httpSession = ((HttpServletRequest) msgContext.get(MessageContext.SERVLET_REQUEST)).getSession();      
		HttpServletRequest request = (HttpServletRequest)msgContext.get("HTTP.REQUEST"); 
		System.out.println("request from " + request.getRemoteAddr()+", [userId = "+userId+", password="+password);
		
		httpSession.setAttribute("token", httpSession.getId()+"_"+userId);
		//save session into webservice context
		((javax.servlet.ServletContext) msgContext.get(MessageContext.SERVLET_CONTEXT)).setAttribute("session", httpSession);
		return true;
	}

	@Override
	public boolean logout(String userId) {
		MessageContext msgContext = wsContext.getMessageContext();  
		HttpSession httpSession = (HttpSession)((ServletContext) msgContext.get(MessageContext.SERVLET_CONTEXT)).getAttribute("session");
		String token = (String)httpSession.getAttribute("token");
		if(null != userId && null != token && token.equals(httpSession.getId()+"_"+userId)){
			httpSession.removeAttribute("token");
			System.out.println("userId["+userId+"] log out success!");
			return true;
		}else{
			System.out.println("userId["+userId+"] log out fail!");
			return false;
		}
	}

	@Override
	public boolean checkLoginState(String userId){
		MessageContext msgContext = wsContext.getMessageContext();  
		HttpSession httpSession = (HttpSession)((ServletContext) msgContext.get(MessageContext.SERVLET_CONTEXT)).getAttribute("session");
		String token = (String)httpSession.getAttribute("token");
		return (null != userId && null != token && token.equals(httpSession.getId()+"_"+userId));
	}
	
}

@WebService  
public interface IFileTransfer {
	
	void uploadFile(String userId, FileInfo fileInfo);
	
	FileInfo downloadFile(String userId, FileInfo fileInfo);
	
}

@Repository
@WebService(endpointInterface = "net.log_cd.ws.IFileTransfer")
public class FileTransferImpl implements IFileTransfer{

	@Resource     
	private WebServiceContext wsContext;	
	
	@Resource
	private IUserLogin userLogin;	
	
	@Override
	public void uploadFile(String userId, FileInfo fileInfo) {
		if(!userLogin.checkLoginState(userId)){
			System.out.println("illegal operation!");
			return;
		}
		OutputStream os = null;
		try{
			if(fileInfo.getPosition() != 0){
				os = FileUtils.openOutputStream(new File(fileInfo.getServerFilePath()), true);
			}else{
				os = FileUtils.openOutputStream(new File(fileInfo.getServerFilePath()), false);
			}
			os.write(fileInfo.getBytes());
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			IOUtils.closeQuietly(os);
		}
	}

	@Override
	public FileInfo downloadFile(String userId, FileInfo fileInfo) {
		if(!userLogin.checkLoginState(userId)){
			System.out.println("illegal operation!");
			return null;
		}		
		InputStream innputStrean = null;
		try{
			innputStrean = new FileInputStream(fileInfo.getServerFilePath());
			innputStrean.skip(fileInfo.getPosition());
			byte[] bytes = new byte[1024 * 1024];  
			int size = innputStrean.read(bytes);  
			if (size > 0) {
				byte[] fixedBytes = Arrays.copyOfRange(bytes, 0, size);  
				fileInfo.setBytes(fixedBytes);  
			} else {  
				fileInfo.setBytes(new byte[0]);  
			}  
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			IOUtils.closeQuietly(innputStrean);  
		}
		return fileInfo;
	}
	
}

二、相关POJO
public class FileInfo {

	private String clientFilePath;

	private String serverFilePath;

	private long position;

	private byte[] bytes;

	public String getClientFilePath() {
		return clientFilePath;
	}

	public void setClientFilePath(String clientFilePath) {
		this.clientFilePath = clientFilePath;
	}

	public String getServerFilePath() {
		return serverFilePath;
	}

	public void setServerFilePath(String serverFilePath) {
		this.serverFilePath = serverFilePath;
	}

	public long getPosition() {
		return position;
	}

	public void setPosition(long position) {
		this.position = position;
	}

	public byte[] getBytes() {
		return bytes;
	}

	public void setBytes(byte[] bytes) {
		this.bytes = bytes;
	}

}

三、发布WebService服务
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<context:component-scan base-package="net.log_cd.ws"/>
	
	<jaxws:endpoint id="userLoginWebService"
		implementor="#userLoginImpl" address="/userLogin" />	

	<jaxws:endpoint id="fileTransferWebService"
		implementor="#fileTransferImpl" address="/fileTransfer" />	
		
</beans>

四、客户端spring配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	<context:component-scan base-package="com.log_cd.ws" />

	<!-- proxy factory schema -->
	<bean id="userLogin" class="net.log_cd.ws.IUserLogin"
		factory-bean="clientFactory" factory-method="create" />
	<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		<property name="serviceClass" value="net.log_cd.ws.IUserLogin" />
		<property name="address"
			value="http://localhost:8080/cxf/ws/userLogin" />
	</bean>
	<!-- proxy factory schema -->

	<bean id="fileTransfer" class="net.log_cd.ws.IFileTransfer"
		factory-bean="clientFactory2" factory-method="create" />
	<bean id="clientFactory2" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		<property name="serviceClass" value="net.log_cd.ws.IFileTransfer" />
		<property name="address"
			value="http://localhost:8080/cxf/ws/fileTransfer" />
	</bean>

</beans>

五、测试代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:cxf-ws-client.xml")
public class CXFWebServiceSessionTest extends AbstractJUnit4SpringContextTests {

	public static final String clientFilePath = "D:/test/test.jpg";
	public static final String serverFilePath = "D:/test/test_cp.jpg";
	public static final String userId = "log_cd";
	
	@Resource
	private IUserLogin userLogin;

	@Resource
	private IFileTransfer fileTransfer;

	@Test
	public void userLogin() {
		boolean bool = userLogin.login(userId, "85139999");
		System.out.println(bool);
		Assert.isTrue(bool);
	}

	@Ignore
	public void uploadFile() {
		InputStream inputStream = null;
		try {
			FileInfo fileInfo = new FileInfo();
			inputStream = new FileInputStream(clientFilePath);
			byte[] bytes = new byte[1024 * 1024];
			while (true) {
				int size = inputStream.read(bytes);
				if (size <= 0) {
					break;
				}
				byte[] fixedBytes = Arrays.copyOfRange(bytes, 0, size);
				fileInfo.setClientFilePath(clientFilePath);
				fileInfo.setServerFilePath(serverFilePath);
				fileInfo.setBytes(fixedBytes);

				fileTransfer.uploadFile(userId, fileInfo);
				fileInfo.setPosition(fileInfo.getPosition() + fixedBytes.length);
			}
		} catch (IOException e) {
			throw new RuntimeException(e.getMessage(), e);
		} finally {
			IOUtils.closeQuietly(inputStream);
		}
	}

	@Test
	public void downloadFile() {
		FileInfo fileInfo = new FileInfo();
		fileInfo.setServerFilePath(serverFilePath);
		long position = 0;
		while (true) {
			fileInfo.setPosition(position);
			fileInfo = fileTransfer.downloadFile(userId, fileInfo);
			if (fileInfo.getBytes().length <= 0) {
				break;
			}
			OutputStream outputStream = null;
			try {
				if (position != 0) {
					outputStream = FileUtils.openOutputStream(new File(clientFilePath),
							true);
				} else {
					outputStream = FileUtils.openOutputStream(new File(clientFilePath),
							false);
				}
				outputStream.write(fileInfo.getBytes());
			} catch (IOException e) {
				throw new RuntimeException(e.getMessage(), e);
			} finally {
				IOUtils.closeQuietly(outputStream);
			}
			position += fileInfo.getBytes().length;
		}
	}

	@Test
	public void userLogout() {
		boolean bool = userLogin.logout(userId);
		System.out.println(bool);
		Assert.isTrue(bool);
	}

}
分享到:
评论

相关推荐

    用CXF开发RESTful风格WebService

    下面将详细介绍如何使用CXF开发RESTful风格WebService。 一、RESTful简要介绍 RESTful是一种软件架构风格,基于HTTP协议,使用简洁、统一的接口描述语言来描述资源。RESTful风格WebService具有以下特点: * 使用...

    springMVC+hibernate+webservice

    【WebService】在本项目中,可能使用了Apache CXF来实现。CXF是一个全面的Web服务框架,支持SOAP、RESTful等多种风格的Web服务。它可以方便地生成服务端和客户端代码,提供WSDL(Web服务描述语言)的生成和解析,...

    xfire开发的带session生命周期的webservice应用工程实例

    在本示例中,"带session生命周期的webservice应用工程"意味着服务端能够识别和跟踪客户端的会话。在传统的HTTP请求中,Session用于存储用户状态信息,当用户在网站的不同页面间导航时,Session能够在服务器端保持...

    cfx webservice 入门 详细步骤

    本文将详细介绍如何入门使用 CXF 来创建和部署 Web 服务。 **第一步:导入 CXF 相关包** 首先,你需要从官方下载地址(http://cxf.apache.org/download.html)获取 CXF 的 JAR 包,并将其添加到你的项目类路径中。...

    WebService开发指南

    3. **Session管理**:在分布式环境中,Axis2支持会话管理,确保跨多个WebService调用时的数据一致性。 4. **使用Spring的JavaBean发布WebService**:结合Spring框架,可以方便地将JavaBean转换为可发布的WebService...

    详解Hibernate与WebService结合使用

    - **WebService资源**:需要添加WebService相关的库文件,如Axis2或CXF等,以支持WebService的开发。 #### 四、生成Hibernate相关对象映射文件 1. **定义表结构**:在数据库中设计和创建所需的表结构。 2. **根据...

    webservice服务程序标准

    例如,通过在WebService中暴露NHibernate Session,客户端可以通过调用相应的方法执行CRUD操作。 7. BJCreation.Windows.DataUpLoad:根据压缩包内的文件名,我们可以推测这是一个Windows平台上的数据上传服务。在...

    ejb WebService

    “工具”标签可能指的是用于开发、部署和测试ejb WebService的各种工具,例如Apache CXF、Metro(JAX-WS RI)、Eclipse IDE等。这些工具提供了从生成WebService客户端代码到调试和监控服务的全面支持,大大简化了...

    webservice整合了hibernate

    可以选择使用JAX-WS(Java API for XML Web Services)或者CXF等框架来生成服务端和客户端代码。 4. **实现业务逻辑**:在Web Service的实现类中,注入Hibernate的SessionFactory,通过Session对象执行数据库操作,...

    ssm+shiro+cxf

    在这个项目中,CXF可能被用来发布和调用WebService,实现不同系统间的通信和数据交换,增加了系统的可扩展性和互操作性。 至于压缩包内的文件,`read me.png`可能是项目说明的截图,`shiro.sql`可能包含初始化Shiro...

    Java源码 SpringMVC Mybatis Shiro Bootstrap Rest Webservice

    2. Wink Rest服务、Webservice服务:jaxws、CXF等 3. IO 流上传下载文件,多线程操作 4. 发送邮件,配置邮件服务器,发基于html、纯文本格式的邮件(可以免费赠送网络爬虫,使其群发邮件,做到广告推送等) 5. MD...

    java工程师简历_java简历.doc

    1. **鲜果任务水果配送项目**:使用Springmvc、Spring、Mybatis、Webservice CXF、Shiro、Redis、ActiveMQ和ElasticSearch等技术。项目中,利用Webservice CXF进行服务发布,Shiro结合Ehcache进行权限验证,Redis...

    webservice的客户端 页面 JSP servlet 实现

    在JSP页面中,可以使用内置对象(如request、response、session等)来访问HTTP请求的数据,同时通过EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)简化编程。 接下来,我们探讨Servlet...

    数据采集系统

    系统中通过 cxf webservice引擎,将统计服务对外公开,可实现第三方系统的无 缝整合. .利用aop + scheduler 采用动态表实现日志管理,提高日志表的存储和访问能力. .集成 spring cache ,对 service层用户参与调查...

    基于Flex三种通讯方式的Java配置与整合.docx

    - **Web层**:Spring-Flex 1.0.3 (AMF)、Struts 2.3.15.1 (Service)、CXF 2.7.6 (WebService) - **Service层**:Spring 3.1 - **DAO层**:Hibernate 3.3 #### AMF通讯方式配置 为了实现Flex客户端与Java服务器端的...

    java变态面试题.pdf

    Java 面试题知识点总结 ...* WebService 的主要技术亮点:WebService 是基于SOAP或RESTful的,常用的框架有 Axis、CXF 等。 * Tomcat 服务器:如何基于 JNDI 技术配置数据库连接池,如何在 Tomcat 中嵌入一个测试项目。

    java.net.SocketException Connection reset 解决方法

    解决这个问题的方法包括设置 Socket 的 timeout 时间、确保连接关闭后不再发送数据和使用连接池或其他机制来管理连接。同时,我们也可以通过实践经验来了解到,timer 的方法可能会导致大量的 Socket 连接建立和关闭...

    Java EE常用框架.xmind

    五、我们还可以使用Idea下的webservice,能够使用图形画面的方式获取本地代理和生成WSDL文件。 Activiti 介绍 Activiti5是一个业务流程管理(BPM)框架 如果我们的业务是比较复杂的话,我们才会用到...

    java2年工作经验简历_java简历.docx

    她还运用Redis缓存来优化首页广告位的展示,使用ActiveMQ进行商品索引同步,使用FreeMarker进行商品详情页的静态化展示,同时将Session信息存储到Redis缓存服务器中,确保了数据共享和系统性能的提升。 此外,郑...

Global site tag (gtag.js) - Google Analytics