`
schy_hqh
  • 浏览: 558181 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

通过HEADER传递信息-做权限控制

 
阅读更多

通过HEADER而不是BODY传递“LICENSE”

 

客户端往HEADER中加入信息;

服务端从HEADER中取出信息;

 

首先编写xsd和wsdl

 

user.xsd中代码片段

<xsd:element name="licenseInfo" type="tns:licenseInfo"></xsd:element>
<xsd:complexType name="licenseInfo">
		<xsd:sequence>
			<xsd:element name="licenseUser" type="tns:user"/>
		</xsd:sequence>
</xsd:complexType>

 

 

wsdl中的代码片段

<wsdl:message name="licenseInfo">
		<wsdl:part name="licenseInfo" element="tns:licenseInfo"></wsdl:part>
	</wsdl:message>

 

<wsdl:binding>
 <wsdl:operation name="login">
  <wsdl:input>
   <soap:body use="literal" />
   <!-- 添加头消息 -->
   <soap:header use="literal" part="licenseInfo" message="tns:licenseInfo"></soap:header>
  </wsdl:input>
  <wsdl:output>
   <soap:body use="literal" />
  </wsdl:output>
  <!-- 异常 -->
  <wsdl:fault name="UserException">
   <soap:fault name="UserException" use="literal" />
  </wsdl:fault>
 </wsdl:operation>
</wsdl:binding>

 

服务端编写好schema和wsdl后,使用wsimport将wsdl转换为java文件,放到客户端项目中

客户端访问UserServlet,调用login()时,加入头信息

 

package com.hqh.service.servlet;


import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;

import com.hqh.service.IUserService;
import com.hqh.service.LicenseInfo;
import com.hqh.service.User;
import com.hqh.service.UserException_Exception;
import com.hqh.service.UserService;
import com.sun.xml.internal.ws.api.message.Headers;
import com.sun.xml.internal.ws.developer.WSBindingProvider;



/**
 * Servlet implementation class UserServlet
 */
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private IUserService service;
	private UserService serviceImpl;
	private String namespace = "http://service.hqh.com";  
	
    public UserServlet() {
        super();
        System.out.println("UserServlet.UserServlet()");
        //初始化服务端口调用类
        try {
        	//通过URL和QName主要是为了使用TCPM监控SOAP消息
			URL wsdlLocation = new URL("http://localhost:8888/Demo/service");
			QName qname = new QName(namespace, "UserService");
			serviceImpl = new UserService(wsdlLocation,qname);
			service = serviceImpl.getUserServicePort();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String method = request.getParameter("method");
		if(method==null || "".equals(method)) {
			list(request,response);
		} else if("login".equals(method)) {
			login();
		}
	}
	
	/**
	 * 登陆的时候往HEADER中加入信息
	 */
	private void login() {
		try {
			//将对象转换为节点,作为头信息在SOAPmessage中进行传递
			//第一步:使用jaxb转换对象为xml
			JAXBContext ctx = JAXBContext.newInstance(LicenseInfo.class);
			
			LicenseInfo info = new LicenseInfo();
			
			User user = new User();
			user.setId(100);
			user.setName("admin");
			user.setPwd("admin");
			
			info.setLicenseUser(user);
			QName qName = new QName(namespace,"licenseInfo"); 
			//这里使用JAXBElement就可以不在LicenseInfo类上定义@XMLROOTELEMENT注解了
			//由于该类为wsdl转换而成的,每次转换后都需要添加注解,很不方便
			//所以,这里使用JAXBElement进行转换
			JAXBElement<LicenseInfo> jaxbEle = new JAXBElement<LicenseInfo>(qName, LicenseInfo.class, info);
			Marshaller marshaller = ctx.createMarshaller();
			marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
			marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
			
			//第二步:转换为DOM
			Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
			//将对象转换为xml并放到document中
			marshaller.marshal(jaxbEle, doc);
			
			marshaller.marshal(jaxbEle, System.out);
			System.out.println();
			
			//第三步:通过Headers.create完成header的添加
			WSBindingProvider wsb = (WSBindingProvider)service;
			wsb.setOutboundHeaders(Headers.create(doc.getDocumentElement()));
			
			//调用服务
			service.login("a", "n");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

	private void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		List<User> users = service.list();
		request.setAttribute("users", users);
		request.getRequestDispatcher("/list.jsp").forward(request, response);
	}
	
	

}

 

服务端获取到HEADER中的信息,根据具体业务需求做处理...

package com.hqh.service;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.annotation.Resource;
import javax.jws.WebService;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;
import javax.xml.ws.WebServiceContext;

import com.hqh.model.User;
import com.sun.xml.ws.api.message.Header;
import com.sun.xml.ws.api.message.HeaderList;
import com.sun.xml.ws.api.server.WSWebServiceContext;
import com.sun.xml.ws.developer.JAXWSProperties;


/**必须指定targetNamespace,否则服务无法启动*/
/*file:/E:/technology-hqh/proj/webservice/JAX-WS/Demo/build/classes/META-INF/wsdl/user.wsdl
has the following services [{http://service.hqh.com}UserService]
but not {http://service.hqh.com/}UserService. 
Maybe you forgot to specify a service name in @WebService/@WebServiceProvider?*/

@WebService(endpointInterface="com.hqh.service.IUserService",
			wsdlLocation="WEB-INF/wsdl/user.wsdl",
			serviceName="UserService",
			portName="userServicePort",
			targetNamespace="http://service.hqh.com")
public class UserServiceImpl implements IUserService {
	
	private static List<User> users = new ArrayList<User>();
	
	static {
		users.add(new User(1,"zs","zs"));
	}
	
	//通过注入的WebServiceContext获取HEADER
	@Resource
	private WebServiceContext ctx;
	
	@Override
	public void add(User user) throws UserException{
		for(User u:users) {
			if(u.getName().equals(user.getName())) {
				throw new UserException("用户已存在!",null);
			}
		}
		users.add(user);
	}

	@Override
	public void delete(int id) {
		for (Iterator iterator = users.iterator(); iterator.hasNext();) {
			User user = (User) iterator.next();
			if(id==user.getId()) {
				users.remove(user);
				break;
			}
		}
	}

	@Override
	public List<User> list() {
		return users;
	}

	@Override
	public User login(String name, String pwd) throws UserException{
		checkAuthorized();
		for(User user : users) {
			if(name.equals(user.getName()) && pwd.equals(user.getPwd())) {
				return user;
			}
		}
		throw new UserException("用户不存在",null);
	}

	private void checkAuthorized() {
		// 检查用户权限
		// 从SOAP的HEADER中传入某些验证信息,作为权限的控制
		User authUser = new User();
		try {
			HeaderList headers = (HeaderList) ctx.getMessageContext().get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY);
			QName headerName = new QName("http://service.hqh.com","licenseInfo");
			Header header = headers.get(headerName, true);
			XMLStreamReader reader = header.readHeader();
			while(reader.hasNext()) {
				int code = reader.next();
				if(code == XMLEvent.START_ELEMENT) {
					String nodeName = reader.getName().toString();
					if("id".equals(nodeName)) {
						authUser.setId(Integer.parseInt(reader.getElementText()));
					} else if("name".equals(nodeName)) {
						authUser.setName(reader.getElementText());
					} else if ("pwd".equals(nodeName)) {
						authUser.setPwd(reader.getElementText());
					}
				}
			}
			System.out.println(authUser);
			//获取到HEADER中的数据后,针对具体需求做处理...
		} catch (XMLStreamException e) {
			e.printStackTrace();
		}
		
	}

}

 

分享到:
评论

相关推荐

    asp.net权限控制

    此外,也可以使用HTTP头部进行更精细的权限控制,比如通过HTTP Response Header中的"X-Access-Token"或"Authorization"字段来传递访问令牌,以此来验证用户的访问权限。 文件下载部分,ASP.NET提供了多种方法来安全...

    采用custom SOAP Header实现的 .NET web service 的权限控制源码例子

    SOAP消息通常包含一个Header和一个Body,Header部分可以用来传递额外的信息,如认证、会话管理等。在这个例子中,我们探讨的是如何利用自定义SOAP Header在.NET Web Service中实现权限控制。 自定义SOAP Header是一...

    java后台获取小程序用户信息和生成自定义token,并使用filter过滤header的token源码

    本主题将详细讲解如何实现“java后台获取小程序用户信息”、“生成自定义token”以及“使用filter过滤header的token”的核心技术点。 首先,我们要理解小程序与后台交互的基本流程。小程序通常会通过调用微信提供的...

    request-header-parser

    4. **API访问控制**:通过验证Authorization头中的令牌,实现API的权限管理。 在实际项目中,`request-header-parser`通常配合其他中间件一起使用。例如,你可以先使用它解析请求头,然后将结果传递给处理登录认证...

    Feign调用丢失Header的解决方案.docx

    例如,认证信息、跟踪ID等关键Header如果未能正确传递,则可能引起一系列问题,如权限验证失败、日志追踪不连贯等。 #### 解决方案 针对上述问题,可以通过编写自定义的Feign请求拦截器来解决Header丢失的问题,并...

    crm数据权限设计流程

    通过实现数据权限控制流程,企业可以防止未经授权的数据访问,保护企业的敏感数据。 在该流程中,我们可以看到,使用了 Spring Cloud 框架来实现数据权限控制流程。Spring Cloud 是一个基于Java的微服务架构框架,...

    Cxf客户端及服务器端,实现客户端和服务器端的权限验证

    运行提供的示例项目,尝试使用不同用户登录,观察是否能正确通过权限验证。如果遇到问题,可以通过CXF的跟踪日志和调试工具进行排查。 总的来说,Apache CXF提供了一套全面的工具和API来实现客户端和服务器端的...

    用apisix 做一个api key web 管理和api key 权限和访问级别控制

    Key-Auth 支持通过 Header、Query 参数或 Cookie 传递 API Key,管理员可以根据应用场景配置相应的认证方式。配置 Key-Auth 插件时,可以设置 `key_in_body`、`key_names` 和 `hide_credentials` 等参数,以满足不同...

    springboot整合 shrio+jwt的登录及权限控制.rar

    通过Spring Boot整合Shiro和JWT,我们可以创建一个既简单又安全的用户登录和接口权限控制系统。Shiro负责身份认证和授权,JWT则为无状态的权限验证提供了便利。这种结合方式不仅降低了服务器端的负担,也提高了系统...

    身份验证包 支持Header、Cookie、Param等多种传参方式 包含:验证、验证并且自动刷新等多种中间件

    如果验证失败,系统将返回相应的错误信息,阻止无权限的访问。 2. **验证并自动刷新**:在验证过程中,如果发现令牌即将过期,该中间件可以自动发起刷新令牌的请求,以保持用户会话的连续性,避免频繁重新登录。 与...

    使用PHP进行Apache+SVN的权限管理

    最后,通过设置HTTP响应头`SVN-Authorization`,将权限信息传递给Apache。 注意,这种方式可能会对性能产生影响,因为每次SVN请求都会执行PHP脚本。如果项目规模较大,建议在服务器端缓存用户角色和权限信息,或者...

    react-components-header

    例如,Header组件可能通过HOC接受props,如用户信息,从而实现权限控制或个性化定制。 10. **React Router**:如果Header组件涉及导航,可能会结合React Router进行路由管理。通过Link组件和路由参数,可以实现点击...

    prefer-safe-http-header:Chrome扩展程序启用首选

    HTTP头部是网络通信中用于传递元信息的重要部分,它们可以指示客户端的偏好、认证信息、缓存策略等。 关于“JavaScript”,这是与这个扩展相关的编程语言。Chrome扩展程序通常使用JavaScript编写,因为它是浏览器...

    微信开发网页获取用户信息封装类 传入(AppID AppSecret)

    微信开发网页获取用户信息封装类2.0授权 传入(AppID AppSecret)即可获取用户信息 直接获取openid不需要用户授权。 友情提示:需要认证的服务号才有获取权限的资格

    基于springboot+springSecurity+jwt实现的基于token的权限管理的一个demo,适合新手

    在Spring Security中,可以通过定义角色和权限,然后在控制器层进行权限检查,来实现精细的权限控制。 项目中的"springboot-jwt-demo(4)"可能是一个包含源代码、配置文件和测试案例的目录。在这个目录下,你可能会...

    Springboot整合Spring security+Oauth2+JWT搭建认证服务器,网关,微服务之间权限认证及授权

    它包含三个部分:Header、Payload和Signature,其中Payload可以存储用户信息。JWT的优势在于,它不需要在服务器之间存储会话状态,减少了数据库的负担,适合微服务架构。 4. **整合Spring Security与OAuth2**:在...

    基于springboot+springSecurity+jwt实现的基于token的权限管理+源代码+文档

    JWT可以安全地在客户端和服务器之间传递,用于表示用户的身份和权限。在本系统中,JWT用于生成和验证用户登录后的token,实现无状态的身份认证。 4. **基于Token的权限管理**: 传统的Session-Cookie机制在分布式...

    header()函数使用说明

    标题中的"header()函数使用说明"指的是一种在PHP中用于发送HTTP头部...通过header()函数,开发者可以灵活地控制HTTP交互,实现诸如页面重定向、内容类型设定、错误处理等多种功能,从而优化网站的用户体验和安全性。

    springboot+springSecurity+jwt实现的基于token的权限管理的一个demo

    它通过一个自包含的令牌来传递信息,这个令牌由三部分组成:Header、Payload和Signature。JWT可以在客户端和服务器之间安全地传输信息,而无需在每个请求中携带用户信息。 在这个demo中,Spring Security将被用来...

    1jwt+springsecurity安全权限认证1

    通过这些资料,你可以了解到如何配置Spring Security以支持JWT,如何创建和验证JWT,以及如何在Spring Security的过滤器链中处理JWT,从而实现细粒度的权限控制。此外,还可以学习如何处理JWT的刷新和过期策略,以...

Global site tag (gtag.js) - Google Analytics