Spring MVC 攔截器實現(xiàn)登錄
上篇博文我在博客中講到如何使用spring MVC框架來實現(xiàn)文件的上傳和下載,今天小錢給大家再來分享和介紹Spring MVC框架中相當(dāng)重要的一塊功能——攔截器。
關(guān)于攔截器的概念我在這里就不多說了,大家可以上網(wǎng)百度或者看別人寫的具體博客,我今天要說的是攔截器在實際開發(fā)中它有什么作用,怎樣用Spring MVC攔截器來實現(xiàn)可拔插方式管理各種功能。Interceptor攔截器,它的主要作用就是攔截用戶的請求并進行相應(yīng)的處理。什么意思呢?比如說:通過攔截器來進行用戶的權(quán)限驗證,或者是用來判斷用戶是否已經(jīng)登錄等。
Spring MVC攔截器是可拔插式的設(shè)計。如果需要某個攔截器,只需要在配置文件中應(yīng)用該攔截器即可,如果不需要使用攔截器,只需要在配置文件中取消其應(yīng)用攔截器。不管是否應(yīng)用某個攔截器,對Spring MVC框架不會有任何的影響。本文將介紹HandlerInterceptor接口和演示“Spring MVC攔截器實現(xiàn)用戶權(quán)限驗證”項目案例來學(xué)習(xí)、掌握攔截器。
本項目源碼下載:Spring MVC攔截器實現(xiàn)用戶權(quán)限驗證
HandlerInterceptor接口
Spring MVC中的Interceptor攔截器攔截的請求是通過實現(xiàn)HandlerInterceptor接口來完成的。在Spring MVC中定義一個Interceptor攔截器非常簡單,通過在要定義的Interceptor攔截器類中實現(xiàn)Spring的HandlerInterceptor接口,或是繼承抽象類HandlerInterceptorAdapter。
HandlerInterceptor接口定義了三個方法,Spring MVC就是通過這三個方法來對用戶的請求進行攔截處理的,下面對這三個方法進行具體的詳解:
(1)boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handle)。顧名思義,這個方法將在請求處理之前被調(diào)用。Spring MVC中的Interceptor實行的是鏈?zhǔn)秸{(diào)用,即在一個應(yīng)用中或者說在一個請求中可以同時存在多個Interceptor。每個Interceptor的調(diào)用會依據(jù)它的聲明順序依次執(zhí)行,而且最先執(zhí)行的是Interceptor中的preHandle方法,所以可以在這個方法中進行一些前置的初始化操作或者是對當(dāng)前請求的一個預(yù)處理,也可以在這個方法中進行一些判斷來決定請求是否要繼續(xù)進行下去。該方法的返回值是boolean類型的,當(dāng)返回值為FALSE時,表示請求結(jié)束,后續(xù)的Interceptor和Controller都不會再執(zhí)行;當(dāng)返回值為TRUE時就會繼續(xù)調(diào)用下一個Interceptor的preHandle方法;如果已經(jīng)是最后一個Interceptor,就會調(diào)用當(dāng)前請求的Controller方法。
(2)void postHandle(HttpServletRequest request,HttpServletResponse response,Object handler,ModelAndView mv)。該方法和之后的afterCompletion方法都只能在當(dāng)前所屬的Interceptor的preHandle方法的返回值為TRUE時才能被調(diào)用。postHandle方法,顧名思義,就是在當(dāng)前請求被處理之后,也就是Controller方法被調(diào)用之后執(zhí)行,但是它會在DispatcherServlet進行視圖返回渲染之前被調(diào)用,所以我們可以在這個方法中對Controller處理之后的ModelAndView對象進行操作。postHandle方法被調(diào)用的方向跟preHandle是相反的,也就是說先聲明的Interceptor的postHandle方法反而會后執(zhí)行,這和Struts2里面的Interceptor的執(zhí)行過程類似。
(3)void afterCompletion(HttpServletRequest request,HttpServletResponse response,Object handler,Exception exception)。 該方法也是在當(dāng)前所屬的Interceptor的preHandle方法的返回值為TRUE時才會執(zhí)行。顧名思義,該方法將在這個請求結(jié)束之后,也就是在DispatcherServlet渲染了對應(yīng)的視圖之后執(zhí)行。這個方法的主要作用就是進行資源整理。
攔截器實現(xiàn)用戶權(quán)限驗證
本文將通過Spring MVC攔截器完成一個用戶權(quán)限驗證的功能。即用戶必須登錄之后才可以訪問這個web網(wǎng)站的首頁,如果沒有登錄就直接訪問網(wǎng)站首頁,則攔截器會攔截請求,并將請求重新轉(zhuǎn)發(fā)到登錄頁面,同時提示用戶“需要先登錄再訪問網(wǎng)站”,由于是演示案例,所以成功登錄之后的網(wǎng)站頁面我們直接是拼的一個網(wǎng)頁顯示給用戶。本項目作為測試案例,我就不創(chuàng)建Maven項目了,直接創(chuàng)建的是一個Dynamic Web Project(動態(tài)的web項目),項目名稱為:Interceptor,本項目采用Tomcat 8作為web服務(wù)器,我們需要在項目中引入以下jar包,jar包我就截圖演示了,附件源碼中l(wèi)ib文件夾下會有,這里直接給一個項目的目錄結(jié)構(gòu),如下圖:
首先呢,我們要做一個網(wǎng)頁,這個網(wǎng)頁就是用來提示用戶的登錄信息,提示輸入用戶名和密碼,在此我們在項目的WebContent/WEB-INF/content文件夾中創(chuàng)建一個loginForm.jsp,這是一個jsp文件,具體代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登錄頁面</title>
</head>
<body>
<h2>用于演示攔截器登錄頁面</h2>
<form action="login" method="post">
<!-- 提示信息 -->
<font color="red">${requestScope.message }</font>
<table>
<tr>
<td><label>登錄名: </label></td>
<td><input type="text" id="loginname" name="loginname" ></td>
</tr>
<tr>
<td><label>密碼: </label></td>
<td><input type="password" id="password" name="password" ></td>
</tr>
<tr>
<td><input type="submit" value="登錄"></td>
</tr>
</table>
</form>
</body>
</html>
這時我們需要進行處理/login的請求,我們需要寫請求的功能代碼,在src目錄下創(chuàng)建“cn.edu.jit.controller”包,在創(chuàng)建一個UserController類,用來處理用戶請求。具體代碼如下:
package cn.edu.jit.controller;
import javax.servlet.http.HttpSession;
import cn.edu.jit.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* 處理用戶請求控制器
*/
@Controller
public class UserController {
/**
* 處理/login請求
*/
@RequestMapping(value="/login")
public ModelAndView login(String loginname,String password,ModelAndView mv,HttpSession session) {
//模擬數(shù)據(jù)庫根據(jù)登錄名和密碼查找用戶,判斷用戶登錄
if(loginname != null && loginname.equals("錢春華")
&& password
!= null
&& password.equals("123456")) {
//模擬創(chuàng)建用戶
User user = new User();
user.setLoginname(loginname);
user.setPassword(password);
user.setUsername("錢春華");
//登錄成功,將user對象設(shè)置到HttpSession作用范圍域
session.setAttribute("user", user);
//轉(zhuǎn)發(fā)到main請求
mv.setViewName("redirect:main");
} else {
//登錄失敗,設(shè)置失敗提示信息,并跳轉(zhuǎn)到登錄頁面
mv.addObject("message", "登錄名或密碼錯誤,請重新輸入!");
mv.setViewName("loginForm");
}
return mv;
}
}
UserControlle類的login方法用來處理登錄的請求,本項目沒有使用數(shù)據(jù)庫存儲數(shù)據(jù),只是簡單的模擬了用戶的登錄,只要用戶輸入登錄名是“錢春華”,密碼是“123456”,則驗證通過,并創(chuàng)建一個User對象保存到HttpSession當(dāng)中,同時將請求使用客戶端跳轉(zhuǎn)到main請求:如果登錄失敗提示信息到ModelAndView對象,同時將請求使用客戶端跳轉(zhuǎn)到loginFrom請求,即登錄頁面。
同樣地,我們剛剛寫了一個用戶的登錄請求,我們接下來要處理/main請求,用于實現(xiàn)登錄之后給用戶顯示書的詳細定價以及出版信息,我們還在“cn.edu.jit.controller”包中創(chuàng)建一個名為BookController類,用于處理圖書請求。具體代碼如下:
package cn.edu.jit.controller;
import java.util.ArrayList;
import java.util.List;
import cn.edu.jit.domain.Book;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 處理圖書請求控制器
* @author 錢春華
*/
@Controller
public class BookController {
/**
* 處理/main請求
*/
@RequestMapping(value="/main")
public String main(Model model) {
//模擬數(shù)據(jù)庫獲得所有圖書集合
List<Book> book_list = new ArrayList<Book>();
book_list.add(new Book("java.jpg","JAVA核心技術(shù)1","周立新 編著",90.00));
book_list.add(new Book("ee.jpg","Android第一行代碼","郭霖 編著",72.50));
book_list.add(new Book("android.jpg","Spring+MyBatis企業(yè)應(yīng)用實戰(zhàn)","李剛 編著",58.00));
book_list.add(new Book("ajax.jpg","SpringMVC實戰(zhàn)","Alex Bretet 編著",99.00));
//將圖書集合添加到model當(dāng)中
model.addAttribute("book_list", book_list);
//跳轉(zhuǎn)到main頁面
return "main";
}
}
BookController類中的main方法用來處理網(wǎng)站首頁的請求,該方法獲得所有圖書的信息,并將它們設(shè)置到Model當(dāng)中,然后傳遞到main頁面。由于本案例沒有使用數(shù)據(jù)庫存儲數(shù)據(jù),只是簡單的創(chuàng)建了一個集合模擬從數(shù)據(jù)庫獲取圖書信息。
下面是登錄成功后訪問網(wǎng)頁的main.jsp代碼,該jsp代碼位于WebContent/WEB-INF/content文件夾中。如下具體代碼所示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>首頁</title>
<style type="text/css">
table{border-collapse:collapse;border-spacing:0;border-left:1px solid #888;border-top:1px solid #888;background:#efefef;}
th,td{border-right:1px solid #888;border-bottom:1px solid #888;padding:5px 15px;}
th{font-weight:bold;background:#ccc;}
</style>
</head>
<body>
<h2 align="center">歡迎[${sessionScope.user.username }]訪問</h2>
<br>
<table border="1" align="center">
<tr>
<th>封面</th><th>圖書名稱</th><th>作者</th><th>出版價格</th>
</tr>
<c:forEach items="${requestScope.book_list }" var="book">
<tr>
<td><img src="images/${book.image }" height="60"></td>
<td>${book.name }</td>
<td>${book.author }</td>
<td>${book.price }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
接下來,我將設(shè)計攔截器驗證用戶是否登錄,如果用戶沒有登錄,不可以訪問除登錄頁面和登錄請求的所有Controller。我們在src文件下創(chuàng)建名為“cn.edu.jit.interceptor”這個包,在這個包下創(chuàng)建“AuthorizationInterceptor”類,用于演示攔截器驗證用戶是否登錄。具體代碼如下:
package cn.edu.jit.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.edu.jit.domain.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* 攔截器必須實現(xiàn)HandlerInterceptor接口
*/
public class AuthorizationInterceptor implements HandlerInterceptor {
//不攔截"/loginForm"和"/login"請求
private static final String[] IGNORE_URI = {"/loginForm", "/login"};
/**
* 該方法將在整個請求完成之后執(zhí)行, 主要作用是用于清理資源的,
* 該方法也只能在當(dāng)前Interceptor的preHandle方法的返回值為true時才會執(zhí)行。
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception exception)
throws Exception {
System.out.println("AuthorizationInterceptor afterCompletion --> ");
}
/**
* 該方法將在Controller的方法調(diào)用之后執(zhí)行, 方法中可以對ModelAndView進行操作 ,
* 該方法也只能在當(dāng)前Interceptor的preHandle方法的返回值為true時才會執(zhí)行。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView mv) throws Exception {
System.out.println("AuthorizationInterceptor postHandle --> ");
}
/**
* preHandle方法是進行處理器攔截用的,該方法將在Controller處理之前進行調(diào)用,
* 該方法的返回值為true攔截器才會繼續(xù)往下執(zhí)行,該方法的返回值為false的時候整個請求就結(jié)束了。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
System.out.println("AuthorizationInterceptor preHandle --> ");
//flag變量用于判斷用戶是否登錄,默認為false
boolean flag = false;
//獲取請求的路徑進行判斷
String servletPath = request.getServletPath();
//判斷請求是否需要攔截
for (String s : IGNORE_URI) {
if (servletPath.contains(s)) {
flag = true;
break;
}
}
//攔截請求
if (!flag) {
//1.獲取session中的用戶
User user = (User) request.getSession().getAttribute("user");
//2.判斷用戶是否已經(jīng)登錄
if(user == null) {
//如果用戶沒有登錄,則設(shè)置提示信息,跳轉(zhuǎn)到登錄頁面
System.out.println("AuthorizationInterceptor攔截請求:");
request.setAttribute("message", "請先登錄再訪問網(wǎng)站");
request.getRequestDispatcher("loginForm").forward(request, response);
} else {
//如果用戶已經(jīng)登錄,則驗證通過,放行
System.out.println("AuthorizationInterceptor放行請求:");
flag = true;
}
}
return flag;
}
}
我們需要在springmvc-config.xml文件中配置攔截器,配置代碼具體如下:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*"/>
<!-- 使用bean定義一個Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請求 -->
<bean class="cn.edu.jit.interceptor.AuthorizationInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
我們在web.xml中配置代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>MultipartFileTest</display-name>
<!-- 定義Spring MVC的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 讓Spring MVC的前端控制器攔截所有請求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 編碼過濾器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
我們來部署Interceptor這個Web應(yīng)用,在瀏覽器中輸入如下URL來測試應(yīng)用:
http://localhost:8088/Interceptor
按Enter(回車),出現(xiàn)以下頁面,如果沒有登錄,直接訪問main請求,攔截器會攔截請求,驗證用戶是否登錄,此時用戶若沒有登錄,則跳轉(zhuǎn)到登錄頁面。如下圖:

此時我若輸入用戶名:“錢春華”,密碼(假設(shè)輸入錯誤的密碼)為:“123123”,則攔截器會攔截請求,并將請求重新轉(zhuǎn)發(fā)到登錄頁面,同時提示用戶“需要先登錄再訪問網(wǎng)站”。如下圖所示:

輸入正確的用戶名“錢春華”,密碼為“123456”后,顯示用戶登錄成功,而后跳轉(zhuǎn)到網(wǎng)頁的首頁。如下圖所示:

本文中的一些功能案例代碼和配置文件不是很完整,下面附上完整代碼:
FormController類完整的代碼如下:
package cn.edu.jit.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 動態(tài)頁面跳轉(zhuǎn)控制器
*/
@Controller
public class FormController {
@RequestMapping(value="/{formName}")
public String loginForm(@PathVariable String formName){
//動態(tài)跳轉(zhuǎn)頁面
return formName;
}
}
在src文件下創(chuàng)建“cn.edu.jit.domain”包,用于存放圖書和用戶的兩個實例,具體代碼如下:
Book類代碼:
package cn.edu.jit.domain;
import java.io.Serializable;
/**
*
* @author 錢春華
*
*/
public class Book implements Serializable{
private Integer id;//id
private String name;//書名
private String author;//作者
private Double price;//價格
private String image;//封面圖片
public Book() {
super();
}
public Book( String image,String name, String author, Double price) {
super();
this.image = image;
this.name = name;
this.author = author;
this.price = price;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
@Override
public String toString() {
return "Book [id=" + id + ", name=" + name + ", author=" + author
+ ", price=" + price + ", image=" + image + "]";
}
}
User類代碼:
package cn.edu.jit.domain;
import java.io.Serializable;
public class User implements Serializable {
private Integer id;//id
private String loginname;//登錄名
private String password;//密碼
private String username;//用戶名
public User() {
super();
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getLoginname() {
return loginname;
}
public void setLoginname(String loginname) {
this.loginname = loginname;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User [id=" + id + ", loginname=" + loginname + ", password="
+ password + ", username=" + username + "]";
}
}
springmvc-config.xml配置文件具體配置信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- spring可以自動去掃描base-pack下面的包或者子包下面的java文件,
如果掃描到有Spring的相關(guān)注解的類,則把這些類注冊為Spring的bean -->
<context:component-scan base-package="cn.edu.jit.controller"/>
<!-- 設(shè)置默認配置方案 -->
<mvc:annotation-driven/>
<!-- 使用默認的Servlet來響應(yīng)靜態(tài)文件 -->
<mvc:default-servlet-handler/>
<!-- 視圖解析器 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前綴 -->
<property name="prefix">
<value>/WEB-INF/content/</value>
</property>
<!-- 后綴 -->
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*"/>
<!-- 使用bean定義一個Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請求 -->
<bean class="cn.edu.jit.interceptor.AuthorizationInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
web.xml配置文件具體配置信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>MultipartFileTest</display-name>
<!-- 定義Spring MVC的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 讓Spring MVC的前端控制器攔截所有請求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 編碼過濾器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
總結(jié):今天主要就介紹Spring MVC攔截器,通過引用攔截器機制,Spring MVC框架可以使用可插拔方式管理各種功能。以上就是完整的使用Spring MVC攔截器實現(xiàn)了用戶的權(quán)限驗證,本文所有的案例都是本人親自測試,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot+vue實現(xiàn)登錄圖片驗證碼功能
這篇文章主要給大家介紹一下如何SpringBoot+vue實現(xiàn)登錄圖片驗證碼功能,文中有詳細的代碼示例,具有一定的參考價值,需要的朋友可以參考下2023-07-07
mybatis中oracle實現(xiàn)分頁效果實例代碼
實現(xiàn)分頁的方式有很多,但常用的是通過SQL來顯示分頁。這篇文章主要介紹了mybatis中oracle實現(xiàn)分頁效果實例代碼,有興趣的可以了解一下。2017-04-04
SpringBoot中的Spring Cloud Hystrix原理和用法詳解
在Spring Cloud中,Hystrix是一個非常重要的組件,Hystrix可以幫助我們構(gòu)建具有韌性的分布式系統(tǒng),保證系統(tǒng)的可用性和穩(wěn)定性,在本文中,我們將介紹SpringBoot中的Hystrix,包括其原理和如何使用,需要的朋友可以參考下2023-07-07
淺談關(guān)于Mybatis的mapper-locations配置問題
MyBatis 是一款優(yōu)秀的半自動的ORM持久層框架,它支持自定義 SQL、存儲過程以及高級映射。MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作,需要的朋友可以參考下2023-05-05

