Webservice_26_SOAP的基于契约优先开发用户管理_通过Hander加入控制信息

非常感谢孙浩老师。

 

先修改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, HttpServletResponse resp) {
		WebUtil.addLicenceHeader(service, 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, HttpServletResponse resp)
			throws ServletException, 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();
		}
	}
}


 

结果:

没有用户就添加用户:

控制台提醒没有权限:

 

登入之后删除用户:

删除成功。

 

没有登入删除用户:

没有实现删除。

 

等等功能。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值