实现SpringBoot登录
SpringBoot登录
https://www.cnblogs.com/jiekzou/p/9303871.html
通过前面10篇文章的学习,相信我们对SpringBoot已经有了一些了解,那么如何来验证我们的学习成果呢?当然是通过做项目来证明啦!所以从这一篇开始我将会对之前自己做的.net项目用java来重写。这一篇,我们来现实登录模块。
一提到登录,我们首先想到的基本的功能点就有如下:
输入:用户名、密码、验证码。
登录成功后,跳转到后台。如果未登录直接访问后台,将会跳转到登录页面。
这里暂不考虑复杂的登录实现。
技术选型,沿用前面用到的知识点。那么这里较之于之前的文章,新用到的一个就是图片验证码,一个就是权限拦截器了。
1、新建spring boot web项目,具体配置信息如pom.xml所示:
复制代码
4.0.0
<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
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
select
from t_user
where username=#{username,jdbcType=VARCHAR} and password=#{password,jdbcType=VARCHAR}
复制代码
5、增加验证码的实现类ValidateCode
这里需要注意的是假设我们要让验证码大小写不敏感,那么需要code.toLowerCase();对生成的验证码字符串进行转换。
6、新增一个ajax对象类AjaxResult
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了,
templates下添加admin目录,admin目录下,添加login.html页面。
这样登录就已经实现,然后我们还有一个权限拦截器啊。Java中通过实现HandlerInterceptor这个接口来进行过拦截功能,其实也可以通过继承另一个类来实现同样的功能,不过建议使用接口。具体类名,我一下子想不起来啦!O(∩_∩)O哈哈~
新建类BaseInterceptor
然后我们要新建一个配置类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开发还是蛮简单的。
博客地址: http://www.cnblogs.com/jiekzou/
最新文章
- MFC如何隐藏RibbonBar的QAT QuickAccessToolBar(快速访问工具栏)
- MatLab有关路径的几个命令
- Git使用实例分析
- 转-ViewPager组件(仿微信引导界面)
- Oracle RAC中的投票算法
- 在Qt中将函数发送到主线程执行
- eclipse打war包
- 05String字符串课后作业
- [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper
- pug新手学习
- 如何关闭常见浏览器的 HSTS 功能
- 吴恩达机器学习笔记30-神经网络的反向传播算法(Backpropagation Algorithm)
- 【POJ1083】 Moving Tables (并行的搬运)
- 【java】:Junit
- [转] 理解 JavaScript 中的 Array.prototype.slice.apply(arguments)
- 纯Css实现Div高度根据自适应宽度(百分比)调整
- css 字体、文本、padding的样式
- ★itext-为pdf文件添加页眉页脚 | 3步完成 |
- 普通用户查看Oracle参数的值
- Oracle 12C 在 Oracle Linux 6.5 64Bit 安装手冊
热门文章
- Python使用selenium实现网页用户名 密码 验证码自动登录功能
- 【03】placeholder
- [codeforces494B]Obsessive String
- IDA-IDC脚本编写语法
- rsync远程文件传输
- hdu - 1068 Girls and Boys (二分图最大独立集+拆点)
- Webstrom打开太慢
- [bzoj3306]树_dfs序_线段树_倍增lca
- CODEFORCES problem 105A.Transmigration
- 携程Apollo(阿波罗)配置中心使用Google代码风格文件(在Eclipse使用Google代码风格)(配合阿里巴巴代码规约快速设置)