Webservice_26_SOAP的基于契约优先开发用户管理_通过Hander加入
发布时间:2020-12-17 00:10:24 所属栏目:安全 来源:网络整理
导读:非常感谢孙浩老师。 ? 先修改User.wsdl,加入licenceInfo许可信息: ?xml version="1.0" encoding="UTF-8" standalone="no"?wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"xmlns:tns="http://service.lichen.cn" xmlns:wsdl="http://
非常感谢孙浩老师。 ? 先修改User.wsdl,加入licenceInfo许可信息: <?xml version="1.0" encoding="UTF-8" standalone="no"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.lichen.cn" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="UserService" targetNamespace="http://service.lichen.cn"> <wsdl:types> <xsd:schema targetNamespace="http://service.lichen.cn"> <!-- <xsd:include schemaLocation="user.xsd"></xsd:include> --> <xsd:element name="add" type="tns:add" /> <xsd:element name="addResponse" type="tns:addResponse" /> <xsd:element name="delete" type="tns:delete" /> <xsd:element name="deleteResponse" type="tns:deleteResponse" /> <xsd:element name="list" type="tns:list" /> <xsd:element name="listResponse" type="tns:listResponse" /> <xsd:element name="login" type="tns:login" /> <xsd:element name="loginResponse" type="tns:loginResponse" /> <!-- 增加异常处理 --> <xsd:element name="UserException" type="tns:UserException"></xsd:element> <!-- 增加head验证信息 --> <xsd:element name="licenceInfo" type="tns:licenceInfo"></xsd:element> <!-- 增加head验证信息 --> <xsd:complexType name="licenceInfo"> <xsd:sequence> <xsd:element name="registerUser" type="tns:user" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="add"> <xsd:sequence> <xsd:element name="user" type="tns:user" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="addResponse"> <xsd:sequence /> </xsd:complexType> <xsd:complexType name="delete"> <xsd:sequence> <xsd:element name="username" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="deleteResponse"> <xsd:sequence /> </xsd:complexType> <xsd:complexType name="list"> <xsd:sequence /> </xsd:complexType> <xsd:complexType name="listResponse"> <xsd:sequence minOccurs="1" maxOccurs="unbounded"> <xsd:element name="user" type="tns:user" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="login"> <xsd:sequence> <xsd:element name="username" type="xsd:string" /> <xsd:element name="passwrdr" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="loginResponse"> <xsd:sequence> <xsd:element name="user" type="tns:user" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="user"> <xsd:sequence> <xsd:element name="username" type="xsd:string" /> <xsd:element name="nickname" type="xsd:string" /> <xsd:element name="password" type="xsd:string" /> </xsd:sequence> </xsd:complexType> <!-- 增加异常处理 --> <xsd:complexType name="UserException"> <xsd:sequence> <xsd:element name="message" type="xsd:string" /> </xsd:sequence> </xsd:complexType> </xsd:schema> </wsdl:types> <!-- 增加异常处理 --> <wsdl:message name="UserException"> <wsdl:part element="tns:UserException" name="fault" /> </wsdl:message> <!-- 增加head验证信息 --> <wsdl:message name="licenceInfo"> <wsdl:part element="tns:licenceInfo" name="licenceInfo" /> </wsdl:message> <wsdl:message name="add"> <wsdl:part element="tns:add" name="parameters" /> </wsdl:message> <wsdl:message name="addResponse"> <wsdl:part element="tns:addResponse" name="parameters" /> </wsdl:message> <wsdl:message name="delete"> <wsdl:part element="tns:delete" name="parameters" /> </wsdl:message> <wsdl:message name="deleteResponse"> <wsdl:part element="tns:deleteResponse" name="parameters" /> </wsdl:message> <wsdl:message name="login"> <wsdl:part element="tns:login" name="parameters" /> </wsdl:message> <wsdl:message name="loginResponse"> <wsdl:part element="tns:loginResponse" name="parameters" /> </wsdl:message> <wsdl:message name="list"> <wsdl:part element="tns:list" name="parameters" /> </wsdl:message> <wsdl:message name="listResponse"> <wsdl:part element="tns:listResponse" name="parameters" /> </wsdl:message> <wsdl:portType name="IUserService"> <wsdl:operation name="add"> <wsdl:input message="tns:add" /> <wsdl:output message="tns:addResponse" /> <!-- 增加异常处理 --> <wsdl:fault name="UserException" message="tns:UserException"></wsdl:fault> </wsdl:operation> <wsdl:operation name="delete"> <wsdl:input message="tns:delete" /> <wsdl:output message="tns:deleteResponse" /> <!-- 增加异常处理 --> <wsdl:fault name="UserException" message="tns:UserException"></wsdl:fault> </wsdl:operation> <wsdl:operation name="login"> <wsdl:input message="tns:login" /> <wsdl:output message="tns:loginResponse" /> <!-- 增加异常处理 --> <wsdl:fault name="UserException" message="tns:UserException"></wsdl:fault> </wsdl:operation> <wsdl:operation name="list"> <wsdl:input message="tns:list" /> <wsdl:output message="tns:listResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="userServiceSOAP" type="tns:IUserService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="add"> <wsdl:input> <soap:body use="literal" /> <!-- 增加head验证信息 --> <soap:header use="literal" part="licenceInfo" message="tns:licenceInfo"></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:operation name="delete"> <wsdl:input> <soap:body use="literal" /> <!-- 增加head验证信息 --> <soap:header use="literal" part="licenceInfo" message="tns:licenceInfo"></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:operation name="login"> <wsdl:input> <soap:body use="literal" /> </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:operation name="list"> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="UserService"> <wsdl:port binding="tns:userServiceSOAP" name="UserServicePort"> <soap:address location="http://localhost:8080/Webservice_07_pro_service/us" /> </wsdl:port> </wsdl:service> </wsdl:definitions> ? 使用wsimport导出Java文件,拷贝到客户端,把IUserService拷贝到服务端,在修改IUserService,和之前以前一样。 ? 再修改IUserService的实现类: package cn.lichen.service; import java.util.List; @WebService(endpointInterface = "cn.lichen.service.IUserService",wsdlLocation = "WEB-INF/wsdl/user.wsdl",portName = "UserServicePort",serviceName = "UserService",targetNamespace = "http://service.lichen.cn") public class UserServiceImpl implements IUserService { @Resource private WebServiceContext ctx; private UserDaoImpl userdao = UserDaoImpl.newInstance(); @Override public void add(User user) throws UserException{ checkRegister(); userdao.add(user); } private void checkRegister() throws UserException { try { HeaderList headers = (HeaderList)ctx.getMessageContext().get(JAXWSProperties.INBOUND_HEADER_LIST_PROPERTY); QName qname = new QName("http://service.lichen.cn","licenceInfo"); if(headers==null) throw new UserException("该功能需要进行权限控制"); Header header = headers.get(qname,true); if(header==null) throw new UserException("该功能需要进行权限控制"); XMLStreamReader xsr = header.readHeader(); User u = x2user(xsr); User tu = userdao.loadByUsername(u.getUsername()); if(tu==null) throw new UserException("你所使用的用户不是系统的授权用户"); if(!tu.getPassword().equals(u.getPassword())) throw new UserException("授权用户的密码信息不正确!"); } catch (XMLStreamException e) { e.printStackTrace(); } } private User x2user(XMLStreamReader xsr) throws XMLStreamException { User u = new User(); while(xsr.hasNext()) { int event = xsr.next(); if(event==XMLEvent.START_ELEMENT) { String name = xsr.getName().toString(); if(name.equals("username")) { u.setUsername(xsr.getElementText()); } else if(name.equals("password")) { u.setPassword(xsr.getElementText()); } else if(name.equals("nickname")) { u.setNickname(xsr.getElementText()); } } } return u; } @Override public User login(String username,String passwrod) throws UserException{ return userdao.login(username,passwrod); } @Override public void delete(String username) throws UserException { checkRegister(); userdao.delete(username); } @Override public List<User> list() { return userdao.list(); } }
客户端新建一个工具类: package cn.lichen.servlet; import javax.servlet.http.HttpServletRequest; public class WebUtil { private static String ns = "http://service.lichen.cn"; public static void addLicenceHeader(IUserService port,HttpServletRequest request) { try { //1、将一个对象转换为xml通过JAXB JAXBContext ctx = JAXBContext.newInstance(LicenceInfo.class); User ru = (User)request.getSession().getAttribute("loginUser"); if(ru==null) return; LicenceInfo info = new LicenceInfo(); info.setRegisterUser(ru); QName name = new QName(ns,"licenceInfo"); JAXBElement<LicenceInfo> jele = new JAXBElement<LicenceInfo>(name,LicenceInfo.class,info); Marshaller mars = ctx.createMarshaller(); mars.setProperty(Marshaller.JAXB_FRAGMENT,true); mars.setProperty(Marshaller.JAXB_ENCODING,"UTF-8"); //2、转换为DOM Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); mars.marshal(jele,doc); //3、通过Headers.create方法完成header的添加 //获取WSBindingProvider WSBindingProvider wsb = (WSBindingProvider)port; wsb.setOutboundHeaders(Headers.create(doc.getDocumentElement())); } catch (PropertyException e) { e.printStackTrace(); } catch (JAXBException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } } } ? ?Servletl类:? ? package cn.lichen.servlet; import java.io.IOException; public class UserServlet extends HttpServlet { private static final long serialVersionUID = 1L; private UserService us; private IUserService service; @Override protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException { req.setCharacterEncoding("UTF-8"); us = new UserService(); service = us.getUserServicePort(); // 标识不同的方法 String method = req.getParameter("method"); if (method == null || "".equals(method)) { list(req,resp); } else if (method.equals("add")) { add(req,resp); } else if (method.equals("login")) { login(req,resp); } else if (method.equals("delete")) { delete(req,resp); } } private void delete(HttpServletRequest req,HttpServletResponse resp) { WebUtil.addLicenceHeader(service,req); String username = req.getParameter("username"); try { service.delete(username); } catch (UserException_Exception e) { System.out.println(e.getMessage()); } list(req,resp); } private void login(HttpServletRequest req,HttpServletResponse resp) { String username = req.getParameter("username"); String password = req.getParameter("password"); try { req.getSession().setAttribute("loginUser",service.login(username,password)); } catch (UserException_Exception e) { e.printStackTrace(); } list(req,resp); } private void add(HttpServletRequest req,req); User user = new User(); user.setUsername(req.getParameter("username")); user.setNickname(req.getParameter("nickname")); user.setPassword(req.getParameter("password")); try { service.add(user); } catch (UserException_Exception e) { System.out.println(e.getMessage()); } list(req,resp); } @Override protected void doPost(HttpServletRequest req,IOException { doGet(req,resp); } private void list(HttpServletRequest request,HttpServletResponse response) { try { request.setAttribute("users",service.list()); RequestDispatcher dis = request.getRequestDispatcher("list.jsp"); dis.forward(request,response); } catch (ServletException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
结果: 没有用户就添加用户: 控制台提醒没有权限: ? 登入之后删除用户: 删除成功。 ? 没有登入删除用户: 没有实现删除。 ? 等等功能。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |