使用JAX-WS进行应用程序身份验证「建议收藏」

使用JAX-WS进行应用程序身份验证「建议收藏」在JAX-WS中处理身份验证的常用方法之一是客户端提供“用户名”和“密码”,将其附加在SOAP请求标头中并发送到服务器,服务器解析SOAP文档并检索提供的“用户名”和“密码”从请求标头中进行,并从数据库中进行验证,或者使用其他任何方法。在本文中,我们向您展示如何实现上述“JAX-WS中的应用程序级别认证”。想法…在Web服务客户端站点上,只需将“用户名”和“密码”放入请…

大家好,又见面了,我是你们的朋友全栈君。

在JAX-WS中处理身份验证的常用方法之一是客户端提供“用户名”和“密码”,将其附加在SOAP请求标头中并发送到服务器,服务器解析SOAP文档并检索提供的“用户名”和“密码”从请求标头中进行,并从数据库中进行验证,或者使用其他任何方法。

在本文中,我们向您展示如何实现上述“ JAX-WS中的应用程序级别认证 ”。

想法…

Web服务客户端站点上,只需将“用户名”和“密码”放入请求标头即可。

Map<String, Object> req_ctx = ((BindingProvider)port).getRequestContext();
    req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL);

    Map<String, List<String>> headers = new HashMap<String, List<String>>();
    headers.put("Username", Collections.singletonList("mkyong"));
    headers.put("Password", Collections.singletonList("password"));
    req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);

Web服务服务器站点上,通过WebServiceContext获取请求标头参数。

@Resource
    WebServiceContext wsctx;

    @Override
    public String method() {
		
        MessageContext mctx = wsctx.getMessageContext();
		
	//get detail from request headers
        Map http_headers = (Map) mctx.get(MessageContext.HTTP_REQUEST_HEADERS);
        List userList = (List) http_headers.get("Username");
        List passList = (List) http_headers.get("Password");

    //...

仅此而已,已部署的JAX-WS受支持的应用程序级别身份验证。

使用JAX-WS认证示例

查看完整示例。

1. WebService服务器

创建一个简单的JAX-WS hello world示例,以处理应用程序级别的身份验证。

文件:HelloWorld.java

package com.mkyong.ws;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;

//Service Endpoint Interface
@WebService
@SOAPBinding(style = Style.RPC)
public interface HelloWorld{
	
	@WebMethod String getHelloWorldAsString();
	
}

HelloWorldImpl.java

package com.mkyong.ws;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.jws.WebService;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;

//Service Implementation Bean
@WebService(endpointInterface = "com.mkyong.ws.HelloWorld")
public class HelloWorldImpl implements HelloWorld{

    @Resource
    WebServiceContext wsctx;

    @Override
    public String getHelloWorldAsString() {
		
	MessageContext mctx = wsctx.getMessageContext();
		
	//get detail from request headers
        Map http_headers = (Map) mctx.get(MessageContext.HTTP_REQUEST_HEADERS);
        List userList = (List) http_headers.get("Username");
        List passList = (List) http_headers.get("Password");

        String username = "";
        String password = "";
        
        if(userList!=null){
        	//get username
        	username = userList.get(0).toString();
        }
        	
        if(passList!=null){
        	//get password
        	password = passList.get(0).toString();
        }
        	
        //Should validate username and password with database
        if (username.equals("mkyong") && password.equals("password")){
        	return "Hello World JAX-WS - Valid User!";
        }else{
        	return "Unknown User!";
        }
       
    }	
}

2. EndPoint Publisher

创建一个端点发布程序以通过以下URL在Web服务之上进行部署:“ http:// localhost:9999 / ws / hello

文件:HelloWorldPublisher.java

package com.mkyong.endpoint;
 
import javax.xml.ws.Endpoint;
import com.mkyong.ws.HelloWorldImpl;
 
//Endpoint publisher
public class HelloWorldPublisher{
 
    public static void main(String[] args) {
	   Endpoint.publish("http://localhost:9999/ws/hello", new HelloWorldImpl());
    }
 
}

3. WebService客户端

创建一个Web服务客户端,以发送“用户名”和“密码”进行身份验证。

文件:HelloWorldClient.java

package com.mkyong.client;

import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Service;
import javax.xml.ws.handler.MessageContext;

import com.mkyong.ws.HelloWorld;

public class HelloWorldClient{
	
	private static final String WS_URL = "http://localhost:9999/ws/hello?wsdl";
		
	public static void main(String[] args) throws Exception {
	   
	URL url = new URL(WS_URL);
        QName qname = new QName("http://ws.mkyong.com/", "HelloWorldImplService");

        Service service = Service.create(url, qname);
        HelloWorld hello = service.getPort(HelloWorld.class);
        
        /*******************UserName & Password ******************************/
        Map<String, Object> req_ctx = ((BindingProvider)hello).getRequestContext();
        req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL);

        Map<String, List<String>> headers = new HashMap<String, List<String>>();
        headers.put("Username", Collections.singletonList("mkyong"));
        headers.put("Password", Collections.singletonList("password"));
        req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
        /**********************************************************************/
        
        System.out.println(hello.getHelloWorldAsString());
       
    }
}

输出量

Hello World JAX-WS - Valid User!

4.跟踪SOAP流量

从上到下,显示SOAP信封如何在客户端和服务器之间流动。

1.客户端发送请求,用户名“ mkyong ”和密码“ password ”包含在SOAP信封中。

POST /ws/hello?wsdl HTTP/1.1
Password: password
Username: mkyong
SOAPAction: ""
Accept: text/xml, multipart/related, text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-Type: text/xml; charset=utf-8
User-Agent: Java/1.6.0_13
Host: localhost:8888
Connection: keep-alive
Content-Length: 178

<?xml version="1.0" ?>
	<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
		<S:Body>
			<ns2:getHelloWorldAsString xmlns:ns2="http://ws.mkyong.com/"/>
		</S:Body>
	</S:Envelope>

2.服务器发回正常响应。

HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: text/xml; charset=utf-8

<?xml version="1.0" ?>
	<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
		<S:Body>
			<ns2:getHelloWorldAsStringResponse xmlns:ns2="http://ws.mkyong.com/">
				<return>Hello World JAX-WS - Valid User!</return>
			</ns2:getHelloWorldAsStringResponse>
		</S:Body>
	</S:Envelope>

做完了

下载源代码

下载它– JAX-WS-Application-Authentication-Example.zip (10KB)

翻译自: https://mkyong.com/webservices/jax-ws/application-authentication-with-jax-ws/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159711.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • leetocde-416分割等和子集(01背包)

    leetocde-416分割等和子集(01背包)原题链接给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200示例 1:输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11]. 示例 2:输入: [1, 2, 3, 5]输出: false解释: 数组不能分割成两个元素和相等的子集.题解先看和如果式奇数,返回false,否则除以2,然后看是否能够用拼凑出整合处于

    2022年8月8日
    3
  • 基于faster-rcnn的目标物体检测_传统的目标检测算法

    基于faster-rcnn的目标物体检测_传统的目标检测算法继RCNN,fastRCNN之后,目标检测界的领军人物RossGirshick在2015年提出fasterRCNN。目标检测速度达到15fps。

    2022年10月13日
    3
  • window location href 跳转之后怎么获得后面带参数

    window location href 跳转之后怎么获得后面带参数functionGetRequest(){varurl=location.search;//获取url中"?"符后的字串vartheRequest=newObject();if(url.indexOf("?")!=-1){varstr=url…

    2022年7月13日
    34
  • oracle手动 建库_Oracle手动建库过程

    oracle手动 建库_Oracle手动建库过程最近在网上看到很多初学 Oracle 或是从旧版的 Oracle 升级到 10G 的朋友们都问如何在 Oracle10G 里手工建库的问题 今天正好有空 于是乎把在 Oracle10G 里手工建库的全过程写出来 供各位从事 Oracle 工作和学习的同朋友们参考 希望能够对大家有所帮助 在 Oracle 中建库 通常有两种方法 一是使用 Oracle 的建库工且 DBCA 这是一个图形界面工且 使用起来方便且很容易理解 因为它

    2025年6月13日
    1
  • XPS文件转换成PDF[通俗易懂]

    XPS文件转换成PDF[通俗易懂]作者:iamlaosongXPS是XMLPaperSpecification(XML文件规格书)的简称是一种电子文件格式,它是微软公司开发的一种文档保存与查看的规范。同事有一个XPS文件,希望能够转换成PDF格式。方法一:电脑上安装了AdobeAcrobat8Professional1、双击打开AdobeAcrobat8Professional。2、点击“打开”,选择要转换的XPS文件。3、不出意外的话XPS文件可以正常打开并看到内容。4、另存为PDF文件即可。电脑上有其他版.

    2022年6月4日
    44
  • 手机APP如何抓包[通俗易懂]

    手机APP如何抓包[通俗易懂]使用场景程序及其使用第一步:Fiddler抓取手机App的HTTP协议请求数据首先保证手机和Fiddler主机为同一网络Fiddler开启远程设备连接(确认Fiddler代理主机IP和端口号)手机端设置网络代理为Fiddler主机(设为Fiddler代理主机IP地址和端口号)验证:访问传智官网(http://www.itcast.cn)第一步:Fiddler抓取手机App的…

    2022年5月30日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号