zoukankan      html  css  js  c++  java
  • 实现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

    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 ",; ")

    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

    复制代码 5、增加验证码的实现类ValidateCode

    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开发还是蛮简单的。

    博客地址: http://www.cnblogs.com/jiekzou/

  • 相关阅读:
    【论文笔记】迁移自适应学习综述
    David Silver强化学习Lecture3:动态规划
    David Silver强化学习Lecture2:马尔可夫决策过程
    David Silver强化学习Lecture1:强化学习简介
    【论文笔记】深度人脸识别综述
    《构建之法》读书笔记
    个人作业——软件工程实践总结
    个人作业——关于K米的产品案例分析
    Hibernate简单增删改查
    Intellij IDEA中的Hibernate配置(MySQL8.0+Hibernate5.4.11)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/9334270.html
Copyright © 2011-2022 走看看