토큰 기반 SSM 로그인 인증

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)을 ; 
        } 
    } 

}

 

의심스러운 경우주의하시기 바랍니다

추천

출처www.cnblogs.com/dzcici/p/11670952.html