server: ssl: key-store: classpath:key/rsakey.jks key-store-password: 123456 key-store-type: JKS key-alias: tomcatjks urls: /* port: 8443 non-ssl-port: 8080
1.Http请求工具类
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URL; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSession; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import org.json.JSONObject; public class HttpsGetData { private static class TrustAnyTrustManager implements X509TrustManager { public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[] {}; } } private static class TrustAnyHostnameVerifier implements HostnameVerifier { public boolean verify(String hostname, SSLSession session) { return true; } } /** * 返回的结果是字符串格式 * url:请求url * hearderKey:请求消息头ke值 * headerValue:请求消息头key对应的value值 * requestMethod:请求方式 * param:json请求参数 */ public String Do(String url,String hearderKey,String headerValue,String requestMethod,String param) throws Exception { String result = ""; BufferedReader in = null; try { System.out.println("请求的URL为:"+url); SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, new TrustManager[] { new TrustAnyTrustManager() },new java.security.SecureRandom()); URL realUrl = new URL(url); // 打开URL连接 HttpsURLConnection connection = (HttpsURLConnection) realUrl.openConnection(); // 设置https相关属性 connection.setSSLSocketFactory(sc.getSocketFactory()); connection.setHostnameVerifier(new TrustAnyHostnameVerifier()); connection.setDoOutput(true); connection.setDoInput(true); // 设置通用的请求属性 connection.setRequestProperty("Content-Type", " application/json"); connection.setRequestProperty("Connection", "keep-alive"); connection.setRequestProperty(hearderKey, headerValue);//基于base基本认证 connection.setRequestMethod(requestMethod); // 建立实际的连接 connection.connect(); // 添加请求参数 if(StringUtil.isNotEmpty(param)){ OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); writer.write(param); writer.flush(); } // 读取URL的响应结果 in = new BufferedReader(new InputStreamReader(connection.getInputStream(),"UTF-8")); String line; while ((line = in.readLine()) != null) { result += line; } System.out.println("获取的结果为:"+result); } catch (Exception e) { System.out.println("发送请求出现异常!" + e); throw e; } // 使用finally块来关闭输入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { //e2.printStackTrace(); throw e2; } } return result; } }
2.接口服务编写
@SuppressWarnings("unchecked") @RequestMapping(value="/getCatHosOrg",method=RequestMethod.POST) @ApiOperation(value="xxxxxx查询") public ResponseData<CatHosOrgEntity> getCatHosOrg(@RequestBody(required=false) CatHosOrgEntity catHosOrgEntity, @RequestParam(defaultValue="1",required=false) int page, @RequestParam(defaultValue="15",required=false) int size, ComebakColumn comBak){ QueryParams<xxxx> params = new QueryParams<xxxxx>(); Page pageSize = new Page(); pageSize.setPages(page); pageSize.setPageSize(size); params.setPaging(pageSize); params.setEntity(catHosOrgEntity); try { List<xxxx> catHosOrgList = this.catHosOrgService.queryEntityPage(params); jsonObjects = new ArrayList<JSONObject>(); if(comBak.getList() != null && comBak.getList().size() >0){ for(CatHosOrgEntity catHosOrgEntitys:catHosOrgList){ jsonObject = new JSONObject(); for(Field field:catHosOrgEntitys.getClass().getDeclaredFields()){ for(String list:comBak.getList()){ if(field.getName().equals(list)){ Method method = CatHosOrgEntity.class.getMethod("get"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1)); jsonObject.put(field.getName(),(Object)method.invoke(catHosOrgEntitys)); } } } jsonObjects.add(jsonObject); } return success(jsonObjects); }else { return success(catHosOrgList); } } catch (Exception e) { // TODO: handle exception return error("xxx查询"); } }
3.拦截器定义
/** * 对请求用户进行拦截 * @author */ public class MvcInteractor implements HandlerInterceptor{ protected Logger log = LoggerFactory.getLogger(MvcInteractor.class); @SuppressWarnings("all") @Override public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception { boolean flag = false; String token = request.getHeader("Authorization").substring(7); @SuppressWarnings("restriction") BASE64Encoder encoder = new BASE64Encoder(); response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); PrintWriter out = null; JSONObject res = new JSONObject(); ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext()); JdbcTemplate jt = (JdbcTemplate) ac.getBean("jdbcTemplate"); AppInfoRepository ap = (AppInfoRepository) ac.getBean("appInfoRepository"); //获取用户信息 try { AppInfo appInfo = ap.findByAppId(request.getParameter("account").toString()); log.info("认证地址:"+request.getServerName()); log.info("认证端口:"+request.getServerPort()); // token验证地址 String tokenUrl = "https://"+request.getServerName()+":"+request.getServerPort()+"/oauth/token"; HttpsGetData httpsGetData = new HttpsGetData(); String tokenResult = httpsGetData.Do(tokenUrl+"?grant_type=client_credentials&scope","Authorization","Basic "+encoder.encode((appInfo.getAppId()+":"+appInfo.getAppKey()).getBytes()),"POST",null); // 转成json数据 JSONObject tokenJSon = new JSONObject(tokenResult); if(!tokenJSon.getString("access_token").equals(token)){ res.put("code", "202"); res.put("msg", "该账号无权限访问,请联系管理员!token不匹配!"); out = response.getWriter(); out.append(res.toString()); return flag; } // 判断该APP_ID下面的角色是否有权访问该URL StringBuilder sql = new StringBuilder(500); sql.append("SELECT A.INTERFACE_URL FROM APP_INTERFACE A LEFT JOIN ROLES_URL R ON A.ID = R.APP_INTERFACE_ID LEFT JOIN ROLES S ON R.ROLE_ID = S.ID WHERE S.ID IN ("); sql.append("SELECT B.ID FROM APP_ROLES A JOIN ROLES B ON A.ROLE = B.ID WHERE A.APP_ID = ? )") ; List<String> urlList = jt.query(sql.toString(),new Object[]{appInfo.getAppId()}, new RowMapper<String>() { @Override public String mapRow(ResultSet resultSet, int i) throws SQLException { return resultSet.getString("interface_url"); } }); for(String url:urlList){ if(request.getRequestURL().indexOf(url) > -1){ return true ; } } if(!flag){ res.put("code", "202"); res.put("msg", "该账号无权限访问,请联系管理员!"); out = response.getWriter(); out.append(res.toString()); } } catch (Exception e) { e.getCause(); log.error("该账号无权限访问,请联系管理员!"); } return flag; } @Override public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception { } }
4.测试代码
public static void main(String[] args) throws Exception { //String clientReq = "appId:appKey";//默认客户端ID和客户端秘钥 String client_id="appId";//默认客户端ID String client_secret = "appKey";//默认客户端秘钥 BASE64Encoder encoder = new BASE64Encoder(); BASE64Decoder decoder = new BASE64Decoder(); //String tokenUrl = "https://101.37.25.220:8091/oauth/token?grant_type=client_credentials&scope"; String tokenUrl = "https://localhost:8443/oauth/token"; HttpsGetData httpsGetData = new HttpsGetData(); List<String> list = new ArrayList<String>(); /** * 获取返回的token * 注:请求头为Authorization,值为Basic加空格加client_id:client_secret的Base64编码 */ String tokenResult = httpsGetData.Do(tokenUrl+"?grant_type=client_credentials&scope","Authorization","Basic "+encoder.encode((client_id+":"+client_secret).getBytes()),"POST",null); JSONObject tokenJSon = new JSONObject(tokenResult);//转成json数据 String token = tokenJSon.getString("access_token"); /** * 请求参数为json格式 */ JSONObject paramJson = new JSONObject(); paramJson.put("modifyDate", "2017-10-30"); // paramJson.put("facNameF","江西"); // paramJson.put("convertF","盒"); // paramJson.put("nameCn", "片"); // paramJson.put("smlNameF", "片"); // paramJson.put("normF", "2G"); /** * 返回字段为字符串的list集合 */ list.add("facNameF"); list.add("convertF"); list.add("nameCn"); list.add("smlNameF"); list.add("normF"); String params = (StringUtils.strip(list.toString(), "[]").replaceAll(" ", ""));//删除集合中的空格 /** * 分页 * 默认:page="1";size="15" * 注:请求头为Authorization,值为Bearer加空格加token */ String page = "1"; String size = "10"; // String resultUrl = "https://localhost:8443/api/v1.0/catZxmedProduct/getCatZxmedProduct?page="+page+"&size="+size+"&list="+params+"&account="+client_id; String resultUrl = "https://localhost:8443/api/v1.0/catZxmedProduct/getCatZxmedProductByDate?page="+page+"&size="+size+"&list="+params+"&account="+client_id; //String resultUrl = "https://localhost:8443/api/v1.0/demo/HXUDP0000000000000000000000034?account="+client_id; //注:若无json请求参数,则paramJson = null; httpsGetData.Do(resultUrl,"Authorization","Bearer "+token,"POST",paramJson.toString());//请求获取数据 }