springboot系列(一):初次使用與登錄驗(yàn)證實(shí)現(xiàn)

寫在前面:不逼自己一把,都不知道自己還有裝逼的潛能!

聽說過很多springboot如何流行,以及如何簡化了我們的應(yīng)用開發(fā),卻沒有真正使用過springboot,現(xiàn)在終于要動手了!打算自己動手的這個項(xiàng)目,結(jié)果不會是促成某個真正的項(xiàng)目,學(xué)習(xí)為主,把學(xué)習(xí)過程分享出來。開篇探索以以下兩個方面為主:

1、從mvc經(jīng)典框架到springboot

2、最原始的方式實(shí)現(xiàn)登錄驗(yàn)證

一、建一個使用springboot的項(xiàng)目

springboot是建立在的spring生態(tài)的基礎(chǔ)上的,以前看spring的時候,有兩大概念是糾結(jié)了很久的,IOC(控制反轉(zhuǎn))以及AOP(面向切面的編程)。其實(shí)控制反轉(zhuǎn)就是依賴注入,spring提供了一個IOC容器來初始化對象,解決對象間依賴管理和對象的使用,如@Bean、@Autowired等可以實(shí)現(xiàn)依賴注入,AOP目前理解是在一些日志框架場景中用到。

平時我們常見的web項(xiàng)目開發(fā),使用的mvc框架、maven管理在springboot依然使用到,springboot最明顯的好處是簡化了新建一個項(xiàng)目時的各種配置過程,就連tomcat都不用配置了??梢钥吹轿倚陆ㄒ粋€maven項(xiàng)目大目錄結(jié)構(gòu)是這樣的

跟著上圖目錄結(jié)構(gòu),我們來看看springboot是如何完成一個普通的web項(xiàng)目所需要做的事的

a.web容器:springboot內(nèi)嵌了Tomcat,我們不需要手動配置tomcat以及以war包形式部署項(xiàng)目,啟動入口為目錄中App.java中的main函數(shù),直接運(yùn)行即可。

@SpringBootApplication

public classApp {

public static voidmain(String[] args) {

SpringApplication.run(App.class,args);

}

}

b.依賴管理:spring提供了一系列的starter pom來簡化Maven的依賴加載,如一個web項(xiàng)目pom.xm部分配置如下:

org.springframework.boot

spring-boot-starter-parent

1.4.3.RELEASE


org.springframework.boot

spring-boot-starter


org.springframework.boot

spring-boot-starter-web

c.配置管理:目錄中src/main/resource/application.properties為配置文件,springboot可以自動讀取,或者使用java配置可以看到?jīng)]有web.xm,沒有spring相關(guān)的配置文件,整個項(xiàng)目看起來非常的簡潔。

#數(shù)據(jù)庫配置

spring.datasource.url=jdbc:mysql://localhost:3306/world?characterEncoding=UTF-8&useUnicode=true

spring.datasource.username=darren

spring.datasource.password=darren123

spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.jpa.properties.hibernate.hbm2ddl.auto=update

一個springboot web項(xiàng)目大概就包含這些

二、原始方式實(shí)現(xiàn)登錄驗(yàn)證

流程為:登錄頁面發(fā)起請求-->攔截器攔截匹配的url判斷session-->后臺驗(yàn)證/設(shè)置session-->返回

a、這里主要通過自定義攔截器的方式,繼承WebMvcConfigurerAdapter和HandlerInterceptorAdapter來實(shí)現(xiàn)攔截器對登錄請求進(jìn)行攔截和session的判斷,我這里都寫在WebSecurityConfig.java中

其中WebMvcConfigurerAdapter是Spring提供的基礎(chǔ)類,可以通過重寫 addInterceptors 方法添加注冊攔截器來組成一個攔截鏈,以及用于添加攔截規(guī)則和排除不用的攔截,如下:

public void? addInterceptors(InterceptorRegistry registry){

InterceptorRegistration addInterceptor = registry.addInterceptor(getSecurityInterceptor());

addInterceptor.excludePathPatterns("/error");

addInterceptor.excludePathPatterns("/login**");

addInterceptor.addPathPatterns("/**");

}

其中HandlerInterceptorAdapter是spring mvc提供的適配器,繼承此類,可以非常方便的實(shí)現(xiàn)自己的攔截器,它有三個方法:preHandle、postHandle、afterCompletion。preHandle在業(yè)務(wù)處理器處理請求之前被調(diào)用。預(yù)處理,可以進(jìn)行編碼、安全控制等處理;postHandle在業(yè)務(wù)處理器處理請求執(zhí)行完成后,生成視圖之前執(zhí)行。afterCompletion在DispatcherServlet完全處理完請求后被調(diào)用,可用于清理資源等。我項(xiàng)目中只重寫了preHandle,對請求進(jìn)行session判斷和跳轉(zhuǎn)到自定義的頁面,如下:

private class SecurityInterceptor extends HandlerInterceptorAdapter{

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws IOException {

HttpSession session = request.getSession();

//? ? ? ? ? ? 判斷是否已有該用戶登錄的session

if(session.getAttribute(SESSION_KEY) != null){

return true;

}

//? ? ? ? ? ? 跳轉(zhuǎn)到登錄頁

String url = "/login";

response.sendRedirect(url);

return false;

}

}

b.controller中對登錄請求進(jìn)行驗(yàn)證以及頁面的跳轉(zhuǎn),如下

@Controller

public class LoginController {

@Autowired

private LoginService loginService;

@GetMapping("/")

public String index(@SessionAttribute(WebSecurityConfig.SESSION_KEY)String account,Model model){

return "index";

}

@GetMapping("/login")

public String login(){

return "login";

}

@PostMapping("/loginVerify")

public String loginVerify(String username,String password,HttpSession session){

User user = new User();

user.setUsername(username);

user.setPassword(password);

boolean verify = loginService.verifyLogin(user);

if (verify) {

session.setAttribute(WebSecurityConfig.SESSION_KEY, username);

return "index";

} else {

return "redirect:/login";

}

}

@GetMapping("/logout")

public String logout(HttpSession session){

session.removeAttribute(WebSecurityConfig.SESSION_KEY);

return "redirect:/login";

}

controller代碼解釋:loginVerify是對登錄請求到數(shù)據(jù)庫中進(jìn)行驗(yàn)證用戶名和密碼,驗(yàn)證通過以后設(shè)置session,否則跳轉(zhuǎn)到登錄頁面。@GetMapping是一個組合注解,是@RequestMapping(method = RequestMethod.GET)的縮寫,@PostMapping同理。

ps:實(shí)際項(xiàng)目登錄驗(yàn)證會使用登錄驗(yàn)證框架:spring security 、shiro等,以及登錄過程密碼加密傳輸保存等,這里僅僅用于了解。

附完整源代碼:http://pan.baidu.com/s/1o7Rk72q

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容