非常感谢孙浩老师。
先修改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();
}
}
}
结果:
没有用户就添加用户:
控制台提醒没有权限:
登入之后删除用户:
删除成功。
没有登入删除用户:
没有实现删除。
等等功能。