springboot使用cookie+fiter实现用户免密登录

springboot使用cookie+fiter实现用户免密登录,这个功能是我做springboot忽视的,但是又是特别有用的常用的功能。
做一自己就琢磨了一些时间,成功完成了。当然还有很多更好更便捷的方法去实现这个功能,后续有需要也会总结出来。现在进入正题。

首先解决跨域问题

在浏览器端进行 Ajax 请求时会出现跨域问题,那么什么是跨域,如何解决跨域呢?先看浏览器端出现跨域问题的现象,跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对 JavaScript 施加的安全限制。
如何解决跨域问题呢,有很多种方法。
详情可以见如何解决跨域问题

不过这里我用了过滤器解决跨域问题

过滤器类后端代码:

package com.mall.config;
import com.mall.entity.Users;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

@WebFilter(urlPatterns = "/*",filterName = "CORSFilter")
public class CORSFilter implements Filter {

//    private static final Set<String> ALLOWED_PATHS = Collections.unmodifiableSet(
//            new HashSet<String>( Arrays.asList("/index","/") )
//    );


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");//这里不能写**代表接受所有域名访问,如写*则下面一行代码无效。谨记
        response.setHeader("Access-Control-Allow-Credentials", "true");//true代表允许携带cookie
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "content-type,Authorization");

        filterChain.doFilter(servletRequest,servletResponse);


    }

    @Override
    public void destroy() {

    }
}

前端vue代码

在main.js中加入:

axios.defaults.withCredentials = true

以上解决了跨域问题,可以成功的运行跳转我们的页面,接下来就要进行免密登录功能的实现。

基本逻辑

在这里插入图片描述
首先后端需要把用户的信息存放在cookies中,对于创建cookies需要了解的属性如果不熟悉,建议大家去官网查看

package com.mall.controller;

import com.mall.entity.Users;
import com.mall.service.UserService;
import lombok.RequiredArgsConstructor;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("user")
@RequiredArgsConstructor
public class UserController {
    private final UserService userService;

    @GetMapping("findUser")
    public Map<String, Object> findUser(HttpServletResponse response, HttpServletRequest request, String username, String password) {
        HashMap<String, Object> map = new HashMap<>();
        try {
            Users user = userService.findUser(username, password);
            map.put("res", user);
            map.put("success", true);
            Cookie cookie = new Cookie("user", URLEncoder.encode(user.toString(),"utf-8"));
            cookie.setDomain("localhost");
            cookie.setPath("/");
            cookie.setMaxAge(60 * 60 * 24);
            response.addCookie(cookie);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("success", false);

        }
        System.out.println("登录的用户:" + map);
        return map;
    }

}




在这里插入图片描述

然后从前端获取cookies
用vue获取cookies首先需要安装cookies

npm install vue-cookies --save

然后引入

import Vue from 'vue'
import VueCookies from 'vue-cookies'
Vue.use(VueCookies)

获取cookies

console.log(this.$cookies.get("user"))

进行判断在页面加载前,判断如果cookies中存在user就获取他的uid,存到页面中,避免再次登录

  created() {
    this.findAll();
    if(this.$cookies.get("user")!=null){
      this.user.uid=this.$cookies.get("user")[10]
    }
  }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个用于快速开发Java应用程序的开源框架,Shiro是一个强大且易于使用Java安全框架,Redis是一个开源的内存数据库。结合使用这些技术可以实现单点登录功能。 在Spring Boot中使用Shiro来处理认证和授权,可以通过配置Shiro的Realm来实现用户的登录认证和权限控制。将用户的信息存储在Redis中,利用Redis的持久化特性来实现用户登录状态的共享和存储。 首先,在Spring Boot项目的配置文件中配置Redis的连接信息,以便连接到Redis数据库。 然后,创建一个自定义的Shiro的Realm,在其中重写认证和授权的方法。在认证方法中,将用户的登录信息存储到Redis中,以便其他服务可以进行验证。在授权方法中,根据用户的角色和权限进行相应的授权操作。 接着,在Spring Boot项目的配置类中配置Shiro的相关设置,包括Realm、Session管理器、Cookie管理器等。 最后,可以在Controller层中使用Shiro的注解来标记需要进行认证和授权的接口,以确保只有登录后且具备相应权限的用户才能访问这些接口。 总的来说,通过使用Spring Boot、Shiro和Redis的组合,可以实现单点登录的功能。用户在登录后,将登录信息存储到Redis中,其他服务可以通过验证Redis中的数据来判断用户的登录状态。同时,Shiro提供了强大的认证和授权功能,可以确保只有具备相应权限的用户才能访问受保护的接口。这些功能的具体实现可以通过深入研究Spring Boot、Shiro和Redis的源码来了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值