• 检验用户单点登录方案解决


     早期的web基本用语文档的处理,既然是浏览作为服务器不需要判断现在是谁在浏览。有请求直接响应就可以了,后来因为交互式应用的兴起(在线购物,微博),服务器有了一个新的要求:管理会话。也就是必须记住是哪个人往购物车放了东西,哪个人发了新的微博。因为http请求是无状态的,所以想出来的办法就是在第一次请求服务器的时候生成一个随机的字符串 也就是所谓的session id。服务器和客户端分别保管一个,在客户端请求的时候带上这个session id,这样服务器就能知道谁是谁了。但是这样又衍生了很多问题,首先就是客户端只用保管自己的session id,但是服务端要管理所有人的id,当用户过多的时候会导致服务器压力太大。除此之外,随着分布式系统越来越流行,不同的服务器处理不同的模块需求,客户可能在服务器A上登录,但是如果下一次的请求被转发到服务器B那就没办法了。如果让客户的请求一直一直黏在一个机器上,这个机器挂了那么还得转到其他机器上去。所以检验用户是否登录的办法说到底就是“验证”。

    先说一下session id的实现方式

    使用主流的Spring MVC框架的拦截器可以实现此方法(用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,是aop的一种实现)

    手写一个配置类,实现HandlerInterceptor接口

    //拦截器
    public class RequestInterceptor implements HandlerInterceptor {
    
        //方法结束后执行
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("方法结束");
        }
    
        //进入方法前执行 返回值为true则执行方法 为false则不执行
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                //如果请求的是user/login方法则直接放行
                if("/user/login".equals(request.getServletPath())){
                    return true;
    }

    return request.getSession().getAttribute("user") != null; } }

    需要注意上述代码需要在WebMvcConfigurer的实现类里重写addInterceptor方法里添加此自定义拦截器

        //注册拦截器
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new RequestInterceptor());
        }

    通过上述代码可以发现,在进入方法前需要检查session里有没有"user",而且对于user/login是直接放行的,所以可以通过user/login来放入用户信息

    写一个controller处理此方法

    //组合式注解 Responsbody+Controller
    //如果不需要返回值到客户端 可以只用@Controller
    @RestController
    public class UserModuleController {
        //url映射
        @RequestMapping("/user/login")
        public String doLogin(@RequestParam("username")String name, HttpServletRequest request){
            //做一下数据校验
            if("admin".equals(name)){
                request.getSession().setAttribute("user",name);
                //建议不要使用魔法值,此处可以写一个常量类用静态变量导入
                String retuenMessage="登录成功";
                return retuenMessage;
            }
            String returnMessage="登录失败,请检查你的账号";
            return returnMessage;
        }
    }

    运行项目 使用postman测试

    token机制: 既然检验用户登陆的核心是验证,那么有没有可能信息存放在客户端,用户每次请求的时候带上这个信息令牌来让后端来验证。

    实现:和session差不多,用户登陆成功之后,服务端根据算法 将用户的信息和密钥加密成字符串再将该字符串相应给用户,此后用户每次请求的时候在响应头里加入此token。拦截器通过request.getHeader("token")来获取该字符串并解密来判断该请求是哪个用户发送的

    不和别人一样,不复制只真正理解
  • 相关阅读:
    什么是 Serverless 架构?
    安全同学讲Maven间接依赖场景的仲裁机制
    龙湖千丁基于 ACK@Edge 的云原生智慧停车系统架构实践
    招行架构师徐佳航:金融云原生与开源标准的共同生长
    Vite 创建一个Vue3项目
    Vite 创建一个Vue2项目
    Vite 创建一个React项目
    如何让Vite支持一个已有项目
    Vite 处理css postcss import variable less
    SpringBoot+Vue+iSecure Center(海康综合安防管理平台)实现视频预览
  • 原文地址:https://www.cnblogs.com/Vinlen/p/13495042.html
Copyright © 2020-2023  润新知