1. 토큰은 무엇입니까
토큰 수단 "토큰"클라이언트 식별 요청으로 서버가 생성, 문자열의 시리즈입니다.
사용자가 처음 로그인 할 때, 서버는 토큰을 생성하고 클라이언트 요청이 단지 사용자 이름과 암호를 다시 가져올 필요없이이 토큰 데이터를 가져 온 후이 토큰은 클라이언트에 반환됩니다.
간단한 구성의 토큰; UID (사용자의 고유 ID), 시간 (현재 시간의 타임 스탬프), 기호 (서명, 특정 길이로 압축 할 수 해싱 알고리즘의 처음 몇 토큰 16 진수 문자열입니다. ) 누설 토큰을 방지
2, SSM XML 기반 구성
pom.xml 파일 소개
<! - 토큰 -> < 의존성 > < 의 groupId > com.auth0 </ 의 groupId > < artifactId를 > 자바 JWT </ artifactId를 > < 버전 > 2.2.0 </ 버전 > </ 의존성 > < 의존성 > < 의 groupId > io.jsonwebtoken </ 의 groupId > < artifactId를 > jjwt </ artifactId를 > <버전 >0.9.0 </ 버전 > </ 의존성 >
스프링 mvc.xml
인터셉터 구성
< MVC : 인터셉터 > <! - bean 정의의 직접 MVC에 정의 된 인터셉터, 사용 : 모든 요청을 차단합니다 루트 인터셉터 아래의 인터셉터를 -> <! - <빈 클래스 = "com.bybo.aca.web합니다. interceptor.Login "/> -> < MVC : 인터셉터 > <! - 절편은 /는 ** 절편 모든 컨트롤러를 의미한다 -> < MVC : 매핑 경로 ="/ ** " /> <! - 하지 절편 -> < MVC 다음 exclude- 매핑 경로를 = "/ 사용자 / 로그인" /> <! - 하지 차단 -> < MVC 다음 exclude- 매핑 경로를 = "/ GET / tableInforAllByStatus" /> < 콩클래스 = "com.baccarat.util.JWTInterceptor" /> </ MVC : 인터셉터 > </ MVC : 인터셉터 >
인터셉터의 엔티티 클래스
패키지 com.baccarat.util; 수입 때 java.io.IOException; 가져 오기 를 java.io.PrintWriter; 수입 java.util.Iterator를; 수입 java.util.Map; 수입 java.util.Map.Entry; 수입 나오는 javax.servlet.http.HttpServletRequest; 수입 의 javax.servlet.http.HttpServletResponse; 수입 org.apache.log4j.Logger; 수입 org.springframework.stereotype.Component; 수입 org.springframework.web.servlet.HandlerInterceptor; 수입 org.springframework.web.servlet.ModelAndView; 수입 com.baccarat.controller.UserController; 수입com.baccarat.entity.User; @Component 공용 클래스 JWTInterceptor은 구현 의 HandlerInterceptor { 공공 정적 로거 로거 = Logger.getLogger (. UserController 클래스 ); 공개 공극 afterCompletion은 (HttpServletRequest의 arg0에서, HttpServletResponse를 ARG1은 오브젝트 ARG2는 예외에서 arg3)이 발생 예외 { // TODO 자동 생성 방법 스텁 } 공공 공극 postHandle은 (HttpServletRequest의 arg0에서, HttpServletResponse를 ARG1은 개체 ARG2는의 ModelAndView에서 arg3)는 슬로우 예외 { //TODO 자동 생성 방법 스텁 } / ** * 토큰 인터셉터의 유효성을 확인 * @author 스티븐 * @time 2019년 10월 11일는 17시 0분 32초은 * * /는 공공 부울 preHandle은 (HttpServletRequest의 요청, HttpServletResponse를 응답, 개체 ARG2)가 발생 IOException가 { ResultVO 결과 = 새로운 ResultVO (); 밖으로의 PrintWriter = 널 (null)을 ; 문자열 토큰 = request.getHeader ( "토큰" ); 문자열 사용자 ID = request.getHeader ( "userId를" ); / **귀하의 처리 로직 * / // 다음 형식을 실시 차단 JSON 요격 반환 후 반환 result.setStatus (203 ) result.setMessage ( "로그인 검증 실패, 다시 로그인하십시오" ); 문자열 jsonStr = BaccaratUtil.toJSon을 (결과 ) response.setCharacterEncoding ( "UTF-8." ) response.setContentType ( "파일 어플리케이션 / JSON; 문자셋 = UTF-8." ); OUT = response.getWriter (); out.append (jsonStr) 반환 거짓 ; } }
JWTUtil.java
패키지 com.baccarat.util; 수입 java.text.SimpleDateFormat에; 수입 java.util.Date; 수입 java.util.HashMap에; 수입 java.util.Map; 수입 org.apache.log4j.Logger; 수입 com.auth0.jwt.JWTSigner; 수입 com.auth0.jwt.JWTVerifier; 수입 com.auth0.jwt.internal.com.fasterxml.jackson.databind.ObjectMapper; 수입 com.baccarat.controller.UserController; 수입 com.baccarat.entity.User; / ** * @todo JWT (JSON 웹 토큰), 폴더의 유틸리티 * @author 스티븐 * @Time 2019년 10월 11일 12시 12분 4초 * / 공공 클래스 JWTUtil { 개인 정적 로거 로거 = Logger.getLogger (UserController. 클래스 ); 개인 정적 최종 문자열 비밀 = "XX을 # $ %의 () (# * () KL <> <MQLMNQNQJQK sdfkjsdrow32234545fdf> N <:!? {LWPW" ; 개인 정적 최종 문자열 EXP = "특급" ; 개인 정적 최종 문자열 페이로드 = "페이로드" ; 개인 정적 SimpleDateFormat의 자위대 = 새로운 SimpleDateFormat의 ( "YYYY-MM-DD HH : MM : SS" ) / ** * @todo 암호화@author 스티븐 * @Time 2019년 10월 11일 12시 12분 44초 * / 공공 정적 <T> 문자열 기호 (T 객체, 긴 MAXAGE) { 시도 { 최종 JWTSigner 서명자 = 새로운 JWTSigner (비밀); 최종 지도 <문자열, 개체> 주장 = 새 의 HashMap <문자열, 개체> (); ObjectMapper 매퍼 = 새로운 ObjectMapper (); 문자열 jsonString = mapper.writeValueAsString (오브젝트); claims.put (PAYLOAD, jsonString); claims.put (EXP,에 System.currentTimeMillis ()+ MAXAGE); 반환 signer.sign (주장); } 캐치 (예외 e)는 { 반환 널 (null)을 ; } } / ** * @todo 복호화, 암호화 토큰 스트링 전달 및 해독 형 * @author 스티븐 * @Time 2019년 10월 11일 12시 13분 8초 * @param JWT, classT * @return의 T * / 공용 정적 <T> T unsign (문자열 JWT 클래스 <T> classT) { 최종 JWTVerifier 검증기 = 새로운JWTVerifier (SECRET); 시도 { 최종 지도 <문자열, 개체> 주장 = verifier.verify (JWT)를; 경우 (claims.containsKey (EXP) && claims.containsKey (PAYLOAD)) { 긴 EXP = (긴) claims.get (EXP); 오래 전에 currentTimeMillis = System.currentTimeMillis는 (); 경우 (EXP> 전에 currentTimeMillis)을 { 문자열 JSON = (문자열) claims.get (PAYLOAD); ObjectMapper objectMapper = 새로운 ObjectMapper (); 반환objectMapper.readValue (JSON, classT); } } 반환 널 (null)을 ; } 캐치 (예외 e)는 { 반환 널 (null)을 ; } } }
의심스러운 경우주의하시기 바랍니다