日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
ApacheCXF實(shí)戰(zhàn)之六:創(chuàng)建安全的WebService

我們在使用Web Service的過程中,很多情況是需要對web service請求做認(rèn)證的,對于運(yùn)行在web容器里的應(yīng)用程序來說,可能會比較簡單一些,通??梢酝ㄟ^filter來做一些處理,但是其實(shí)CXF本身也提供了對web service認(rèn)證的方式。下面來看一下如何實(shí)現(xiàn)。

成都創(chuàng)新互聯(lián)成立與2013年,我們提供高端網(wǎng)站建設(shè)、成都小程序開發(fā)、電商視覺設(shè)計(jì)、重慶APP軟件開發(fā)及網(wǎng)絡(luò)營銷搜索優(yōu)化服務(wù),在傳統(tǒng)互聯(lián)網(wǎng)與移動互聯(lián)網(wǎng)發(fā)展的背景下,我們堅(jiān)守著用標(biāo)準(zhǔn)的設(shè)計(jì)方案與技術(shù)開發(fā)實(shí)力作基礎(chǔ),以企業(yè)及品牌的互聯(lián)網(wǎng)商業(yè)目標(biāo)為核心,為客戶打造具商業(yè)價值與用戶體驗(yàn)的互聯(lián)網(wǎng)+產(chǎn)品。

1. 首先是一個簡單pojo

 
 
 
  1. package com.googlecode.garbagecan.cxfstudy.security;  
  2.  
  3. public class User {  
  4.     private String id;  
  5.     private String name;  
  6.     private String password;  
  7.     public String getId() {  
  8.         return id;  
  9.     }  
  10.     public void setId(String id) {  
  11.         this.id = id;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     public String getPassword() {  
  20.         return password;  
  21.     }  
  22.     public void setPassword(String password) {  
  23.         this.password = password;  
  24.     }  

2. Web Service接口

 
 
 
  1. package com.googlecode.garbagecan.cxfstudy.security;  
  2.  
  3. import java.util.List;  
  4.  
  5. import javax.jws.WebMethod;  
  6. import javax.jws.WebResult;  
  7. import javax.jws.WebService;  
  8.  
  9. @WebService 
  10. public interface UserService {  
  11.     @WebMethod 
  12.     @WebResult List list();  
  13.  

3. Web Service實(shí)現(xiàn)類

 
 
 
  1. package com.googlecode.garbagecan.cxfstudy.security;  
  2.  
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.  
  6. public class UserServiceImpl implements UserService {  
  7.  
  8.     public List list() {  
  9.         List users = new ArrayList();  
  10.         for (int i = 0; i < 10; i++) {  
  11.             User user = new User();  
  12.             user.setId("" + i);  
  13.             user.setName("user_" + i);  
  14.             user.setPassword("password_" + i);  
  15.             users.add(user);  
  16.         }  
  17.         return users;  
  18.     }  
  19.  

4. Server端Handler,其中使用了一個Map來存放用戶信息,真是應(yīng)用中可以使用數(shù)據(jù)庫或者其它方式獲取用戶和密碼

 
 
 
  1. package com.googlecode.garbagecan.cxfstudy.security;  
  2.  
  3. import java.io.IOException;  
  4. import java.util.HashMap;  
  5. import java.util.Map;  
  6.  
  7. import javax.security.auth.callback.Callback;  
  8. import javax.security.auth.callback.CallbackHandler;  
  9. import javax.security.auth.callback.UnsupportedCallbackException;  
  10.  
  11. import org.apache.ws.security.WSPasswordCallback;  
  12.  
  13. public class ServerUsernamePasswordHandler implements CallbackHandler {  
  14.  
  15.     // key is username, value is password  
  16.     private Map users;  
  17.  
  18.     public ServerUsernamePasswordHandler() {  
  19.         users = new HashMap();  
  20.         users.put("admin", "admin");  
  21.     }  
  22.  
  23.     public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {  
  24.         WSPasswordCallback callback = (WSPasswordCallback) callbacks[0];  
  25.         String id = callback.getIdentifier();  
  26.         if (users.containsKey(id)) {  
  27.             if (!callback.getPassword().equals(users.get(id))) {  
  28.                 throw new SecurityException("Incorrect password.");  
  29.             }  
  30.         } else {  
  31.             throw new SecurityException("Invalid user.");  
  32.         }  
  33.     }  
  34. }  

5. Client端Handler,用來設(shè)置用戶密碼,在真實(shí)應(yīng)用中可以根據(jù)此類和下面的測試類來修改邏輯設(shè)置用戶名和密碼。

 
 
 
  1. package com.googlecode.garbagecan.cxfstudy.security;  
  2.  
  3. import java.io.IOException;  
  4.  
  5. import javax.security.auth.callback.Callback;  
  6. import javax.security.auth.callback.CallbackHandler;  
  7. import javax.security.auth.callback.UnsupportedCallbackException;  
  8.  
  9. import org.apache.ws.security.WSPasswordCallback;  
  10.  
  11. public class ClientUsernamePasswordHandler implements CallbackHandler {  
  12.     public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {  
  13.         WSPasswordCallback callback = (WSPasswordCallback) callbacks[0];  
  14.         int usage = callback.getUsage();  
  15.         System.out.println("identifier: " + callback.getIdentifier());  
  16.         System.out.println("usage: " + callback.getUsage());  
  17.         if (usage == WSPasswordCallback.USERNAME_TOKEN) {  
  18.             callback.setPassword("admin");  
  19.         }  
  20.     }  
  21. }  

6. 單元測試類,注意在Server端添加了WSS4JInInterceptor到Interceptor列表中,在Client添加了WSS4JOutInterceptor到Interceptor列表中。

 
 
 
  1. package com.googlecode.garbagecan.cxfstudy.security;  
  2.  
  3. import java.net.SocketTimeoutException;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.  
  8. import javax.xml.ws.WebServiceException;  
  9.  
  10. import junit.framework.Assert;  
  11.  
  12. import org.apache.cxf.endpoint.Client;  
  13. import org.apache.cxf.endpoint.Endpoint;  
  14. import org.apache.cxf.frontend.ClientProxy;  
  15. import org.apache.cxf.interceptor.LoggingInInterceptor;  
  16. import org.apache.cxf.interceptor.LoggingOutInterceptor;  
  17. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  
  18. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;  
  19. import org.apache.cxf.transport.http.HTTPConduit;  
  20. import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;  
  21. import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;  
  22. import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;  
  23. import org.apache.ws.security.WSConstants;  
  24. import org.apache.ws.security.handler.WSHandlerConstants;  
  25. import org.junit.BeforeClass;  
  26. import org.junit.Test;  
  27.  
  28. public class UserServiceTest {  
  29.  
  30.     private static final String address = "http://localhost:9000/ws/security/userService";  
  31.       
  32.     @BeforeClass 
  33.     public static void setUpBeforeClass() throws Exception {  
  34.         JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();  
  35.         factoryBean.getInInterceptors().add(new LoggingInInterceptor());  
  36.         factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());  
  37.  
  38.         Map props = new HashMap();  
  39.         props.put("action", "UsernameToken");  
  40.         props.put("passwordType", "PasswordText");  
  41.         props.put("passwordCallbackClass", ServerUsernamePasswordHandler.class.getName());  
  42.         WSS4JInInterceptor wss4JInInterceptor = new WSS4JInInterceptor(props);  
  43.         factoryBean.getInInterceptors().add(wss4JInInterceptor);  
  44.           
  45.         factoryBean.setServiceClass(UserServiceImpl.class);  
  46.         factoryBean.setAddress(address);  
  47.         factoryBean.create();  
  48.     }  
  49.  
  50.     @Test 
  51.     public void testList() {  
  52.         JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();  
  53.         factoryBean.setAddress(address);  
  54.         factoryBean.setServiceClass(UserService.class);  
  55.         Object obj = factoryBean.create();  
  56.           
  57.         Client client = ClientProxy.getClient(obj);  
  58.         Endpoint endpoint = client.getEndpoint();  
  59.           
  60.         Map props = new HashMap();  
  61.         props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);  
  62.         props.put(WSHandlerConstants.USER, "admin");  
  63.         props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);  
  64.         props.put(WSHandlerConstants.PW_CALLBACK_CLASS, ClientUsernamePasswordHandler.class.getName());  
  65.         WSS4JOutInterceptor wss4JOutInterceptor = new WSS4JOutInterceptor(props);  
  66.         endpoint.getOutInterceptors().add(wss4JOutInterceptor);  
  67.           
  68.         HTTPConduit conduit = (HTTPConduit) client.getConduit();  
  69.         HTTPClientPolicy policy = new HTTPClientPolicy();  
  70.         policy.setConnectionTimeout(5 * 1000);  
  71.         policy.setReceiveTimeout(5 * 1000);  
  72.         conduit.setClient(policy);  
  73.           
  74.         UserService service = (UserService) obj;  
  75.         try {  
  76.             List users = service.list();  
  77.             Assert.assertNotNull(users);  
  78.             Assert.assertEquals(10, users.size());  
  79.         } catch(Exception e) {  
  80.             if (e instanceof WebServiceException   
  81.                     && e.getCause() instanceof SocketTimeoutException) {  
  82.                 System.err.println("This is timeout exception.");  
  83.             } else {  
  84.                 e.printStackTrace();  
  85.             }  
  86.         }  
  87.     }  
  88.  

***運(yùn)行上面的測試類來測試結(jié)果,也可以修改測試方法中的密碼,看看錯誤結(jié)果,這里就不在寫錯誤密碼的測試用例了,因?yàn)槲沂且粦腥恕?/p>

原文鏈接:http://blog.csdn.net/kongxx/article/details/7534035

【系列文章】

  1. Apache CXF實(shí)戰(zhàn)之六:創(chuàng)建安全的Web Service
  2. Apache CXF實(shí)戰(zhàn)之五:壓縮Web Service數(shù)據(jù)
  3. Apache CXF實(shí)戰(zhàn)之四:構(gòu)建RESTful Web Service
  4. Apache CXF實(shí)戰(zhàn)之三:傳輸Java對象
  5. Apache CXF實(shí)戰(zhàn)之二:集成Sping與Web容器
  6. Apache CXF實(shí)戰(zhàn)之一:Hello World Web Service

網(wǎng)站題目:ApacheCXF實(shí)戰(zhàn)之六:創(chuàng)建安全的WebService
當(dāng)前路徑:http://www.5511xx.com/article/cccjeoo.html