在登录之后,可能服务器是分布式的,因此不能通过一个本地的session来管理登录信息,导致登录的信息不能传递,即在这台服务器上可以得到用户登录信息,但在那台就得不到。因此,需要设置分布式的session,方法是,使用一个token,存在客户端的本地cookie,当接收请求时,从客户端将cookie值传过去,或者将token值存到缓存中,从缓存中取值。

  • 起步

  在登录的时候,当登录成功后,便随机生成一个token值,将该值存到redis缓存中,并将该值存到cookie中,返回到客户端。

private void addCookie(HttpServletResponse response,String token, MiaoshaUser user){
//将token存入缓存中
redisService.set(MiaoshaUserKey.token,token,user);
//将token存入COOKIE中
Cookie cookie=new Cookie(COOKI_NAME_TOKEN,token);
cookie.setMaxAge(MiaoshaUserKey.token.expireSeconds());
cookie.setPath("/");
response.addCookie(cookie);
}

该方法在MiaoshaUserService中的login方法中调用。

  • 跳转

  登录以后,要跳转到商品页面,但需要把商品页面传过来,一种是一个机器的,可以直接传过去,但如果是分布式的,只能通过token来获取。

@Controller
@RequestMapping("/goods")
public class GoodsController { @RequestMapping("/to_list")
public String list(Model model, MiaoshaUser user){
model.addAttribute("user",user);
return "goods_list";
}
}

这种方法是无法获取user的值的。

  • 取值    

@Controller
@RequestMapping("/goods")
public class GoodsController { @Autowired
private MiaoshaUserService miaoshaUserService; @RequestMapping("/to_list")
public String list(HttpServletResponse response,Model model,
@CookieValue(value = MiaoshaUserService.COOKI_NAME_TOKEN) String token){ MiaoshaUser user = miaoshaUserService.getByToken(response, token); model.addAttribute("user",user);
return "goods_list";
}
}

获取到cookie的值就可以获取user对象了。

但上述方法不够降低耦合,因此,采用配置参数的方法。

  • 定义一个web的配置类

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{ @Autowired
UserArgumentResolver userArgumentResolver; @Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}
}
  • 配置类的handle方法

public class UserArgumentResolver implements HandlerMethodArgumentResolver {

    @Autowired
MiaoshaUserService userService; @Override
public boolean supportsParameter(MethodParameter methodParameter) {
Class<?> clazz = methodParameter.getParameterType();
return clazz==MiaoshaUser.class;
} @Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class); String paramToken = request.getParameter(MiaoshaUserService.COOKI_NAME_TOKEN);
String cookieToken = getCookieValue(request, MiaoshaUserService.COOKI_NAME_TOKEN);
if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
return null;
}
String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
return userService.getByToken(response, token);
} private String getCookieValue(HttpServletRequest request, String cookiName) {
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies) {
if(cookie.getName().equals(cookiName)) {
return cookie.getValue();
}
}
return null;
} }

对该类进行说明。

WebConfig类是个web的配置类。我们之所以能实现在controller拿到参数的转换值,就是一堆类在内部发挥看不见的作用,而通过WebConfig可以实现,自己配置那些参数的转化,它继承了一个WebMvcConfigurerAdapter类,该类是个抽象类,定义了很多可以配置的方法,而我们对参数进行配置,则只需要添加一个HandlerMethodArgumentResolver接口的实现类。

而第二个类就是该接口的实现类,可以实现具体拿到参数后进行的逻辑操作,比如,在该类中,我们拿到了request、reponse对象,然后得到token在reques的值和cookie中的值。然后,将token对应的user对象取出来。因此,我们在controller类中,只需要配置user的参数就可以取到user的值。

java初探(1)之登录补充的更多相关文章

  1. 李洪强iOS开发本人集成环信的经验总结_08_自动登录补充

    李洪强iOS开发本人集成环信的经验总结_08_自动登录补充 来到Appdelegate里面 01 - 遵守自动登录的代理协议 02 - 设置自动登录的代理 03 - 判断与实现  04 - 代理方法的 ...

  2. [java初探总结篇]__java初探总结

    前言 终于,java初探系列的学习,要告一阶段了,java初探系列在我的计划中是从头学java中的第一个阶段,知识主要涉及java的基础知识,所以在笔记上实在花了不少的功夫.虽然是在第一阶段上面花费了 ...

  3. [java初探10]__关于数字处理类

    前言 在我们的日常开发过程中,我们会经常性的使用到数字类型的数据,同时,也会有众多的对数字处理的需求,针对这个方面的问题,在JAVA语言中.提供解决方法的类就是数字处理类 java中的数字处理类包括: ...

  4. Java 实现 ssh命令 登录主机执行shell命令

    Java 实现 ssh命令 登录主机执行shell命令 1.SSH命令 SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SS ...

  5. java初探(1)之登录总结

    登录总结 前几章总结了登录各个步骤中遇到的问题,现在完成的做一个登录的案例,其难点不在于实现功能,而在于抽象各种功能模块,提高复用性,较低耦合度. 前端页面: 对于前端页面来说,不是后端程序员要考虑的 ...

  6. java初探(1)之登录再探

    https://www.cnblogs.com/lovejune/p/java_login_1.html 上一章内容搭建起了登录应用场景的环境,模拟实现了登录操作,页面与后端数据的交互过程,使用的是异 ...

  7. java初探(1)之登录终探

    上一章讲了表单验证,数据验证和加密.这一章,将研究服务器和数据库的交互过程. 后端服务器有两种主流的形式,SQL数据库和NOSQL数据库.其中MYSQL属于SQL数据库,REDIS属于非SQL数据库. ...

  8. java初探(1)之登录初解

    初识登录 登录的应用场景 登录比较常见,大多数网站都有登录的操作.然后登录本身也从简单到复杂有着漫长的发展历史.本文记录博主对登录的应用场景的剖析,深究不在于学习如何实现,主要关注其编码思想,过程中用 ...

  9. java实现的单点登录

    摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现手段,并且给出Web-SSO ...

随机推荐

  1. 记一次maven打包编译文件一直不正确

    maven打包发现war包解压后的class文件总是跟原Java不一样 后来发现pom中这么写到 <plugins> <plugin> <artifactId>ma ...

  2. 【Python】利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来

    源代码: """ 利用递归函数调用方式,将所输入的字符串,以相反的顺序显示出来 string_reverse_output():反向输出字符串的自定义函数 pending ...

  3. 学习 Python,这 22 个包怎能不掌握?

    如今全球各个行业内 Python 的使用状况怎么样呢? 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去 ...

  4. Python制作AI贪吃蛇,很多很多细节、思路都写下来了!

    前提:本文实现AI贪吃蛇自行对战,加上人机对战,读者可再次基础上自行添加电脑VS电脑和玩家VS玩家(其实把人机对战写完,这2个都没什么了,思路都一样) 实现效果: 很多人学习python,不知道从何学 ...

  5. JavaScript中为什么需要!!?

    1. 布尔值为false的值 在JavaScript中,布尔值为 false的值有如下几个: undefined null false 0 NaN ""或''(空字符串) 2. ! ...

  6. Linux系统安装MySQL详细教程

    首先进入MySQL官网下载rpm安装包 用yum install mysql80-community-release-el7-3.noarch.rpm 安装 yum repolist all|grep ...

  7. Python实现迪杰斯特拉算法

    首先我采用邻接矩阵法来表示图(有向图无向图皆可) 图的定义如下: class Graph: def __init__(self, arcs=[]): self.vexs = [] self.arcs ...

  8. PostgreSQL在没有备份情况下误删除Clog恢复

    创建实验表postgres# create table t (n_id int primary key,c_name varchar(300));CREATE TABLEpostgres# inser ...

  9. 跳转语句—break,continue,goto

    #define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h&g ...

  10. angular中a标签带请求头下载excel

    <!DOCTYPE html> <html lang="en" ng-app="app"> <head> <meta ...