關於webservice,做為服務端,解析basic使用者名稱和密碼的問題
阿新 • • 發佈:2018-12-09
作為服務端,不可能接受任何人的資料。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服務端接收身份校驗失敗,原因:使用者密碼無效。")); } } }
這就是全過程。困擾了好久,也是在網上亂七八糟的找了好多資料。注意這是做為服務端接受資料。