<dfn id="w48us"></dfn><ul id="w48us"></ul>
  • <ul id="w48us"></ul>
  • <del id="w48us"></del>
    <ul id="w48us"></ul>
  • 如何創建安全的Web Service

    時間:2024-07-27 01:01:07 J2EE培訓 我要投稿
    • 相關推薦

    如何創建安全的Web Service

      我們在使用Web Service的過程中,很多情況是需要對web service請求做認證的,對于運行在web容器里的應用程序來說,可能會比較簡單一些,通常可以通過filter來做一些處理,但是其實CXF本身也提供了對web service認證的方式。

      1. 首先是一個簡單pojo

      package com.googlecode.garbagecan.cxfstudy.security;

      public class User {

      private String id;

      private String name;

      private String password;

      public String getId() {

      return id;

      }

      public void setId(String id) {

      this.id = id;

      }

      public String getName() {

      return name;

      }

      public void setName(String name) {

      this.name = name;

      }

      public String getPassword() {

      return password;

      }

      public void setPassword(String password) {

      this.password = password;

      }

      }

      2. Web Service接口

      package com.googlecode.garbagecan.cxfstudy.security;

      import java.util.List;

      import javax.jws.WebMethod;

      import javax.jws.WebResult;

      import javax.jws.WebService;

      @WebService

      public interface UserService {

      @WebMethod

      @WebResult List list();

      }

      3. Web Service實現類

      package com.googlecode.garbagecan.cxfstudy.security;

      import java.util.ArrayList;

      import java.util.List;

      public class UserServiceImpl implements UserService {

      public List list() {

      List users = new ArrayList();

      for (int i = 0; i < 10; i++) {

      User user = new User();

      user.setId("" + i);

      user.setName("user_" + i);

      user.setPassword("password_" + i);

      users.add(user);

      }

      return users;

      }

      }

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

      package com.googlecode.garbagecan.cxfstudy.security;

      import java.io.IOException;

      import java.util.HashMap;

      import java.util.Map;

      import javax.security.auth.callback.Callback;

      import javax.security.auth.callback.CallbackHandler;

      import javax.security.auth.callback.UnsupportedCallbackException;

      import org.apache.ws.security.WSPasswordCallback;

      public class ServerUsernamePasswordHandler implements CallbackHandler {

      // key is username, value is password

      private Map users;

      public ServerUsernamePasswordHandler() {

      users = new HashMap();

      users.put("admin", "admin");

      }

      public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {

      WSPasswordCallback callback = (WSPasswordCallback) callbacks[0];

      String id = callback.getIdentifier();

      if (users.containsKey(id)) {

      if (!callback.getPassword().equals(users.get(id))) {

      throw new SecurityException("Incorrect password.");

      }

      } else {

      throw new SecurityException("Invalid user.");

      }

      }

      }

      5. Client端Handler,用來設置用戶密碼,在真實應用中可以根據此類和下面的測試類來修改邏輯設置用戶名和密碼。

      package com.googlecode.garbagecan.cxfstudy.security;

      import java.io.IOException;

      import javax.security.auth.callback.Callback;

      import javax.security.auth.callback.CallbackHandler;

      import javax.security.auth.callback.UnsupportedCallbackException;

      import org.apache.ws.security.WSPasswordCallback;

      public class ClientUsernamePasswordHandler implements CallbackHandler {

      public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {

      WSPasswordCallback callback = (WSPasswordCallback) callbacks[0];

      int usage = callback.getUsage();

      System.out.println("identifier: " + callback.getIdentifier());

      System.out.println("usage: " + callback.getUsage());

      if (usage == WSPasswordCallback.USERNAME_TOKEN) {

      callback.setPassword("admin");

      }

      }

      }

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

      package com.googlecode.garbagecan.cxfstudy.security;

      import java.net.SocketTimeoutException;

      import java.util.HashMap;

      import java.util.List;

      import java.util.Map;

      import javax.xml.ws.WebServiceException;

      import junit.framework.Assert;

      import org.apache.cxf.endpoint.Client;

      import org.apache.cxf.endpoint.Endpoint;

      import org.apache.cxf.frontend.ClientProxy;

      import org.apache.cxf.interceptor.LoggingInInterceptor;

      import org.apache.cxf.interceptor.LoggingOutInterceptor;

      import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

      import org.apache.cxf.jaxws.JaxWsServerFactoryBean;

      import org.apache.cxf.transport.http.HTTPConduit;

      import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;

      import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor;

      import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor;

      import org.apache.ws.security.WSConstants;

      import org.apache.ws.security.handler.WSHandlerConstants;

      import org.junit.BeforeClass;

      import org.junit.Test;

      public class UserServiceTest {

      private static final String address = "http://localhost:9000/ws/security/userService";

      @BeforeClass

      public static void setUpBeforeClass() throws Exception {

      JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();

      factoryBean.getInInterceptors().add(new LoggingInInterceptor());

      factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());

      Map props = new HashMap();

      props.put("action", "UsernameToken");

      props.put("passwordType", "PasswordText");

      props.put("passwordCallbackClass", ServerUsernamePasswordHandler.class.getName());

      WSS4JInInterceptor wss4JInInterceptor = new WSS4JInInterceptor(props);

      factoryBean.getInInterceptors().add(wss4JInInterceptor);

      factoryBean.setServiceClass(UserServiceImpl.class);

      factoryBean.setAddress(address);

      factoryBean.create();

      }

      @Test

      public void testList() {

      JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();

      factoryBean.setAddress(address);

      factoryBean.setServiceClass(UserService.class);

      Object obj = factoryBean.create();

      Client client = ClientProxy.getClient(obj);

      Endpoint endpoint = client.getEndpoint();

      Map props = new HashMap();

      props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);

      props.put(WSHandlerConstants.USER, "admin");

      props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);

      props.put(WSHandlerConstants.PW_CALLBACK_CLASS, ClientUsernamePasswordHandler.class.getName());

      WSS4JOutInterceptor wss4JOutInterceptor = new WSS4JOutInterceptor(props);

      endpoint.getOutInterceptors().add(wss4JOutInterceptor);

      HTTPConduit conduit = (HTTPConduit) client.getConduit();

      HTTPClientPolicy policy = new HTTPClientPolicy();

      policy.setConnectionTimeout(5 * 1000);

      policy.setReceiveTimeout(5 * 1000);

      conduit.setClient(policy);

      UserService service = (UserService) obj;

      try {

      List users = service.list();

      Assert.assertNotNull(users);

      Assert.assertEquals(10, users.size());

      } catch(Exception e) {

      if (e instanceof WebServiceException

      && e.getCause() instanceof SocketTimeoutException) {

      System.err.println("This is timeout exception.");

      } else {

      e.printStackTrace();

      }

      }

      }

      }

      最后運行上面的測試類來測試結果,也可以修改測試方法中的密碼,看看錯誤結果。

    【如何創建安全的Web Service】相關文章:

    Web Service的開發與應用基礎07-12

    如何保證Web服務器安全06-30

    如何面試Web前端開發10-10

    如何由淺入深實踐學習 Web 標準10-10

    如何識別和防御Web網頁木馬09-11

    如何創建班組文化09-18

    CAD邊界如何創建10-02

    CAD如何創建新布局06-09

    Web2.0該如何走向商業化08-29

    如何用Dreamweaver批量做web網頁詳細步驟09-17

    主站蜘蛛池模板: 无码国产亚洲日韩国精品视频一区二区三区 | 影视网欧洲精品| 亚洲精品无码不卡在线播放HE| 九九在线精品视频专区| 亚洲国产精品18久久久久久 | 精品国产午夜理论片不卡| 欧美激情视频精品一区二区| 91久久精品视频| 国产精品你懂得| 蜜芽亚洲av无码精品色午夜 | 亚洲国产精品成人| 国产精品视频不卡| 国语自产拍精品香蕉在线播放| 蜜芽亚洲av无码精品色午夜| 最新国产精品无码| 午夜精品久久影院蜜桃 | 中文字幕亚洲精品资源网| 97人妻无码一区二区精品免费| 人妻少妇精品视频一区二区三区| 日本Aⅴ大伊香蕉精品视频| 狠狠色伊人久久精品综合网| 国产99精品一区二区三区免费| 国产精品久久亚洲不卡动漫| 精品久久8x国产免费观看| 久久精品aⅴ无码中文字字幕不卡| 中文字幕精品一区二区三区视频| 久久久久人妻精品一区三寸蜜桃 | 国产第一福利精品导航| 久久国产免费观看精品3| 亚洲国产精品无码久久久不卡| 亚洲国产精品成人| 青青草97国产精品免费观看| 精品人妻伦一二三区久久| 国产精品尹人在线观看| 99re只有精品8中文| 中文字幕成人精品久久不卡| 青青青青久久精品国产h| 久久九九亚洲精品| 中文字幕亚洲精品资源网| 成人午夜精品亚洲日韩| 国产欧美精品一区二区色综合|