通过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(); } } }
相关推荐
此外,也可以使用HTTP头部进行更精细的权限控制,比如通过HTTP Response Header中的"X-Access-Token"或"Authorization"字段来传递访问令牌,以此来验证用户的访问权限。 文件下载部分,ASP.NET提供了多种方法来安全...
SOAP消息通常包含一个Header和一个Body,Header部分可以用来传递额外的信息,如认证、会话管理等。在这个例子中,我们探讨的是如何利用自定义SOAP Header在.NET Web Service中实现权限控制。 自定义SOAP Header是一...
本主题将详细讲解如何实现“java后台获取小程序用户信息”、“生成自定义token”以及“使用filter过滤header的token”的核心技术点。 首先,我们要理解小程序与后台交互的基本流程。小程序通常会通过调用微信提供的...
4. **API访问控制**:通过验证Authorization头中的令牌,实现API的权限管理。 在实际项目中,`request-header-parser`通常配合其他中间件一起使用。例如,你可以先使用它解析请求头,然后将结果传递给处理登录认证...
例如,认证信息、跟踪ID等关键Header如果未能正确传递,则可能引起一系列问题,如权限验证失败、日志追踪不连贯等。 #### 解决方案 针对上述问题,可以通过编写自定义的Feign请求拦截器来解决Header丢失的问题,并...
通过实现数据权限控制流程,企业可以防止未经授权的数据访问,保护企业的敏感数据。 在该流程中,我们可以看到,使用了 Spring Cloud 框架来实现数据权限控制流程。Spring Cloud 是一个基于Java的微服务架构框架,...
运行提供的示例项目,尝试使用不同用户登录,观察是否能正确通过权限验证。如果遇到问题,可以通过CXF的跟踪日志和调试工具进行排查。 总的来说,Apache CXF提供了一套全面的工具和API来实现客户端和服务器端的...
Key-Auth 支持通过 Header、Query 参数或 Cookie 传递 API Key,管理员可以根据应用场景配置相应的认证方式。配置 Key-Auth 插件时,可以设置 `key_in_body`、`key_names` 和 `hide_credentials` 等参数,以满足不同...
通过Spring Boot整合Shiro和JWT,我们可以创建一个既简单又安全的用户登录和接口权限控制系统。Shiro负责身份认证和授权,JWT则为无状态的权限验证提供了便利。这种结合方式不仅降低了服务器端的负担,也提高了系统...
如果验证失败,系统将返回相应的错误信息,阻止无权限的访问。 2. **验证并自动刷新**:在验证过程中,如果发现令牌即将过期,该中间件可以自动发起刷新令牌的请求,以保持用户会话的连续性,避免频繁重新登录。 与...
最后,通过设置HTTP响应头`SVN-Authorization`,将权限信息传递给Apache。 注意,这种方式可能会对性能产生影响,因为每次SVN请求都会执行PHP脚本。如果项目规模较大,建议在服务器端缓存用户角色和权限信息,或者...
例如,Header组件可能通过HOC接受props,如用户信息,从而实现权限控制或个性化定制。 10. **React Router**:如果Header组件涉及导航,可能会结合React Router进行路由管理。通过Link组件和路由参数,可以实现点击...
HTTP头部是网络通信中用于传递元信息的重要部分,它们可以指示客户端的偏好、认证信息、缓存策略等。 关于“JavaScript”,这是与这个扩展相关的编程语言。Chrome扩展程序通常使用JavaScript编写,因为它是浏览器...
微信开发网页获取用户信息封装类2.0授权 传入(AppID AppSecret)即可获取用户信息 直接获取openid不需要用户授权。 友情提示:需要认证的服务号才有获取权限的资格
在Spring Security中,可以通过定义角色和权限,然后在控制器层进行权限检查,来实现精细的权限控制。 项目中的"springboot-jwt-demo(4)"可能是一个包含源代码、配置文件和测试案例的目录。在这个目录下,你可能会...
它包含三个部分:Header、Payload和Signature,其中Payload可以存储用户信息。JWT的优势在于,它不需要在服务器之间存储会话状态,减少了数据库的负担,适合微服务架构。 4. **整合Spring Security与OAuth2**:在...
JWT可以安全地在客户端和服务器之间传递,用于表示用户的身份和权限。在本系统中,JWT用于生成和验证用户登录后的token,实现无状态的身份认证。 4. **基于Token的权限管理**: 传统的Session-Cookie机制在分布式...
标题中的"header()函数使用说明"指的是一种在PHP中用于发送HTTP头部...通过header()函数,开发者可以灵活地控制HTTP交互,实现诸如页面重定向、内容类型设定、错误处理等多种功能,从而优化网站的用户体验和安全性。
它通过一个自包含的令牌来传递信息,这个令牌由三部分组成:Header、Payload和Signature。JWT可以在客户端和服务器之间安全地传输信息,而无需在每个请求中携带用户信息。 在这个demo中,Spring Security将被用来...
通过这些资料,你可以了解到如何配置Spring Security以支持JWT,如何创建和验证JWT,以及如何在Spring Security的过滤器链中处理JWT,从而实现细粒度的权限控制。此外,还可以学习如何处理JWT的刷新和过期策略,以...