亚洲一级电影在线观看,九九精品无码专区免费,亚洲AV无码资源在线观看 ,欧美国产高清

如何創建安全的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

主站蜘蛛池模板: 亚洲国产精品自在拍在线播放蜜臀| 久青草影院在线观看国产| 国产欧美日韩精品综合在线| 亚洲国产成人最新精品| 午夜毛片不卡免费观看视频| 亚洲成av人片在线播放无码 | 乱人伦人妻中文字幕无码久久网| 无码任你躁久久久久久老妇蜜桃| av在线播放日韩亚洲欧我不卡| 国产喷水1区2区3区咪咪爱av | 人妻互换精品一区二区| 欧美日韩一线| 国产在线91精品入口首页| 91久久国产热精品免费| 精品视频福利| 国产精品极品美女自在线网站| 国产精品自产拍在线18禁| 无码精品尤物一区二区三区| 国内精品视频一区二区三区| 久久综合给合久久狠狠97色| 日韩无码电影| 久久精品国产成人| 亚洲成人播放| 国外av片免费看一区二区三区| 理论片午午伦夜理片久久| 99re这里只有国产中文精品国产精品| 午夜精品久久久久久久爽| 亚洲愉拍自拍欧美精品| 国产精品片在线观看手机版| 欧美人与动牲猛交xxxxbbbb | 国产成人无码免费网站| 亚洲中文字幕在线精品一区| 夜夜躁狠狠躁日日躁| 亚洲色大成网站www国产| 国产午夜免费啪视频观看视频| 高清无码在线视频| 91超碰在线精品| 亚洲中文有码字幕日本| 99国产欧美久久久精品| 国产日韩欧美在线播放| 欧美日韩综合在线精品|