为webservice上加身份验证
发布时间:2020-12-16 23:45:51 所属栏目:安全 来源:网络整理
导读:? ? ? ? ?在前面的基础上加上身份验证。 ? ? ? ? ?只需在服务端与客户端的调用之前后知添加拦截器即可: ? ? ? ? 服务端: ? ? ? ?? package com.webservice.cxf.test;import javax.xml.ws.Endpoint;import org.apache.cxf.jaxws.EndpointImpl;import com.we
? ? ? ? ?在前面的基础上加上身份验证。 ? ? ? ? ?只需在服务端与客户端的调用之前后知添加拦截器即可: ? ? ? ? 服务端: ? ? ? ?? package com.webservice.cxf.test; import javax.xml.ws.Endpoint; import org.apache.cxf.jaxws.EndpointImpl; import com.webservice.cxf.auth.AuthInterceptor; import com.webservice.cxf.impl.HelloWorldImpl; public class TestMain { public static void main(String[] args) { HelloWorldImpl helloWorldImpl = new HelloWorldImpl(); EndpointImpl ep = (EndpointImpl) Endpoint.publish( "http://127.0.0.1/richard",helloWorldImpl); // 给服务器添加In拦截器,拦截从客户端来的信息。 ep.getInInterceptors().add(new AuthInterceptor()); // 给服务器添加Out拦截器,拦截从服务器端出去的信息。 //ep.getOutInterceptors().add(new LoggingOutInterceptor()); System.out.println("暴漏成功"); } }? ? 自定义In拦截器: package com.webservice.cxf.auth; import java.util.List; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.Element; import org.w3c.dom.NodeList; /** * In拦截器 * @author xushuai * */ public class AuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> { public AuthInterceptor() { //显示调用父类的构造器,在发送消息之前调用,in拦截器 super(Phase.PRE_INVOKE); } @Override public void handleMessage(SoapMessage msg) throws Fault { // 得到soap消息的所有header消息 List<Header> headers = msg.getHeaders(); if (headers.size() < 1 || headers.isEmpty()) { throw new Fault(new IllegalArgumentException("没有header")); } // 获取第一个header并得到header信息 Header firstheader = headers.get(0); Element ele = (Element) firstheader.getObject(); // 得到userId的节点 NodeList nodeIds = ele.getElementsByTagName("userId"); NodeList nodePasses = ele.getElementsByTagName("userPass"); // 检查各节点是否为空 if (nodeIds.getLength() != 1) { throw new Fault(new IllegalArgumentException("用户名格式不正确")); } if (nodePasses.getLength() != 1) { throw new Fault(new IllegalArgumentException("密码格式不正确")); } // 从数据库中获取user和密码是否被授权查询信息 String user = nodeIds.item(0).getTextContent(); String pwd = nodePasses.item(0).getTextContent(); if (!user.equals("Richard")) { throw new Fault(new IllegalArgumentException("用户名不正确")); } if (!pwd.equals("123")) { throw new Fault(new IllegalArgumentException("密码不正确")); } } } 客户端:Out拦截器 package com.webservice.cxf.test; import java.util.List; import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; import com.webservice.cxf.Cat; import com.webservice.cxf.Entity; import com.webservice.cxf.IHelloWorld; import com.webservice.cxf.StringCat; import com.webservice.cxf.User; import com.webservice.cxf.impl.HelloWorldImpl; public class ClientTestmain { public static void main(String[] args) { HelloWorldImpl factory = new HelloWorldImpl(); IHelloWorld hw = factory.getHelloWorldImplPort(); // 为客户端添加out拦截器 Client clientProxy = ClientProxy.getClient(hw); //为out拦截器添加自定义拦截器 clientProxy.getOutInterceptors().add(new AddHeaderInterceptor("Richard","123")); System.out.println(hw.sayHi("xushuai")); User user = new User(); user.setId(1); user.setName("Richard"); user.setPass("1234"); List<Cat> catList = hw.getCatsByUser(user); for (Cat cat : catList) { System.out.println(cat.getCat()); } StringCat stringCat = hw.getAllCats(); List<Entity> ens = stringCat.getEntities(); for (int i = 0; i < ens.size(); i++) { System.out.println(ens.get(i).getKey() + " | " + ens.get(i).getValue().getCat()); } } } 客户端的自定义拦截器,在其的Header中添加身份信息 package com.webservice.cxf.test; import java.util.List; import javax.xml.namespace.QName; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.helpers.DOMUtils; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * soap消息分两部分,第一部分Header中携带身份等信息,第二部分body里面携带具体的操作信息 * AbstractPhaseInterceptor<SoapMessage>中的SoapMessage就是操作其Header信息, * 在Header中添加身份信息。 * @author xushuai * Out拦截器 */ public class AddHeaderInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private String userId; private String pwd; public AddHeaderInterceptor(String userid,String pwd) { // 准备发送消息的时候启用该拦截器 super(Phase.PREPARE_SEND); this.pwd = pwd; this.userId = userid; } @Override public void handleMessage(SoapMessage mgs) throws Fault { List<Header> headers = mgs.getHeaders(); Document doc = DOMUtils.createDocument(); //自定义一个XML片段添加在Header中,并在服务器端查询是否有该片段。 //达到身份拦截的目的。 /** * <authElement> * <userId></userId> * <userPass></userPass> * </authElement> */ Element ele = doc.createElement("authElement"); Element useridEle = doc.createElement("userId"); useridEle.setTextContent(userId); Element pwdEle = doc.createElement("userPass"); pwdEle.setTextContent(pwd); ele.appendChild(useridEle); ele.appendChild(pwdEle); headers.add(new Header(new QName("web"),ele)); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |