1. 程式人生 > >關於webservice,做為服務端,解析basic使用者名稱和密碼的問題

關於webservice,做為服務端,解析basic使用者名稱和密碼的問題

作為服務端,不可能接受任何人的資料。basic認證是一種很好的方式。

具體程式碼就不細說了,比較簡單。但是不知道相關方法還是很頭疼的。下面看程式碼:

下面是有認證的headers

Headers: {accept-encoding=[gzip,deflate], Authorization=[Basic MTIzOjEyMw==], connection=[Keep-Alive], Content-Length=[3015], content-type=[text/xml;charset=UTF-8], host=[localhost:8080], SOAPAction=["http://api.bd.ifws.cms.huiju.com/syncBdMm"], user-agent=[Apache-HttpClient/4.1.1 (java 1.5)]}

下面是對headers解析解密的過程

@Component
public class ServiceAuthInterceptor  extends AbstractPhaseInterceptor<Message> {

    private static final Logger logger = LoggerFactory.getLogger(ServiceAuthInterceptor.class);

    @Autowired
    private ApplicationProperties applicationProperties;

    public ServiceAuthInterceptor() {
    /super表示顯示呼叫父類有引數的構造器
    //顯示呼叫父類構造器,程式將不會隱式呼叫父類無參的構造器。
    //---父類構造器裡方法AbstractPhaseInterceptor(String phase)
    //---phase是指一個攔截階段
    //---CXF文件裡有Phase類,這個類裡有各個階段
    //該攔截器將會在"呼叫之前"攔截Soap訊息。
        super(Phase.PRE_INVOKE);
    }
    @Override
    public void handleMessage(Message message) throws Fault {
        String configUsername = applicationProperties.getWebService().getServiceUsername();
        String configPassword = applicationProperties.getWebService().getServicePassword();
        if(HuijuStringUtil.isEmpty(configUsername)
                || HuijuStringUtil.isEmpty(configPassword)){
            logger.info("WebService服務端接收身份校驗跳過,原因:未配置接收端使用者名稱或密碼。");
        }else{

            String baseAuth = null;
            Map<String, List<String>> reqHeaders
                    = CastUtils.cast((Map<?, ?>) message.get(Message.PROTOCOL_HEADERS));
            if (reqHeaders != null) {
                for (Map.Entry<String, List<String>> e :
                        reqHeaders.entrySet()) {
                    if ("Authorization".equalsIgnoreCase(e.getKey()))
                        baseAuth = e.getValue().get(0);
                }
            }
            if ((baseAuth != null) && baseAuth.startsWith("Basic ")) {
                byte[] base64Token;
                try {
                    base64Token = baseAuth.substring(6).getBytes("UTF-8");
                    String token = new String(Base64.decodeBase64(base64Token),
                            "UTF-8");
                    String username = "";
                    String password = "";
                    int delim = token.indexOf(":");
                    if (delim != -1) {
                        username = token.substring(0, delim);
                        password = token.substring(delim + 1);
                    }
                    if(configUsername.equals(username)
                            &&configPassword.equals(password)){
                       logger.info("使用者名稱:%s\n密 碼:%s\n", username, password);
                    }else{
                        throw new Exception("使用者名稱、密碼不符。");
                    }
                } catch (Exception e) {
                    logger.error("WebService服務端接收身份校驗失敗,原因:" + e.getMessage());
                    throw new Fault(e);
                }
            }else{
                throw new Fault(new Exception("WebService服務端接收身份校驗失敗,原因:使用者密碼無效。"));
            }
        }
    }

這就是全過程。困擾了好久,也是在網上亂七八糟的找了好多資料。注意這是做為服務端接受資料。