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/

实现SpringBoot登录的更多相关文章

  1. 从.Net到Java学习第十一篇——SpringBoot登录实现

    从.Net到Java学习系列目录 通过前面10篇文章的学习,相信我们对SpringBoot已经有了一些了解,那么如何来验证我们的学习成果呢?当然是通过做项目来证明啦!所以从这一篇开始我将会对之前自己做 ...

  2. SpringBoot登录登出切面开发

    阅读本文约“2.5分钟” 本文开发环境是SpringBoot2.X版本. 对于系统而言(这里多指管理系统或部分具备登录登出功能的系统),登录登出是一个类权限验证的过程,现在一般是以token进行校验, ...

  3. springboot 登录实现源代码解析

    springboot 可以使用springsecurity 作为安全框架,我们可以使用springsecurity 实现安全登录. springsecurity 是使用一系列的过滤器来实现安全的. 实 ...

  4. SpringBoot登录判断

    <!-- html登录代码 --> <div class="box"> <div class="title">登录</ ...

  5. 【tmos】SpringBoot登录拦截

    我的代码 public class WebLoginInterceptor implements HandlerInterceptor { @Autowired private WeixinConfi ...

  6. springboot - 登录+静态资源访问+国际化

    1.项目目录结构 2.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmln ...

  7. SpringBoot集成Swagger2在线文档

    目录 SpringBoot集成Swagger2在线文档 前言 集成SpringBoot 登录接口文档示例 代码 效果 注解说明 总结 SpringBoot集成Swagger2在线文档 前言 不得不说, ...

  8. 从.Net到Java学习第一篇——开篇

    以前我常说,公司用什么技术我就学什么.可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的.”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交过社保 ...

  9. vue+springboot前后端分离实现单点登录跨域问题处理

    最近在做一个后台管理系统,前端是用时下火热的vue.js,后台是基于springboot的.因为后台系统没有登录功能,但是公司要求统一登录,登录认证统一使用.net项目组的认证系统.那就意味着做单点登 ...

随机推荐

  1. C#基础学习(一)

    ---恢复内容开始--- 1.最近被安排去做C#开发,然后开始一连串的看文档·看视屏,发现学C#给自己补了很多基础,C#每个函数变量什么都要先声名,而python可以直接定义: 一.数据类型 1.整数 ...

  2. python 开发搭建目录规范

    软件目录结构规范有什么好处: 通过规范化,能够更好的控制软件结构,让程序具有更高的可读性. 项目目录组织结构如下: Foo/ # 项目名 --bin/ # 可执行文件目录 --foo # 可执行程序 ...

  3. python——进制间的转换

    int(string_num, n)  string_num表示某种进制的字符串,n表示string_num是什么进制数 2.8.16 进制转为10进制:使用int()或者eval() 10 进制转为 ...

  4. 【XML】-- C#读取XML中元素和属性的值

    Xml是扩展标记语言的简写,是一种开发的文本格式. 啰嗦几句儿:老师布置的一个小作业却让我的脑细胞死了一堆,难的不是代码,是n多嵌套的if.foreach,做完这个,我使劲儿想:我一女孩,没有更多女孩 ...

  5. PHP学习笔记<参数的传递>

    简单的例子说明参数在PHP文件之间的传递(有两个PHP文件在index.php文件上点击链接,在跳转的时候,依据参数的不同在neirong.php文件中显示不同的内容) inde.php的内容如下: ...

  6. [OJ#39]左手右手

    [OJ#39]左手右手 试题描述 有 n 个人,每个人左右手上各写着一个整数.对于编号为 a 的人和编号为 b 的人, a 对 b 的好感度等于 a 左手上写的数字乘 b 右手上写的数字,a 和 b  ...

  7. 【计算几何+极角排序+爆ll】E. Convex

    https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/E [题意] 给定n个点的坐标,可以选择其中的四个点构造凸四边形,问最多能构造多少 ...

  8. Thinkphp5.0 视图view取值

    Thinkphp5.0 视图view取值 <!-- 获取控制器传递的变量 --> <li>{$age}</li> <!-- 获取服务器的信息 --> & ...

  9. Web App 响应式页面制作 笔记整理

    一.移动端种类.分辨率大小 说明: 以主流的iPad.iPhone为例. 工具: Resizer官网: Resizer 用法: 将通栏处写有 “Click or Bookmark”的蓝色按钮拖拽至标签 ...

  10. [bzoj4131]并行博弈_博弈论

    并行博弈 bzoj-4131 题目大意:题目链接. 注释:略. 想法:我们发现无论如何操作都会使得$(1,1)$发生改变. 所以单个$ACG$的胜利条件就是$(1,1)$是否为黑色. 如果为黑色那么可 ...