java post webservice_[java.webservice] 如何通过HttpPost从服务器上获得一个sessionid

java's Web Service is different from HttpPost, HttpGet and HttpResponse that kind of things. It is more easy to pass anything, any Object you like.

如果要利用Web Service返回一个sessionid的话,可以使用从Server返回返回值的形式,也可以在Client端实现SOAPHandler,然后在public boolean handleMessage(SOAPMessageContext context)方法中处理response的cookie,利用正则表达式获取JSESSIONID的值。

因为handleMessage每次都会首先执行,不管是request还是response过程,所以我只谈谈第一种方法,顺便对session过期也做下测试。以下是Demo及说明:

(一)创建Server类

public class HelloServer {

private String sessionid;

public WebServiceContext wsContext;

public String onLogin(){

return null;

}

public String sayHello(String sessionid) {

return null;

}

}

(二)使用MyEclipse工具生成Delegate类

@javax.jws.WebService(targetNamespace = "http://ws.jax_ws.honwhy.com/", serviceName = "HelloServerService", portName = "HelloServerPort", wsdlLocation = "WEB-INF/wsdl/HelloServerService.wsdl")

public class HelloServerDelegate {

HelloServer helloServer = new HelloServer();

public String onLogin() {

return helloServer.onLogin();

}

public String sayHello(String sessionid) {

return helloServer.sayHello(sessionid);

}

}

利用MyEclipse工具生成了Delegate类之外,还生成了sun-jaxws.xml和wsdl路径下的HelloServerService_schema1.xsd和HelloServerService.wsdl文件。

(三)简单修改Delegate类和Server类,加入session部分代码

查看sun-jaxws.xml文件就可以知道HelloServerPort是由HelloServerDelegate类实现的,而在Delegate类中只是new了一个HelloServer对象,然后调用相应方法实现onLogin和sayHello的。参考网上“Web Service管理session”相关的文章,我们可以在HelloServer中加入相关代码获取session,不过本文的建议是在Delegate类中注入@Resource而不是在Server类中注入,不修改sun-jaxws.xml在Server中注入是不会成功的。

参考代码:

public class HelloServerDelegate {

@Resource

private WebServiceContext wsContext;

HelloServer helloServer = new HelloServer();

public String onLogin() {

helloServer.wsContext = this.wsContext;

return helloServer.onLogin();

}

public String sayHello(String sessionid) {

return helloServer.sayHello(sessionid);

}

}

要将wsContext传递给HelloServer,就必须在HelloServer类中新建一个WebServiceContext类型的成员变量,为了方便本文把它设置为public域的变量,且看Server类新增的代码:

public WebServiceContext wsContext;

public String onLogin(){

MessageContext mc = wsContext.getMessageContext();

HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();

if (session == null) {

throw new WebServiceException("No session in WebServiceContext");

}

sessionid = session.getId().toString();

return sessionid;

}

(四)设置session过期时间

设置session过期有两种方式可以选择,一种是在sessionid返回之前设置当前session的有效期,使用setMaxInactiveInterval方法,提供int类型的参数,单位是秒。另外一种是在web.xml中加入session-config标签,单位是分钟。

1

(五)在sayHello方法中加入必要的逻辑

从Client发起请求首先调用的onLogin,然后才是sayHello,从onLogin调用获得的sessionid作为调用sayHello的参数。

public String sayHello(String sessionid) {

MessageContext mc = wsContext.getMessageContext();

HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();

if (session == null) {

throw new WebServiceException("No session in WebServiceContext");

}

if(sessionid.equals(session.getId().toString())) {

System.out.println(“Hello!”);

return “OK”;

} else {

return “EXPIRED”;

}

}

(六)创建Client工程,使用工具生成Web Service需要的类

在创建Client工程前可以将Server工程运行起来,从Server工程的HelloServerService.wsdl文件中找到,这个地址会在接下来使用得到。

在Client工程中新建一个Web Service Client,填入刚才的地址加入”?WSDL”,生成Web Service所需的类。

(七)创建Client类用来发起请求与Server通信

public class HelloClient {

private static String sessionid;

public static void main(String[] args) {

HelloServerService service = new HelloServerService();

HelloServerDelegate port = service.getHelloServerPort();

// 设置保留session

((BindingProvider)port).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);

// 第一次调用onLogin获得sessionid

sessionid = port.onLogin();

while(true){

try {

// 休息超过session有效期

Thread.sleep(65000);

} catch (InterruptedException e) {

e.printStackTrace();

}

String result = port.sayHello(sessionid);

if(result.equals("OK")){

System.out.println("session is"+result);

} else {

System.out.println("session is"+result);

break;

}

}// end of while loop

System.out.println("HelloClient::end of while loop");

}

}

如果session过期还可以让Client再次执行onLogin方法获得新的sessionid,sayHello方法也可以返回其他类型的值

}

(八)使用TCP/IP插件查看Web Service的request和response

参考:http://www.mkyong.com/webservices/jax-ws/how-to-trace-soap-message-in-eclipse-ide/

或者参考下一篇文章。

(九)完整工程代码

http://pan.baidu.com/s/15oQmj

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C 常见的面试知识点(下)

inline 内联函数的特征相当于把内联函数里面的内容写在调用内联函数处;相当于不用执行进入函数的步骤,直接执行函数体;相当于宏,却比宏多了类型检查,真正具有函数特性;编译器一般不内联包含循环、递归、swi…

php cdi_集成CDI和WebSockets

php cdi考虑尝试一个简单的Java EE 7原型应用程序,该应用程序涉及JAX-RS(REST),WebSockets和CDI。 注意 :不想让它成为破坏者-但本文主要讨论我在尝试使用Web套接字和使用CDI作为“胶水”(在Java EE应用程…

c语言排序方法有哪几种?

c语言排序方法有:1、简单选择排序,基于O(n2)时间复杂度的排序算法;2、冒泡排序;3、简单插入排序;4、希尔排序;5、归并排序,基于归并操作的一种排序算法;6、快…

java 类型不可视_jvm高级特性(5)(1)(原子性,可见性,有序性,volatile,概述)

简介:阿姆达尔定律(Amdahl):该定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力。摩尔定律(Moore):该定律用于描述处理器晶体管数量与运行效率间的发展关系。当价格不变时,集成电路上可容纳的元器件的数…

工程模式和抽象工厂模式_功能工厂模式

工程模式和抽象工厂模式您是否需要一种非常快速的方法来制作Factory对象? 然后,您需要lambda或其他函数传递! 它不仅快速,而且非常简单。 我敢打赌,如果您对Lambdas相当满意,那么您只需阅读标题就可以做到这…

c语言怎么输入3个数输出最大值

方法:首先使用scanf()接收从键盘输入的三个数;然后使用“if else”语句比较三个数的大小,获得最大值;最后使用print()函数将最大值输出即可。c语言输入3个数输出最大值#include int main() { // 输入abc输出最大值 int a; …

java调用ecdh_椭圆曲线ECC ECDH原理 javacard实现

椭圆曲线原理:椭圆曲线的图像并不是椭圆形,椭圆曲线源自于求椭圆弧长的椭圆积分的反函数。定义:椭圆曲线可用下列方程来表示,其中a,b,c,d为系数。E: y2 ax3 bx2 cx d椭圆曲线运算:(相当于交换群)AB&#x…

C 常用新特性(上)

下面是正文:auto类型推导auto可以让编译器在编译器就推导出变量的类型,看代码:利用auto可以通过右边的类型推导出变量的类型。什么时候使用auto呢?简单类型其实没必要使用auto,然而某些复杂类型就有必要使用auto&#…

等级保护测评工作重点难点_重点保护

等级保护测评工作重点难点在“ Java的一些句子 ”一文中,我写道: “受保护的方法和字段可以在同一包中的类中使用(到目前为止与私有包相同),此外,还可以从其他类中使用受保护的方法和字段,这些类…

c编译程序是什么?

c编译程序是由计算机厂家提供的一套软件。c编译程序又称c语言编译器,是指用c语言书写的源程序,翻译成等价的机器语言格式目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程序。它以高级程序设计语言书写的源程序作为输入,而以…

运动基元_基元需要走吗?

运动基元我目前正在使用JSF作为视图技术,使用JPA作为持久层的企业应用程序。 它可能是支持bean或服务方法中的某种东西,但令我震惊:是否有充分的理由在企业应用程序中使用原语? 当我开始围绕J2SE 1.2(或者是J2SE 5.0&…

mysql 三种工作模式_mybatis三种批量插入方式对比【面试+工作】

准备:1.表结构CREATE TABLE t_user (id varchar(32) CHARACTER SET utf8 NOT NULL COMMENT 主键,name varchar(50) CHARACTER SET utf8 DEFAULT NULL COMMENT 用户名,del_flag char(1) CHARACTER SET utf8 DEFAULT NULL COMMENT 删除标示,PRIMARY KEY (id)) ENGINEI…

C 常用新特性(下)

多线程什么是多线程这里就不过多介绍,新特性关于多线程最主要的就是std::thread的使用,它的使用也很简单,看代码:这里记住,std::thread在其对象生命周期结束时必须要调用join()或者detach(),否则程序会term…

ant 路径_在Ant中显示路径

ant 路径在博客文章Java and Ant Properties Refresher和Ant <echoproperties /> Task中 &#xff0c;我写了一篇关于如何了解Ant构建如何看到属性的文章&#xff0c;这有助于更好地理解该构建。 通常情况下&#xff0c;在构建过程中看到构建中使用的各种路径也很有价值&…

java8默认垃圾回收器,Java 8的默认垃圾收集器

What is the default garbage collector for Java 8?When I check the JMX Beans, they reveal it to be the parallel collector for the new generation and the old serial collector for the old generation.解决方案Selecting the default garbage collector (among othe…

c语言中结束本次循环的语句是什么

c语言中结束本次循环的语句是“continue”。控制语句continue只能作用于循环体中&#xff0c;其作用是结束本次循环&#xff0c;跳到判断循环的位置&#xff0c;即重新开始下一次循环。在C语言中&#xff0c;控制语句“continue”用于循环体中结束本次循环&#xff0c;重新开始…

jdk8 字符串_在JDK 8中连接字符串

jdk8 字符串JDK 8引入了语言功能&#xff0c;例如lambda表达式 &#xff0c; 流 &#xff0c;甚至是新的Date / Time API &#xff0c;这些都会改变我们编写Java应用程序的方式。 但是&#xff0c;还有一些新的API和功能可能不太“改变游戏规则”&#xff0c;但仍为Java编程语言…

C语言中要改变循环语句的流程可以使用的语句有哪些

C语言中要改变循环语句的流程可以使用的语句有&#xff1a;break&#xff0c;continue和goto。break语句可以终止循环而执行整个循环语句后面的代码&#xff1b;continue语句可以跳过循环体中剩余的语句而强制进入下一次循环。break关键字当 break 关键字用于 while、for 循环时…

apk图标存放位置_安卓系统下安装完apk程序后,具体的文件夹位置在哪里呢?

展开全部 有的程序的文件夹是自动建立在sd卡上的,有的程序是没有文件夹的,程序位于32313133353236313431303231363533e59b9ee7ad9431333365666238date/app文件夹内,而系统的程序位于system/app文件夹内。 软件安装完成后,就会在date/app目录出现一个apk文件。 这个文件相当…

java 线程什么时候出栈_在Java中给出的时间

java 线程什么时候出栈tl; dr&#xff0c;您可以使用标签来阐明给定的测试时间样式。 什么时候给出&#xff1f; 给定的时间&#xff0c;然后是指定系统行为的一种常用样式&#xff0c;其中您的测试分为三个部分。 给定的部分列出了测试的先决条件&#xff0c;即在您开始之前…