分布式session实现思路及代码

it2026-01-16  12

思路:  登录成功后,生成token来标识用户,写到cookie中,并传到客户端,客户端在随后的访问中都在cookie中传这个token,服务端拿到token后根据这个token获取对应的用户信息。  为了实现分布式session,用redis统一管理session信息。 具体实现: 首先在登录的时候需要生成token并写到cookie中。同时也将token和用户信息存到redis中。这里要注意设置过期时间。

public void addCookie(Customer customer,HttpServletResponse response){ String token = UUIDUtil.getUUID(); redisService.set(CustomerKey.token,token,customer);//标识token对应的哪个客户,将信息存到redis中 Cookie cookie = new Cookie(COOKIE_TOKEN,token); cookie.setMaxAge(CustomerKey.token.getExpireSeconds());//设置过期时间 cookie.setPath("/"); response.addCookie(cookie);//cookie写到客户端 }

登陆后会跳转到商品页面,这里就可以验证一下分布式session是否实现了

/** * * @param model * @param customer 在config.WebConfig里重写了addArgumentResolvers方法,会给customer赋值 * @return */ @RequestMapping("/to_goods_page") public String toPage(Model model, Customer customer){ model.addAttribute("customer",customer); if (customer == null) return "login"; else return "goods"; }

为了让代码看起来更加简洁、清晰,通过重写addArgumentResolvers方法,给customer赋值。

package com.ghk.seckill.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class WebConfig implements WebMvcConfigurer { @Autowired CustomerResolver customerResolver; /** *框架会回调这个方法,往controller里的参数赋值 */ @Override public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { resolvers.add(customerResolver); } } package com.ghk.seckill.config; import com.ghk.seckill.domian.Customer; import com.ghk.seckill.service.CustomerService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Service; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Service public class CustomerResolver implements HandlerMethodArgumentResolver { @Autowired CustomerService customerService; /** *判断是否要做处理,只有返回true才会做处理 */ @Override public boolean supportsParameter(MethodParameter methodParameter) { Class<?> parameterType = methodParameter.getParameterType(); return Customer.class == parameterType; } @Override public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception { HttpServletRequest nativeRequest = nativeWebRequest.getNativeRequest(HttpServletRequest.class); HttpServletResponse nativeResponse = nativeWebRequest.getNativeResponse(HttpServletResponse.class); String parameter = nativeRequest.getParameter(CustomerService.COOKIE_TOKEN); String cookie= getCookieValue(nativeRequest, CustomerService.COOKIE_TOKEN); if (StringUtils.isEmpty(cookie) && StringUtils.isEmpty(parameter)) return null; String token = StringUtils.isEmpty(parameter) ? cookie : parameter; return customerService.getCustomerByToken(token,nativeResponse); } private String getCookieValue(HttpServletRequest request,String cookieName){ Cookie[] cookies = request.getCookies(); for (Cookie cookie :cookies){ if (cookie.getName().equals(cookieName)) return cookie.getValue(); } return null; } }
最新回复(0)