diff --git a/api-passenger/src/main/java/com/mashibing/apipassenger/Service/VerificationCodeService.java b/api-passenger/src/main/java/com/mashibing/apipassenger/Service/VerificationCodeService.java index ae6e618..1f501e0 100644 --- a/api-passenger/src/main/java/com/mashibing/apipassenger/Service/VerificationCodeService.java +++ b/api-passenger/src/main/java/com/mashibing/apipassenger/Service/VerificationCodeService.java @@ -3,10 +3,12 @@ package com.mashibing.apipassenger.Service; import com.mashibing.apipassenger.remote.ServicePassengerUserClient; import com.mashibing.apipassenger.remote.ServiceVerificationCodeClient; import com.mashibing.internal.common.constant.CommonStatusEnum; +import com.mashibing.internal.common.constant.IdentityConstant; import com.mashibing.internal.common.dto.ResponseResult; import com.mashibing.internal.common.request.VerificationCodeDTO; import com.mashibing.internal.common.response.NumberCodeResponse; import com.mashibing.internal.common.response.TokenResponse; +import com.mashibing.internal.common.util.JwtUtils; import net.sf.json.JSONObject; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -102,12 +104,12 @@ public class VerificationCodeService { verificationCodeDTO.setPassengerPhone(passengerPhone); servicePassengerUserClient.loginOrRegister(verificationCodeDTO); - // 颁发令牌 - System.out.println("颁发令牌"); + // 颁发令牌,不应用魔法值,用常量 + String token = JwtUtils.generatorToken(passengerPhone, IdentityConstant.PASSENGER_IDENTITY); //响应 TokenResponse tokenResponse = new TokenResponse(); - tokenResponse.setToken("token value"); + tokenResponse.setToken(token); return ResponseResult.success(tokenResponse); } } diff --git a/api-passenger/src/main/java/com/mashibing/apipassenger/controller/TestController.java b/api-passenger/src/main/java/com/mashibing/apipassenger/controller/TestController.java index 4949760..ee8fee5 100644 --- a/api-passenger/src/main/java/com/mashibing/apipassenger/controller/TestController.java +++ b/api-passenger/src/main/java/com/mashibing/apipassenger/controller/TestController.java @@ -1,5 +1,6 @@ package com.mashibing.apipassenger.controller; +import com.mashibing.internal.common.dto.ResponseResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -9,4 +10,23 @@ public class TestController { public String test(){ return "test api passenger"; } + + /** + * 需要有token + * @return + */ + @GetMapping("/authTest") + public ResponseResult authTest(){ + return ResponseResult.success("auth test"); + } + + /** + * 不需要有token,没有token也能正常访问 + * @return + */ + @GetMapping("/noAuthTest") + public ResponseResult noAuthTest(){ + return ResponseResult.success("no auth test"); + } + } diff --git a/api-passenger/src/main/java/com/mashibing/apipassenger/interceptor/InterceptorConfig.java b/api-passenger/src/main/java/com/mashibing/apipassenger/interceptor/InterceptorConfig.java new file mode 100644 index 0000000..4da951e --- /dev/null +++ b/api-passenger/src/main/java/com/mashibing/apipassenger/interceptor/InterceptorConfig.java @@ -0,0 +1,16 @@ +package com.mashibing.apipassenger.interceptor; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +@Configuration +public class InterceptorConfig implements WebMvcConfigurer { + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new JwtInterceptor()) + // 拦截的路径 + .addPathPatterns("/**") + // 不拦截的路径 + .excludePathPatterns("/noAuthTest"); + } +} diff --git a/api-passenger/src/main/java/com/mashibing/apipassenger/interceptor/JwtInterceptor.java b/api-passenger/src/main/java/com/mashibing/apipassenger/interceptor/JwtInterceptor.java new file mode 100644 index 0000000..8ff963e --- /dev/null +++ b/api-passenger/src/main/java/com/mashibing/apipassenger/interceptor/JwtInterceptor.java @@ -0,0 +1,47 @@ +package com.mashibing.apipassenger.interceptor; + +import com.auth0.jwt.exceptions.AlgorithmMismatchException; +import com.auth0.jwt.exceptions.SignatureVerificationException; +import com.auth0.jwt.exceptions.TokenExpiredException; +import com.mashibing.internal.common.dto.ResponseResult; +import com.mashibing.internal.common.util.JwtUtils; +import net.sf.json.JSONObject; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; + +public class JwtInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + boolean result = true; + String resultString = ""; + String token = request.getHeader("Authorization"); + + try { + + JwtUtils.parseToken(token); + }catch(SignatureVerificationException e){ + resultString = "token sign error"; + result = false; + }catch(TokenExpiredException e){ + resultString = "token time out"; + result = false; + }catch(AlgorithmMismatchException e){ + resultString = "token AlgorithmMismatchException"; + result = false; + }catch(Exception e){ + resultString = "token invalid"; + result = false; + } + + if(!result){ + PrintWriter out = response.getWriter(); + out.println(JSONObject.fromObject(ResponseResult.fail(resultString)).toString()); + } + return result; + } +} diff --git a/api-passenger/src/test/java/test/test02.java b/api-passenger/src/test/java/test/Test02.java similarity index 99% rename from api-passenger/src/test/java/test/test02.java rename to api-passenger/src/test/java/test/Test02.java index 4323ac4..ba2e553 100644 --- a/api-passenger/src/test/java/test/test02.java +++ b/api-passenger/src/test/java/test/Test02.java @@ -6,7 +6,7 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Map; -public class test02 { +public class Test02 { @Test public void test01() { int[] arr = {421, 240, 115, 532, 305, 430, 124}; diff --git a/api-passenger/src/test/java/test/Test03.java b/api-passenger/src/test/java/test/Test03.java new file mode 100644 index 0000000..bc24f4d --- /dev/null +++ b/api-passenger/src/test/java/test/Test03.java @@ -0,0 +1,174 @@ +package test; + +import org.junit.Test; + +public class Test03 { + @Test + public void test01(){ + /** + *求n的阶乘 + * 找重复 + * 找变化 + * 找边界 + */ + System.out.println(f1(10)); + } + public int f1(int n){ + if(n == 1){ + return 1; + } + return n * f1(n-1); + } + + @Test + public void test02(){ + /** + * 打印1-10; + */ + f2(1,10); + } + void f2(int i,int j){ + if(i>j){ + return; + } + System.out.println(i); + f2(i+1,j); + } + + int f3(int[] arr,int begin){ + if(begin == arr.length -1){ + return arr[begin]; + } + return arr[begin]+f3(arr,begin+1); + } + + @Test + public void test03(){ + int res = f3(new int[]{1,2,3,4,5},0); + System.out.println(res); + } + + /** + * 翻转字符串 + */ + String reverse(String src,int end){ + if(end ==0){ + return ""+src.charAt(0); + } + return src.charAt(end) + reverse(src,end-1); + } + @Test + public void test04(){ + String str = reverse("abcd",3); + System.out.println(str); + } + + int f5(int n){ + if(n==1 || n==2){ + return 1; + } + return f5(n-1)+f5(n-2); + } + + @Test + public void test05(){ + int result = f5(10); + System.out.println(result); + } + + /** + * 对数组排序 + * 等价于: + * 对数组的0-倒数第二个元素这部分排序 + * 然后把最后一个元素插入这个有序的部分中 + */ + void insertSort(int[] arr,int k){ + if(k==0){ + return; + } + //对前k-1个元素排序 + insertSort(arr,k-1); + //把位置k的元素插入到前面的部分 + int x= arr[k]; + int index = k-1; + while(x high){ + return -1; + } + int mid = low + (high -low)>>1; // (low+high)>>1,防止溢出,移位也更高效 + int midVal = arr[mid]; + if(midVal key){ + return binarySearch(arr,low,high-1,key); + }else { + return mid; + } + } + + @Test + public void test07(){ + int search = binarySearch(new int[]{3, 5, 4, 7, 8, 1}, 0, 5, 4); + System.out.println(search); + } + + void shellSort(int[] arr){ + //不断地缩小增量 + for(int interval = arr.length/2;interval>0;interval=interval/2){ + //增量为1的插入排序 + for(int i=interval;i-1 && target < arr[j]){ + arr[j+interval] =arr[j]; + j-=interval; + } + arr[j+interval] =target; + } + } + } +} diff --git a/api-passenger/src/test/java/test/Test04.java b/api-passenger/src/test/java/test/Test04.java new file mode 100644 index 0000000..ef24680 --- /dev/null +++ b/api-passenger/src/test/java/test/Test04.java @@ -0,0 +1,268 @@ +package test; + +import org.junit.Test; + +import java.util.Hashtable; +import java.util.Map; +import java.util.TreeMap; + +public class Test04 { + + /** + * 1.两数之和 + * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。 + * 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 + */ + @Test + public void test01(){ + int[] result = new int[2]; + int[] str = new int[]{2,7,8,69}; + int target =9; + for(int i=0;i map = new Hashtable<>(); + for(int i=0;i n0,有 0< f(n) <= cg(n)} + * O(n) = 2n^2 + n + 5 + * O(g(n)),表示这个算法是有一个渐进上届的,这个渐进上界为g(n),算法的运行时间f(n)趋近并小于等于这个g(n) + */ + + /** + * 2.两数相加 + * 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 + * 请你将两个数相加,并以相同形式返回一个表示和的链表。 + * 你可以假设除了数字0之外,这两个数都不会以0开头。 + * + */ + + void print(int num){ + for(int i =31;i>= 0;i--){ + System.out.print((num & (1<= 0;end--){ + // 0~ end 干一陀事情 + // 0 1 1 2 2 3 3 4 4 5 end-1 end + for(int second =1;second <= end;second++){ + if(arr[second -1]> arr[second]){ + swap(arr,second -1,second); + } + } + } + } + + @Test + public void test09(){ + int[] arr= {7,1,3,5,1,6,8,1,3,5,7,5,6}; + printArray(arr); + insertSort(arr); + printArray(arr); + } + + void insertSort(int[] arr) { + if(arr == null || arr.length <2){ + return; + } + // 0~0完成 + //0~1 + //0~2 + //0~3 + //0~n-1 + int n = arr.length; + for(int end = 1;end =0 && arr[newNumIndex-1]>arr[newNumIndex]){ + swap(arr,newNumIndex -1,newNumIndex); + newNumIndex--; + } + } + } + + + @Test + public void test10(){ + int[] arr= {7,1,3,5,1,6,8,1,3,5,7,5,6}; + printArray(arr); + insertSort1(arr); + printArray(arr); + } + + void insertSort1(int[] arr) { + if(arr == null || arr.length <2){ + return; + } + // 0~0完成 + //0~1 + //0~2 + //0~3 + //0~n-1 + int n = arr.length; + for(int end = 1;end =0 && arr[pre]>arr[pre+1];pre--){ + swap(arr,pre,pre+1); + } + } + } + @Test + public void test11(){ + new RangeSum(new int[]{4,5,6,7,7,8}); + System.out.println(RangeSum.rangeSum(1, 3)); + } + +} +class RangeSum{ + private static int[] preSum; + + public RangeSum(int[] array){ + int n = array.length; + preSum = new int[n]; + preSum[0] = array[0]; + for(int i=1;i map){ + public static String generatorToken(String passengerPhone,String identity){ + Map map =new HashMap<>(); + map.put(JWT_KEY_PHONE,passengerPhone); + map.put(JWT_KEY_IDENTITY,identity); //token过期时间 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DATE,1); @@ -32,12 +42,23 @@ public class JwtUtils { } //解析token + public static TokenResult parseToken(String token){ + DecodedJWT verify = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token); + String phone = verify.getClaim(JWT_KEY_PHONE).toString(); + String identity = verify.getClaim(JWT_KEY_IDENTITY).toString(); + + TokenResult tokenResult = new TokenResult(); + tokenResult.setPhone(phone); + tokenResult.setIdentity(identity); + + return tokenResult; + } public static void main(String[] args) { - Map map = new HashMap<>(); - map.put("name","zhangsan"); - map.put("age","18"); - String s = generatorToken(map); + String s = generatorToken("13571876296","1"); System.out.println("生成的token:"+s); + TokenResult tokenResult = parseToken(s); + System.out.println("手机号:"+tokenResult.getPhone()); + System.out.println("身份:"+tokenResult.getIdentity()); } } diff --git a/internal-common/target/classes/com/mashibing/internal/common/util/JwtUtils.class b/internal-common/target/classes/com/mashibing/internal/common/util/JwtUtils.class index 2076d72..a64fd0d 100644 Binary files a/internal-common/target/classes/com/mashibing/internal/common/util/JwtUtils.class and b/internal-common/target/classes/com/mashibing/internal/common/util/JwtUtils.class differ