SpringBoot登錄
https://www.cnblogs.com/jiekzou/p/9303871.html
通過前面10篇文章的學習,相信我們對SpringBoot已經有了一些了解,那么如何來驗證我們的學習成果呢?當然是通過做項目來證明啦!所以從這一篇開始我將會對之前自己做的.net項目用java來重寫。這一篇,我們來現實登錄模塊。
一提到登錄,我們首先想到的基本的功能點就有如下:
輸入:用戶名、密碼、驗證碼。
登錄成功后,跳轉到后台。如果未登錄直接訪問后台,將會跳轉到登錄頁面。
這里暫不考慮復雜的登錄實現。
技術選型,沿用前面用到的知識點。那么這里較之於之前的文章,新用到的一個就是圖片驗證碼,一個就是權限攔截器了。
1、新建spring boot web項目,具體配置信息如pom.xml所示:
復制代碼
<groupId>com.yujie</groupId>
<artifactId>website</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>website</name>
<description>通用角色權限管理系統</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--集成druid,使用連接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.0</version>
</dependency>
<!--thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
<!-- 分頁插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.2</version>
</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>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- mybatis generator 自動生成代碼插件 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
<verbose>true</verbose>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
復制代碼 2、准備數據庫、數據表。這里只用一張用戶表t_user.sql
View Code
3、對項目進行配置。我對配置項進行了詳實的注釋,如有不懂的,自己翻閱相關文檔。
application.yml
spring:
profiles:
active: dev
application-dev.yml
復制代碼
server:
port: 8080
spring:
thymeleaf:
cache: false #開發階段,建議關閉Thymeleaf的緩存
mode: LEGACYHTML5 #使用遺留的html5以去掉對html標簽的校驗
datasource:
name: demo
url: jdbc:mysql://127.0.0.1:3306/RightControl?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true
username: root
password: yujie
# 使用druid數據源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
filters: stat
maxActive: 20 # 最大活躍數
initialSize: 5 # 初始化數量
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
mybatis:
mapper-locations: classpath:mapping/*.xml #Locations of Mapper xml config file.
type-aliases-package: com.yujie.dao #Packages to search for type aliases. (Package delimiters are ",; \t\n")
pagehelper分頁插件
pagehelper:
helperDialect: mysql
reasonable: true #pageNum<=0 時會查詢第一頁, pageNum>pages(超過總數時),會查詢最后一頁
supportMethodsArguments: true #支持通過 Mapper 接口參數來傳遞分頁參數
#用於從對象中根據屬性名取值,可以配置 pageNum,pageSize,count,pageSizeZero,reasonable。
#不配置映射的用默認值,默認值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
params: count=countSql
復制代碼
4、自動生成mybatis相關的配置,具體如何生成這個可以參考我前面的文章。從.Net到Java學習第三篇——spring boot+mybatis+mysql
在自動生成好的mybatis配置中,我們還需要自己擴展一個方法CheckLogin用於校驗用戶名和密碼是否正確。
我們首先修改UserModelMapper類,需要注意的是checkLogin方法中的參數前面一定要記得添加@Param,因為mybatis很坑的一個地方,是對於單個參數,你不需要添加@Param,對於多個參數你必須要添加@Param,否則會報錯,提示找不到參數。
復制代碼
@Component
public interface UserModelMapper {
int deleteByPrimaryKey(Integer id);
int insert(UserModel record);
int insertSelective(UserModel record);
UserModel selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(UserModel record);
int updateByPrimaryKey(UserModel record);
//add
UserModel checkLogin(@Param("username") String username,@Param("password") String password);
}
復制代碼
接下來修改UserModelMapper.xml,在其中添加一個checkLogin
復制代碼
Id, UserName, RealName, PassWord, RoleId, Status, CreateOn, UpdateOn, CreateBy, UpdateBy,
Gender, Phone, Email, Remark, HeadShot
View Code
這里需要注意的是假設我們要讓驗證碼大小寫不敏感,那么需要code.toLowerCase();對生成的驗證碼字符串進行轉換。
6、新增一個ajax對象類AjaxResult
View Code
7、添加控制器LoginController
復制代碼
@Controller
@RequestMapping("/login")
public class LoginController extends BaseController {
@Autowired
IUserService userService;
@GetMapping("")
public String login(Model model){
model.addAttribute("title","后台管理系統");
return render("login");
}
@ResponseBody
@PostMapping("/CheckLogin")
public AjaxResult CheckLogin(@RequestParam String username, @RequestParam String password, @RequestParam String code,
HttpServletRequest request,
HttpServletResponse response){
Object objCode=request.getSession().getAttribute("code");
String _code=objCode.toString().toLowerCase();
if(!code.equals(_code)){
return AjaxResult.error("驗證碼錯誤,請重新輸入!");
}
UserModel userModel=userService.CheckLogin(username,password);
if(userModel==null) {
return AjaxResult.error("用戶名或密碼,請重新輸入!");
}else {
request.getSession().setAttribute("userinfo",userModel);
return AjaxResult.ok("成功");
}
}
/**
* 響應驗證碼頁面
* @return
*/
@GetMapping(value="/GetAuthCode")
public String validateCode(HttpServletRequest request, HttpServletResponse response) throws Exception{
// 設置響應的類型格式為圖片格式
response.setContentType("image/jpeg");
//禁止圖像緩存。
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
HttpSession session = request.getSession();
ValidateCode vCode = new ValidateCode(120,40,4,100);
session.setAttribute("code", vCode.getCode());
vCode.write(response.getOutputStream());
return null;
}
}
復制代碼
考慮到一些公共的信息,我添加了一個控制器的父類BaseController
復制代碼
public abstract class BaseController {
public static String THEME = "admin";
public BaseController title(HttpServletRequest request, String title) {
request.setAttribute("title", title);
return this;
}
/**
* 主頁的頁面主題
* @param viewName
* @return
*/
public String render(String viewName) {
return THEME + "/" + viewName;
}
public String render_404() {
return "comm/error_404";
}
protected WebSiteModel GetWebSiteModel(){
WebSiteModel model=new WebSiteModel();
model.setSiteName("網站后台管理系統");
return model;
}
protected UserModel GetUserInfo(HttpServletRequest request){
HttpSession session = request.getSession();
if (null == session) {
return null;
}
return (UserModel)session.getAttribute("userinfo");
}
}
復制代碼
8、實現服務層,添加IUserService接口,接口的命名我沿用C#的規范首字母用I
public interface IUserService extends IBaseService
UserModel CheckLogin(String username, String password);
}
9、添加接口的實現類UserService
復制代碼
package com.yujie.service.impl;
import com.yujie.dao.UserModelMapper;
import com.yujie.model.UserModel;
import com.yujie.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService implements IUserService {
@Autowired
UserModelMapper userModelMapper;
@Override
public UserModel CheckLogin(String username, String password) {
return userModelMapper.checkLogin(username,password);
}
}
復制代碼
接觸java的時間不長,發現一個很有意思的想象,不知道是否是寫java默認約定,那就是實現類都是單獨用一個叫做impl的包封裝。
10、剩下的就是View了,
View Code
templates下添加admin目錄,admin目錄下,添加login.html頁面。
這樣登錄就已經實現,然后我們還有一個權限攔截器啊。Java中通過實現HandlerInterceptor這個接口來進行過攔截功能,其實也可以通過繼承另一個類來實現同樣的功能,不過建議使用接口。具體類名,我一下子想不起來啦!O(∩_∩)O哈哈~
新建類BaseInterceptor
View Code
然后我們要新建一個配置類WebMvcConfig,將這個創建的攔截器添加進來。
復制代碼
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Resource
private BaseInterceptor baseInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns 用於添加攔截規則, 這里假設攔截 /url 后面的全部鏈接
// excludePathPatterns 用戶排除攔截
registry.addInterceptor(baseInterceptor).addPathPatterns("/**");
}
/**
* 添加靜態資源文件,外部可以直接訪問地址
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/upload/**").addResourceLocations("upload/");
super.addResourceHandlers(registry);
}
}
復制代碼
這樣就一切OK了,接下來看下演示效果。
代碼結構圖:
感覺有.net基礎的話,進行java開發還是蠻簡單的。
