美文网首页
配置文件赋值-h2数据库-Mybatis-持久化登陆-(2)

配置文件赋值-h2数据库-Mybatis-持久化登陆-(2)

作者: 弹钢琴的崽崽 | 来源:发表于2020-03-04 08:08 被阅读0次

1. 配置文件中赋值

1.1 配置application.properties

为了我们在不同的服务器环境,项目环境能读取到不同的配置文件,于是把所有我们需要的变量全部放到application.properties中,这样就可以让不同的项目环境读取不同的配置文件

package life.guohui.community.controller;
@Controller
public class AuthorizeController {
    
    @Autowired
    private GithubProvider githubProvider;

    @Value("${github.client.id}")
    private String clientId;

    @Value("${github.client.secret}")
    private String clientSecret;

    @Value("${github.redirect.uri}")
    private String redirectUri;
    
    @GetMapping("/callback")
    public String callback(@RequestParam(name="code") String code,
                           @RequestParam(name="state") String state){
        AccessTokendDTO accessTokendDTO = new AccessTokendDTO();
        accessTokendDTO.setCode(code);
        accessTokendDTO.setRedirect_uri(redirectUri);
        accessTokendDTO.setCliend_id(clientId);
        accessTokendDTO.setClient_secret("clientSecret");
        accessTokendDTO.setState(state);
        String accessToken = githubProvider.getAccessToken(accessTokendDTO);
        GithubUser user = githubProvider.getUser(accessToken);
        System.out.println(user.getName());
        return "index";
    }
}

1.2 保存登陆用户的信息

package life.guohui.community.controller;
@Controller
public class AuthorizeController {

    @Autowired
    private GithubProvider githubProvider;

    @Value("${github.client.id}")
    private String clientId;

    @Value("${github.client.secret}")
    private String clientSecret;

    @Value("${github.redirect.uri}")
    private String redirectUri;

    @GetMapping("/callback")
    public String callback(@RequestParam(name="code") String code,
                           @RequestParam(name="state") String state,
                           HttpServletRequest request){
        AccessTokendDTO accessTokendDTO = new AccessTokendDTO();
        accessTokendDTO.setCode(code);
        accessTokendDTO.setRedirect_uri(redirectUri);
        accessTokendDTO.setCliend_id(clientId);
        accessTokendDTO.setClient_secret(clientSecret);
        accessTokendDTO.setState(state);
        String accessToken = githubProvider.getAccessToken(accessTokendDTO);
        System.out.println(accessToken);
        GithubUser user = githubProvider.getUser(accessToken);
        System.out.println(user);
        if(user != null){
            //登陆成功,写cookie和session
            request.getSession().setAttribute("user",user);
            return "redirect:/";
        }else {
            return "redirect:/";
        }
    }
}

1.3 index页面导入命名空间

<html xmlns:th="http://www.thymeleaf.org">

a. 登陆和未登陆的区别显示

<li class="dropdown" th:if="${session.user != null}">
    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" th:text="${session.user.getName()}"> <span class="caret"></span></a>
    <ul class="dropdown-menu">
        <li><a href="#">消息中心</a></li>
        <li><a href="#">个人资料</a></li>
        <li><a href="#">退出登陆</a></li>
    </ul>
</li>
<li th:unless="${session.user != null}">
    <a href="https://github.com/login/oauth/authorize?client_id=Iv1.bf5154208e60707f&redirect_uri=http://localhost:8887/callback&scope=user&state=1">登陆</a>
</li>

2. h2数据库

2.1 添加依赖

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.199</version>
</dependency>

2.2 添加数据源

a. 测试连接

b. 建表

3. 使用Mybatis

3.1 添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.1</version>
</dependency>

3.2配置数据源

application.properties

spring.datasource.url=jdbc:h2:E:/Users/IdeaProjects/community
spring.datasource.username=sa
spring.datasource.password=123
spring.datasource.driver-class-name=org.h2.Driver

3.3 创建实体类对应数据库的user

3.4 UserMapper接口

package life.guohui.community.mapper;
@Mapper
public interface UserMapper {
    @Insert("insert into user (name,account_id,token,gmt_create,gmt_modified) values(#{name},#{accountId},#{token},#{gmtCreate},#{gmtModified})")
    void insert(User user);
}

3.5 Controller层

把用户token存为uuid随机值,githubUser赋值给User对象

package life.guohui.community.controller;
@Controller
public class AuthorizeController {
    
    @Autowired
    private GithubProvider githubProvider;

    @Value("${github.client.id}")
    private String clientId;

    @Value("${github.client.secret}")
    private String clientSecret;

    @Value("${github.redirect.uri}")
    private String redirectUri;

    @Autowired
    private UserMapper userMapper;
    
    @GetMapping("/callback")
    public String callback(@RequestParam(name="code") String code,
                           @RequestParam(name="state") String state,
                           HttpServletRequest request){
        AccessTokendDTO accessTokendDTO = new AccessTokendDTO();
        accessTokendDTO.setCode(code);
        accessTokendDTO.setRedirect_uri(redirectUri);
        accessTokendDTO.setCliend_id(clientId);
        accessTokendDTO.setClient_secret(clientSecret);
        accessTokendDTO.setState(state);
        String accessToken = githubProvider.getAccessToken(accessTokendDTO);
        System.out.println(accessToken);
        GithubUser githubUser = githubProvider.getUser(accessToken);
        System.out.println(githubUser);
        if(githubUser != null){
            User user = new User();
            user.setToken(UUID.randomUUID().toString());
            user.setName(githubUser.getName());
            user.setAccountId(String.valueOf(githubUser.getId()));
            user.setGmtCreate(System.currentTimeMillis());
            user.setGmtModified(user.getGmtCreate());
            userMapper.insert(user);
            //登陆成功,写cookie和session
            request.getSession().setAttribute("user",user);
            return "redirect:/";
        }else {
            return "redirect:/";
        }
    }
}

3.6 数据保存成功

如果说数据库说用户名和密码不对

参考文章

4 持久化登陆状态的获取

4.1 过程描述

我们手动的去写一个key和value,并且能在登陆验证的时候手动把user和value识别出来,识别处理以后,然后去数据库查看是不是在数据库中,并且已经存在,那么如果存在就是登陆成功,如果不存在就是登陆失败。

package life.guohui.community.controller;
@Controller
public class AuthorizeController {
......
    @GetMapping("/callback")
    public String callback(@RequestParam(name="code") String code,
                           @RequestParam(name="state") String state,
                           HttpServletResponse response){
        AccessTokendDTO accessTokendDTO = new AccessTokendDTO();
        accessTokendDTO.setCode(code);
        accessTokendDTO.setRedirect_uri(redirectUri);
        accessTokendDTO.setCliend_id(clientId);
        accessTokendDTO.setClient_secret(clientSecret);
        accessTokendDTO.setState(state);
        String accessToken = githubProvider.getAccessToken(accessTokendDTO);
        System.out.println(accessToken);
        GithubUser githubUser = githubProvider.getUser(accessToken);
        System.out.println(githubUser);
        if(githubUser != null){
            User user = new User();
            String token = UUID.randomUUID().toString();
            user.setToken(token);
            user.setName(githubUser.getName());
            user.setAccountId(String.valueOf(githubUser.getId()));
            user.setGmtCreate(System.currentTimeMillis());
            user.setGmtModified(user.getGmtCreate());
            userMapper.insert(user);
            response.addCookie(new Cookie("token",token));
            return "redirect:/";
        }else {
            return "redirect:/";
        }
    }
}

当使用github登陆成功以后,它会做登陆获取到用户信息,这时生成一个token,生成token以后,把token放到User对象中,存取到数据库中,并且把token放到cookIe里面。

4.2 访问首页

当有人访问首页的时候,循环去看所有的cookie,找到cookie的name=token的cookie,然后拿到这个cookie去数据库里查,是不是有这个cookie这条记录,如果有就把user放到session中。

如果没有登陆过,数据库是不会有对应的token的,拿不到token

package life.guohui.community.controller;
@Controller
public class IndexController {
    @Autowired
    private UserMapper userMapper;
    @GetMapping("/")
    public String index(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        for(Cookie cookie: cookies){
            if(cookie.getName().equals("token")){
                String token = cookie.getValue();
                User user = userMapper.findByToken(token);
                if(user != null){
                    request.getSession().setAttribute("user",user);
                }
                break;
            }
        }
        return "index";
    }
}

这样做的好处是:假如有用户在访问我们的网站,我们的服务器重启或连接断开,发现登陆就失效了,每次重启服务我们都需要用户重新登陆一下,那就相当麻烦了,所以我们需要一种方式通过页面的key。

这种方式适合小范围,用户量大就会不合适。

相关文章

网友评论

      本文标题:配置文件赋值-h2数据库-Mybatis-持久化登陆-(2)

      本文链接:https://www.haomeiwen.com/subject/wtgrlhtx.html