十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
今天就跟大家聊聊有關(guān)Java項(xiàng)目如何實(shí)現(xiàn)前后端分離,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)是專業(yè)的兗州網(wǎng)站建設(shè)公司,兗州接單;提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行兗州網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
構(gòu)建springboot項(xiàng)目
我的目錄結(jié)構(gòu):(結(jié)果未按標(biāo)準(zhǔn)書(shū)寫(xiě),僅作說(shuō)明)
不管用什么IDE,最后我們只看pom.xml里的依賴:
為了盡可能簡(jiǎn)單,就不連數(shù)據(jù)庫(kù)了,登陸時(shí)用固定的。
devtools:用于修改代碼后自動(dòng)重啟;
jjwt:加密這么麻煩的事情可以用現(xiàn)成的,查看https://github.com/jwtk/jjwt
org.springframework.boot spring-boot-starter-parent 1.5.2.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-web io.jsonwebtoken jjwt 0.6.0 org.springframework.boot spring-boot-devtools true org.springframework.boot spring-boot-starter-test test
登錄
這里的加密密鑰是:base64EncodedSecretKey
import java.util.Date; import javax.servlet.ServletException; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; @RestController @RequestMapping("/") public class HomeController { @PostMapping("/login") public String login(@RequestParam("username") String name, @RequestParam("password") String pass) throws ServletException { String token = ""; if (!"admin".equals(name)) { throw new ServletException("找不到該用戶"); } if (!"1234".equals(pass)) { throw new ServletException("密碼錯(cuò)誤"); } token = Jwts.builder().setSubject(name).claim("roles", "user").setIssuedAt(new Date()) .signWith(SignatureAlgorithm.HS256, "base64EncodedSecretKey").compact(); return token; } }
測(cè)試token
現(xiàn)在就可以測(cè)試生成的token了,我們采用postman:
過(guò)濾器
這肯定是必須的呀,當(dāng)然,也可以用AOP。
過(guò)濾要保護(hù)的url,同時(shí)在過(guò)濾器里進(jìn)行token驗(yàn)證
token驗(yàn)證:
public class JwtFilter extends GenericFilterBean { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; String authHeader = request.getHeader("Authorization"); if ("OPTIONS".equals(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK); chain.doFilter(req, res); } else { if (authHeader == null || !authHeader.startsWith("Bearer ")) { throw new ServletException("不合法的Authorization header"); } // 取得token String token = authHeader.substring(7); try { Claims claims = Jwts.parser().setSigningKey("base64EncodedSecretKey").parseClaimsJws(token).getBody(); request.setAttribute("claims", claims); } catch (Exception e) { throw new ServletException("Invalid Token"); } chain.doFilter(req, res); } } }
要保護(hù)的url:/user下的:
@SpringBootApplication public class AuthServerApplication { @Bean public FilterRegistrationBean jwtFilter() { FilterRegistrationBean rbean = new FilterRegistrationBean(); rbean.setFilter(new JwtFilter()); rbean.addUrlPatterns("/user/*");// 過(guò)濾user下的鏈接 return rbean; } public static void main(String[] args) { SpringApplication.run(AuthServerApplication.class, args); } }
UserController
這個(gè)是必須經(jīng)過(guò)過(guò)濾才可以訪問(wèn)的:
@RestController @RequestMapping("/user") public class UserController { @GetMapping("/success") public String success() { return "恭喜您登錄成功"; } @GetMapping("/getEmail") public String getEmail() { return "xxxx@qq.com"; } }
關(guān)鍵測(cè)試
假設(shè)我們的Authorization錯(cuò)了,肯定是通不過(guò)的:
當(dāng)輸入剛才服務(wù)器返回的正確token:
允許跨域請(qǐng)求
現(xiàn)在來(lái)說(shuō)前端和后端是兩個(gè)服務(wù)器了,所以需要允許跨域:
@Configuration public class CorsConfig { @Bean public FilterRegistrationBean corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addAllowedMethod("OPTION"); config.addAllowedMethod("GET"); config.addAllowedMethod("POST"); config.addAllowedMethod("PUT"); config.addAllowedMethod("HEAD"); config.addAllowedMethod("DELETE"); source.registerCorsConfiguration("/**", config); FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); bean.setOrder(0); return bean; } @Bean public WebMvcConfigurer mvcConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedMethods("GET", "PUT", "POST", "GET", "OPTIONS"); } }; } }
看完上述內(nèi)容,你們對(duì)Java項(xiàng)目如何實(shí)現(xiàn)前后端分離有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。