亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot怎么以FTP方式上傳文件到遠程服務器

發布時間:2021-11-20 10:54:14 來源:億速云 閱讀:137 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關springboot怎么以FTP方式上傳文件到遠程服務器,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

通過筆者前兩篇文章的說明,相信大家已經知道JWT是什么,怎么用,該如何結合Spring Security使用。那么本節就用代碼來具體的實現一下JWT登錄認證及鑒權的流程。

一、環境準備工作

建立Spring Boot項目并集成了Spring Security,項目可以正常啟動

通過controller寫一個HTTP的GET方法服務接口,比如:“/hello”

實現最基本的動態數據驗證及權限分配,即實現UserDetailsService接口和UserDetails接口。這兩個接口都是向Spring Security提供用戶、角色、權限等校驗信息的接口

如果你學習過Spring Security的formLogin登錄模式,請將HttpSecurity配置中的formLogin()配置段全部去掉。因為JWT完全使用JSON接口,沒有from表單提交。

HttpSecurity配置中一定要加上csrf().disable(),即暫時關掉跨站攻擊CSRF的防御。這樣是不安全的,我們后續章節再做處理。

以上的內容,我們在之前的文章中都已經講過。如果仍然不熟悉,可以翻看本號之前的文章。

## 二、開發JWT工具類

通過maven坐標引入JWT工具包jjwt

<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version></dependency>

在application.yml中加入如下自定義一些關于JWT的配置

jwt:  header: JWTHeaderName secret: aabbccdd  expiration: 3600000

其中header是攜帶JWT令牌的HTTP的Header的名稱。雖然我這里叫做JWTHeaderName,但是在實際生產中可讀性越差越安全。

secret是用來為JWT基礎信息加密和解密的密鑰。雖然我在這里在配置文件寫死了,但是在實際生產中通常不直接寫在配置文件里面。而是通過應用的啟動參數傳遞,并且需要定期修改。

expiration是JWT令牌的有效時間。

寫一個Spring Boot配置自動加載的工具類。

@Data@ConfigurationProperties(prefix = "jwt") //配置自動加載,prefix是配置的前綴@Componentpublic class JwtTokenUtil implements Serializable { private String secret; private Long expiration; private String header; /**  * 生成token令牌  *  * @param userDetails 用戶  * @return 令token牌  */ public String generateToken(UserDetails userDetails) {  Map<String, Object> claims = new HashMap<>(2);  claims.put("sub", userDetails.getUsername());  claims.put("created", new Date());  return generateToken(claims); } /**  * 從令牌中獲取用戶名  *  * @param token 令牌  * @return 用戶名  */ public String getUsernameFromToken(String token) {  String username;  try {   Claims claims = getClaimsFromToken(token);   username = claims.getSubject();  } catch (Exception e) {   username = null;  }  return username; } /**  * 判斷令牌是否過期  *  * @param token 令牌  * @return 是否過期  */ public Boolean isTokenExpired(String token) {  try {   Claims claims = getClaimsFromToken(token);   Date expiration = claims.getExpiration();   return expiration.before(new Date());  } catch (Exception e) {   return false;  } } /**  * 刷新令牌  *  * @param token 原令牌  * @return 新令牌  */ public String refreshToken(String token) {  String refreshedToken;  try {   Claims claims = getClaimsFromToken(token);   claims.put("created", new Date());   refreshedToken = generateToken(claims);  } catch (Exception e) {   refreshedToken = null;  }  return refreshedToken; } /**  * 驗證令牌  *  * @param token  令牌  * @param userDetails 用戶  * @return 是否有效  */ public Boolean validateToken(String token, UserDetails userDetails) {  SysUser user = (SysUser) userDetails;  String username = getUsernameFromToken(token);  return (username.equals(user.getUsername()) && !isTokenExpired(token)); } /**  * 從claims生成令牌,如果看不懂就看誰調用它  *  * @param claims 數據聲明  * @return 令牌  */ private String generateToken(Map<String, Object> claims) {  Date expirationDate = new Date(System.currentTimeMillis() + expiration);  return Jwts.builder().setClaims(claims)       .setExpiration(expirationDate)       .signWith(SignatureAlgorithm.HS512, secret)       .compact(); } /**  * 從令牌中獲取數據聲明,如果看不懂就看誰調用它  *  * @param token 令牌  * @return 數據聲明  */ private Claims getClaimsFromToken(String token) {  Claims claims;  try {   claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();  } catch (Exception e) {   claims = null;  }  return claims; }}

上面的代碼就是使用io.jsonwebtoken.jjwt提供的方法開發JWT令牌生成、刷新的工具類。

三、開發登錄接口(獲取Token的接口)

"/authentication"接口用于登錄驗證,并且生成JWT返回給客戶端"/REFRESHTOKEN"接口用于刷新JWT,更新JWT令牌的有效期@RESTCONTROLLERPUBLIC CLASS JWTAUTHCONTROLLER {  @RESOURCE  PRIVATE JWTAUTHSERVICE JWTAUTHSERVICE;  @POSTMAPPING(VALUE = "/AUTHENTICATION")  PUBLIC AJAXRESPONSE LOGIN(@REQUESTBODY MAP<STRING, STRING> MAP) {    STRING USERNAME = MAP.GET("USERNAME");    STRING PASSWORD = MAP.GET("PASSWORD");    IF (STRINGUTILS.ISEMPTY(USERNAME) || STRINGUTILS.ISEMPTY(PASSWORD)) {      RETURN AJAXRESPONSE.ERROR(        NEW CUSTOMEXCEPTION(CUSTOMEXCEPTIONTYPE.USER_INPUT_ERROR,"用戶名密碼不能為空"));    }    RETURN AJAXRESPONSE.SUCCESS(JWTAUTHSERVICE.LOGIN(USERNAME, PASSWORD));  }  @POSTMAPPING(VALUE = "/REFRESHTOKEN")  PUBLIC AJAXRESPONSE REFRESH(@REQUESTHEADER("${JWT.HEADER}") STRING TOKEN) {    RETURN AJAXRESPONSE.SUCCESS(JWTAUTHSERVICE.REFRESHTOKEN(TOKEN));  }}

核心的token業務邏輯寫在JwtAuthService 中

login方法中首先使用用戶名、密碼進行登錄驗證。如果驗證失敗拋出BadCredentialsException異常。如果驗證成功,程序繼續向下走,生成JWT響應給前端

refreshToken方法只有在JWT token沒有過期的情況下才能刷新,過期了就不能刷新了。需要重新登錄。

@Servicepublic class JwtAuthService {  @Resource  private AuthenticationManager authenticationManager;  @Resource  private UserDetailsService userDetailsService;  @Resource  private JwtTokenUtil jwtTokenUtil;  public String login(String username, String password) {    //使用用戶名密碼進行登錄驗證    UsernamePasswordAuthenticationToken upToken =           new UsernamePasswordAuthenticationToken( username, password );    Authentication authentication = authenticationManager.authenticate(upToken);     SecurityContextHolder.getContext().setAuthentication(authentication);    //生成JWT    UserDetails userDetails = userDetailsService.loadUserByUsername( username );    return jwtTokenUtil.generateToken(userDetails);  }  public String refreshToken(String oldToken) {    if (!jwtTokenUtil.isTokenExpired(oldToken)) {      return jwtTokenUtil.refreshToken(oldToken);    }    return null;  }}

因為使用到了AuthenticationManager ,所以在繼承WebSecurityConfigurerAdapter的SpringSecurity配置實現類中,將AuthenticationManager 聲明為一個Bean。并將"/authentication"和 "/refreshtoken"開放訪問權限,如何開放訪問權限,我們之前的文章已經講過了。

@Bean(name = BeanIds.AUTHENTICATION_MANAGER)@Overridepublic AuthenticationManager authenticationManagerBean() throws Exception {  return super.authenticationManagerBean();}

四、接口訪問鑒權過濾器

當用戶第一次登陸之后,我們將JWT令牌返回給了客戶端,客戶端應該將該令牌保存起來。在進行接口請求的時候,將令牌帶上,放到HTTP的header里面,header的名字要和jwt.header的配置一致,這樣服務端才能解析到。下面我們定義一個攔截器:

攔截接口請求,從請求request獲取token,從token中解析得到用戶名

然后通過UserDetailsService獲得系統用戶(從數據庫、或其他其存儲介質)

根據用戶信息和JWT令牌,驗證系統用戶與用戶輸入的一致性,并判斷JWT是否過期。如果沒有過期,至此表明了該用戶的確是該系統的用戶。

但是,你是系統用戶不代表你可以訪問所有的接口。所以需要構造UsernamePasswordAuthenticationToken傳遞用戶、權限信息,并將這些信息通過authentication告知Spring Security。Spring Security會以此判斷你的接口訪問權限。

@Slf4j@Componentpublic class JwtAuthenticationTokenFilter extends OncePerRequestFilter {  @Resource  private MyUserDetailsService userDetailsService;  @Resource  private JwtTokenUtil jwtTokenUtil;  @Override  protected void doFilterInternal(HttpServletRequest request,                  HttpServletResponse response,                  FilterChain chain) throws ServletException, IOException {      // 從這里開始獲取 request 中的 jwt token    String authHeader = request.getHeader(jwtTokenUtil.getHeader());    log.info("authHeader:{}", authHeader);    // 驗證token是否存在    if (authHeader != null && StringUtils.isNotEmpty(authHeader)) {      // 根據token 獲取用戶名      String username = jwtTokenUtil.getUsernameFromToken(authHeader);      if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {        // 通過用戶名 獲取用戶的信息        UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);                // 驗證JWT是否過期        if (jwtTokenUtil.validateToken(authHeader, userDetails)) {          //加載用戶、角色、權限信息,Spring Security根據這些信息判斷接口的訪問權限          UsernamePasswordAuthenticationToken authentication               = new UsernamePasswordAuthenticationToken(userDetails, null,                                    userDetails.getAuthorities());          authentication.setDetails(new WebAuthenticationDetailsSource()                      .buildDetails(request));          SecurityContextHolder.getContext().setAuthentication(authentication);        }      }    }    chain.doFilter(request, response);  }}

在spring Security的配置類(即WebSecurityConfigurerAdapter實現類的configure(HttpSecurity http)配置方法中,加入如下配置:

.sessionManagement()  .sessionCreationPolicy(SessionCreationPolicy.STATELESS)  .and().addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);

因為我們使用了JWT,表明了我們的應用是一個前后端分離的應用,所以我們可以開啟STATELESS禁止使用session。當然這并不絕對,前后端分離的應用通過一些辦法也是可以使用session的,這不是本文的核心內容不做贅述。將我們的自定義jwtAuthenticationTokenFilter,加載到UsernamePasswordAuthenticationFilter的前面。

五、測試一下:

測試登錄接口,即:獲取token的接口。輸入正確的用戶名、密碼即可獲取token。

下面我們訪問一個我們定義的簡單的接口“/hello”,但是不傳遞JWT令牌,結果是禁止訪問。當我們將上一步返回的token,傳遞到header中,就能正常響應hello的接口結果。

以上所述是小編給大家介紹的springboot以FTP方式上傳文件到遠程服務器的流程,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對我們網站的支持!如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

看完上述內容,你們對springboot怎么以FTP方式上傳文件到遠程服務器有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

科尔| 邵阳市| 夏邑县| 大石桥市| 嵊泗县| 兴宁市| 武平县| 进贤县| 灵宝市| 固镇县| 渝中区| 漳浦县| 横山县| 宝坻区| 横峰县| 宜州市| 旅游| 安新县| 重庆市| 祥云县| 伽师县| 南京市| 铜梁县| 轮台县| 青海省| 甘泉县| 当雄县| 日照市| 横峰县| 兴化市| 嘉定区| 吴忠市| 台前县| 霸州市| 扶风县| 龙泉市| 德钦县| 金坛市| 雷州市| 靖州| 厦门市|