中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      如何創建安全的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一区二区三区| 中文字幕麻豆一区二区| 青青自拍三级视频一区| 久草国产手机视频在线观看| 亚洲一区二区免费日韩| 在线高清免费不卡视频| 宁国市| 平乐县| 玛纳斯县| 国产颜射视频在线播放| 一片内射视频在线观看| 亚洲福利第一页在线观看| 久久久久久国产福利网站| 日韩不卡av在线一区二区三区| 杨幂国产精品一区二区| 国产av乳头久久一区| 国产美女久久久亚洲综合| 亚洲区福利视频免费看| 阳高县| 日本少妇精品一区二区| 日韩精品夜色二区91久久久| 北流市| 午夜无码国产18禁| 最新国产精品精品视频| 亚洲精品中文字幕无乱码麻豆 | 福利网在线| 亚洲欧洲国无码| 巨臀精品无码AV在线播放| 国产主播一区二区在线观看| 亚洲嫩模尤物大尺度高清人体| 激情视频在线观看国产中文| 精品人妻丰满久久久a|