SpringBoot攔截器實(shí)現(xiàn)登錄攔截的方法示例
源碼
GitHub:https://github.com/291685399/springboot-learning/tree/master/springboot-interceptor01
SpringBoot攔截器可以做什么
可以對(duì)URL路徑進(jìn)行攔截,可以用于權(quán)限驗(yàn)證、解決亂碼、操作日志記錄、性能監(jiān)控、異常處理等
SpringBoot攔截器實(shí)現(xiàn)登錄攔截
pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath/> </parent> <groupId>com.wyj</groupId> <artifactId>springboot-interceptor01</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-interceptor01</name> <description>springboot攔截器</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!-- springboot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- thymeleaf --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies> <build> <finalName>springboot-interceptor01</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
WebMvcConfigurer:繼承WebMvcConfigurationSupport類(lèi),重寫(xiě)addInterceptors方法
/** * 在springboot2.0.0之后,WebMvcConfigurerAdapter已經(jīng)過(guò)時(shí)了 * 會(huì)使用WebMvcConfigurer或者WebMvcConfigurationSupport替代 * * @author wyj * @create 2019-06-01 21:48 */ @Configuration public class WebMvcConfigurer extends WebMvcConfigurationSupport { /** * 在springboot2.0.0之前繼承WebMvcConfigurerAdapter類(lèi),重寫(xiě)addInterceptors方法 * * @param registry */ // @Override // public void addInterceptors(InterceptorRegistry registry) { // /** // * 攔截器按照順序執(zhí)行,如果不同攔截器攔截存在相同的URL,前面的攔截器會(huì)執(zhí)行,后面的攔截器將不執(zhí)行 // */ // registry.addInterceptor(new AuthorityInterceptor()) // .addPathPatterns("/user/**"); // super.addInterceptors(registry); // } /** * 在springboot2.0.0之后實(shí)現(xiàn)WebMvcConfigurer接口,重寫(xiě)addInterceptors方法 * * @param registry */ // @Override // public void addInterceptors(InterceptorRegistry registry) { // /** // * 攔截器按照順序執(zhí)行,如果不同攔截器攔截存在相同的URL,前面的攔截器會(huì)執(zhí)行,后面的攔截器將不執(zhí)行 // */ // registry.addInterceptor(new AuthorityInterceptor()) // .addPathPatterns("/user/**"); // } /** * 在springboot2.0.0之后繼承WebMvcConfigurationSupport類(lèi),重寫(xiě)addInterceptors方法 * * @param registry */ @Override protected void addInterceptors(InterceptorRegistry registry) { /** * 攔截器按照順序執(zhí)行,如果不同攔截器攔截存在相同的URL,前面的攔截器會(huì)執(zhí)行,后面的攔截器將不執(zhí)行 */ registry.addInterceptor(new AuthorityInterceptor()) .addPathPatterns("/user/**"); super.addInterceptors(registry); } }
AuthorityInterceptor:實(shí)現(xiàn)HandlerInterceptor接口,重寫(xiě)preHandle、postHandle、afterCompletion方法
- preHandle:在請(qǐng)求處理之前進(jìn)行調(diào)用(Controller方法調(diào)用之前)
- postHandle:請(qǐng)求處理之后進(jìn)行調(diào)用,但是在視圖被渲染之前(Controller方法調(diào)用之后)
- afterCompletion:在整個(gè)請(qǐng)求結(jié)束之后被調(diào)用,也就是在DispatcherServlet 渲染了對(duì)應(yīng)的視圖之后執(zhí)行(主要是用于進(jìn)行資源清理工作)
@Slf4j public class AuthorityInterceptor implements HandlerInterceptor { private static final Set<String> NOT_INTERCEPT_URI = new HashSet<>();//不攔截的URI static { NOT_INTERCEPT_URI.add("/user/login.html"); NOT_INTERCEPT_URI.add("/user/login"); } /** * 在請(qǐng)求處理之前進(jìn)行調(diào)用(Controller方法調(diào)用之前) */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { String uri = request.getRequestURI(); if (NOT_INTERCEPT_URI.contains(uri)) { log.info("不攔截" + uri); return true; } log.info("攔截" + uri); HttpSession session = request.getSession(); UserInfo userInfo = (UserInfo) session.getAttribute("user_info_in_the_session"); if (userInfo == null) { throw new RuntimeException("用戶(hù)未登陸"); } return true; } /** * 請(qǐng)求處理之后進(jìn)行調(diào)用,但是在視圖被渲染之前(Controller方法調(diào)用之后) */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv) throws Exception { } /** * 在整個(gè)請(qǐng)求結(jié)束之后被調(diào)用,也就是在DispatcherServlet 渲染了對(duì)應(yīng)的視圖之后執(zhí)行 * (主要是用于進(jìn)行資源清理工作) */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception { } }
UserController:
@Controller @RequestMapping(value = "/user") public class UserController { @RequestMapping(value = "/login.html") public String index() { return "login"; } @RequestMapping(value = "/login") public String login(User user) { //查詢(xún)數(shù)據(jù)庫(kù),我這里直接寫(xiě)死 User dbUser = new User(1, "zhangsan", "123456", "admin"); if (dbUser.getPassword().equals(user.getPassword())) { UserInfo userInfo = new UserInfo(dbUser.getId(), dbUser.getUsername(), dbUser.getRole()); HttpSession session = getRequest().getSession(); session.setAttribute("user_info_in_the_session", userInfo); return "admin"; } return "login"; } @RequestMapping(value = "/userInfo") @ResponseBody public String userInfo() { HttpSession session = getRequest().getSession(); UserInfo userInfo = (UserInfo) session.getAttribute("user_info_in_the_session"); return userInfo.toString(); } private HttpServletRequest getRequest() { return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); } }
User:
@Data @NoArgsConstructor @AllArgsConstructor public class User implements Serializable { private int id; private String username; private String password; private String role; }
UserInfo: 用于存在用戶(hù)信息儲(chǔ)存在session中
@Data @NoArgsConstructor @AllArgsConstructor public class UserInfo implements Serializable { private int id; private String username; private String role; }
login.html:只是一個(gè)很簡(jiǎn)單的登錄表單
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登陸頁(yè)面</title> </head> <body> <form action="/user/login" method="post"> 登陸:<br/> 用戶(hù)名:<input name="username" id="username" type="text"/><br/> 密 碼:<input name="password" id="password" type="password"/><br/> <input type="submit" value="登陸"/> </form> </body> </html>
admin.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首頁(yè)</title> </head> <body> <form action="/user/userInfo" method="get"> <input type="submit" value="用戶(hù)信息"/></form> </body> </html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java8新特性之stream流中reduce()求和知識(shí)總結(jié)
今天帶大家回顧Java8的新特性,文中對(duì)stream流中reduce()求和的相關(guān)知識(shí)作了詳細(xì)的介紹,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05Java開(kāi)發(fā)學(xué)習(xí)之Bean的作用域和生命周期詳解
這篇文章主要介紹了淺談Spring中Bean的作用域,生命周期和注解,從創(chuàng)建到消亡的完整過(guò)程,例如人從出生到死亡的整個(gè)過(guò)程就是一個(gè)生命周期。本文將通過(guò)示例為大家詳細(xì)講講,感興趣的可以學(xué)習(xí)一下2022-06-06SpringBoot打印系統(tǒng)執(zhí)行的sql語(yǔ)句及日志配置指南
這篇文章主要給大家介紹了關(guān)于SpringBoot打印系統(tǒng)執(zhí)行的sql語(yǔ)句及日志配置的相關(guān)資料,在Java SpringBoot項(xiàng)目中如果使用了Mybatis框架,默認(rèn)情況下執(zhí)行的所有SQL操作都不會(huì)打印日志,需要的朋友可以參考下2023-10-10Java連接mysql數(shù)據(jù)庫(kù)以及mysql驅(qū)動(dòng)jar包下載和使用方法
這篇文章主要給大家介紹了關(guān)于Java連接mysql數(shù)據(jù)庫(kù)以及mysql驅(qū)動(dòng)jar包下載和使用方法,MySQL是一款常用的關(guān)系型數(shù)據(jù)庫(kù),它的JDBC驅(qū)動(dòng)程序使得我們可以通過(guò)Java程序連接MySQL數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)操作,需要的朋友可以參考下2023-11-11Java開(kāi)發(fā)環(huán)境配置教程(win7 64bit)
這篇文章主要為大家詳細(xì)介紹了win7 64bit下Java開(kāi)發(fā)環(huán)境的配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08SpringBoot的HandlerInterceptor中依賴(lài)注入為null問(wèn)題
這篇文章主要介紹了SpringBoot的HandlerInterceptor中依賴(lài)注入為null問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Java解析Excel文件并把數(shù)據(jù)存入數(shù)據(jù)庫(kù)
本篇文章主要介紹了Java解析Excel文件并把數(shù)據(jù)存入數(shù)據(jù)庫(kù) ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05詳解JAVA 線(xiàn)程-線(xiàn)程的狀態(tài)有哪些?它是如何工作的?
這篇文章主要介紹了詳解JAVA 線(xiàn)程的的相關(guān)資料,文中講解非常細(xì)致,源碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以參考下2020-06-06