• web页面拦截用户登录,管理session和cookie


    1、模拟用户登录

    首先,用户进行了登录。登录成功之后,服务器记录了一个session,session存储的内容是用户的信息。

    1. /**
    2. * 登录接口
    3. */
    4. @PostMapping(value = "/login")
    5. public String login(UserLoginVO user, RedirectAttributes attributes, HttpSession session) {
    6. // 1.远程调用登录
    7. R r = memberFeignService.login(user);
    8. if (r.getCode() == 0) {
    9. // 2.登录成功,设置session值
    10. MemberResponseVO data = r.getData(new TypeReference() {
    11. });
    12. session.setAttribute(AuthConstant.LOGIN_USER, data);
    13. // 3.重定向,视图可以从session中拿到用户信息
    14. return "redirect:http://gulimall.com:88";
    15. } else {
    16. // 4.登录失败,封装异常信息重定向返回
    17. Map errors = new HashMap<>();
    18. errors.put("msg", r.getData("msg", new TypeReference() {}));
    19. attributes.addFlashAttribute("errors", errors);
    20. return "redirect:http://auth.gulimall.com:88/login.html";
    21. }
    22. }

    session.setAttribute(AuthConstant.LOGIN_USER, data);

    MemberResponseVO.java
    1. package com.pshdhx.common.vo.auth;
    2. import lombok.Data;
    3. import lombok.ToString;
    4. import java.io.Serializable;
    5. import java.util.Date;
    6. @ToString
    7. @Data
    8. public class MemberResponseVO implements Serializable {
    9. private static final long serialVersionUID = 5573669251256409786L;
    10. private Long id;
    11. /**
    12. * 会员等级id
    13. */
    14. private Long levelId;
    15. /**
    16. * 用户名
    17. */
    18. private String username;
    19. /**
    20. * 密码
    21. */
    22. private String password;
    23. /**
    24. * 昵称
    25. */
    26. private String nickname;
    27. /**
    28. * 手机号码
    29. */
    30. private String mobile;
    31. /**
    32. * 邮箱
    33. */
    34. private String email;
    35. /**
    36. * 头像
    37. */
    38. private String header;
    39. /**
    40. * 性别
    41. */
    42. private Integer gender;
    43. /**
    44. * 生日
    45. */
    46. private Date birth;
    47. /**
    48. * 所在城市
    49. */
    50. private String city;
    51. /**
    52. * 职业
    53. */
    54. private String job;
    55. /**
    56. * 个性签名
    57. */
    58. private String sign;
    59. /**
    60. * 用户来源
    61. */
    62. private Integer sourceType;
    63. /**
    64. * 积分
    65. */
    66. private Integer integration;
    67. /**
    68. * 成长值
    69. */
    70. private Integer growth;
    71. /**
    72. * 启用状态
    73. */
    74. private Integer status;
    75. /**
    76. * 注册时间
    77. */
    78. private Date createTime;
    79. /**
    80. * 微博社交账户uid
    81. */
    82. private String weiboUid;
    83. /**
    84. * 社交登录TOKEN
    85. */
    86. private String accessToken;
    87. /**
    88. * 社交登录过期时间
    89. */
    90. private long expiresIn;
    91. }

    2、模拟用户访问需要登录的接口

    首选,该接口必须要被服务器进行拦截,判断使用该接口的用户是否登录过。所以需要配置拦截器

    配置拦截器步骤:

    1、配置拦截器

    1. package com.atguigu.gulimall.order.config;
    2. import com.atguigu.common.constant.Auth.AuthConstant;
    3. import com.atguigu.common.vo.auth.MemberResponseVO;
    4. import org.springframework.stereotype.Component;
    5. import org.springframework.web.servlet.HandlerInterceptor;
    6. import org.springframework.web.servlet.ModelAndView;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. /**
    10. * @author pshdhx
    11. * @date 2022-09-05 18:47
    12. * @Des
    13. * @Method
    14. * @Summary
    15. */
    16. @Component
    17. public class LoginUserInterceptor implements HandlerInterceptor {
    18. public static ThreadLocal loginUser = new ThreadLocal<>();
    19. @Override
    20. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    21. MemberResponseVO attribute = (MemberResponseVO) request.getSession().getAttribute(AuthConstant.LOGIN_USER);
    22. if(attribute != null){
    23. loginUser.set(attribute);
    24. return true;
    25. }else{
    26. //没有登录就去登录
    27. request.getSession().setAttribute("msg","请先进行登录");
    28. response.sendRedirect("http://auth.gulimall.com:88/login.html");
    29. }
    30. return false;
    31. }
    32. @Override
    33. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    34. }
    35. @Override
    36. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    37. }
    38. }

    2、使拦截器在服务器生效

    1. package com.atguigu.gulimall.order.config;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.context.annotation.Configuration;
    4. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    5. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    6. /**
    7. * @author pshdhx
    8. * @date 2022-09-05 18:46
    9. * @Des
    10. * @Method
    11. * @Summary
    12. */
    13. @Configuration
    14. public class OrderWebConfiguration implements WebMvcConfigurer {
    15. @Autowired
    16. private LoginUserInterceptor loginUserInterceptor;
    17. /**
    18. * 配置拦截器生效
    19. * @param registry
    20. */
    21. @Override
    22. public void addInterceptors(InterceptorRegistry registry) {
    23. // 访问任何订单请求需要拦截校验登录
    24. registry.addInterceptor(loginUserInterceptor).addPathPatterns("/**");
    25. }
    26. }

    结果:访问该服务的所有页面时, 都要经过拦截器,判断用户有没有登录。若用户登录,返回true,则能正常运行。如果用户没有登录,则重定向到登录页面。

    3、使得session在整个服务范围内生效

    用户在认证微服务模块登录成功,获取了session,那么如何在订单微服务模块进行生效呢?

    所以需要设置session的生效范围。

    这两个服务都配置如下代码:

    1. package com.atguigu.gulimall.order.config;
    2. import org.springframework.context.annotation.Bean;
    3. import org.springframework.context.annotation.Configuration;
    4. import org.springframework.session.web.http.CookieSerializer;
    5. import org.springframework.session.web.http.DefaultCookieSerializer;
    6. /**
    7. * @author pshdhx
    8. * @date 2022-09-06 8:38
    9. * @Des
    10. * springSession的配置,扩大作用域到整个域名
    11. * @Method
    12. * 需要导入包pom.xml
    13. org.springframework.session
    14. spring-session-data-redis
    15. * @Summary
    16. */
    17. @Configuration
    18. public class PshdhxSpringSessionConfig {
    19. @Bean
    20. public CookieSerializer cookieSerializer(){
    21. DefaultCookieSerializer defaultCookieSerializer = new DefaultCookieSerializer();
    22. defaultCookieSerializer.setDomainName("gulimall.com"); //放大作用域 ?? 如果端口不在会怎么样
    23. defaultCookieSerializer.setCookieName("GULISESSION");
    24. defaultCookieSerializer.setCookieMaxAge(60*60*24*7); //指定cookie的有效期为7天,关闭浏览器cookie即失效
    25. return defaultCookieSerializer;
    26. }
    27. }

    4、配置feign的请求头

    feign远程调用时,是重新构建request请求,会丢失从浏览器访问的带来的cookie,所以需要给新的request请求添加cookie,如此,才有权限访问其他微服务的接口
    1. package com.atguigu.gulimall.order.config;
    2. import feign.RequestInterceptor;
    3. import feign.RequestTemplate;
    4. import org.springframework.context.annotation.Bean;
    5. import org.springframework.context.annotation.Configuration;
    6. import org.springframework.web.context.request.RequestAttributes;
    7. import org.springframework.web.context.request.RequestContextHolder;
    8. import org.springframework.web.context.request.ServletRequestAttributes;
    9. import javax.servlet.http.Cookie;
    10. import javax.servlet.http.HttpServletRequest;
    11. import javax.servlet.http.HttpSession;
    12. /**
    13. * @author pshdhx
    14. * @date 2022-09-06 8:30
    15. * @Des
    16. * feign远程调用时,是重新构建request请求,会丢失从浏览器访问的带来的cookie,所以需要给新的request请求添加cookie
    17. * @Method
    18. *
    19. * @Summary
    20. */
    21. @Configuration
    22. public class PshdhxFeignConfig {
    23. @Bean("requestInterceptor")
    24. public RequestInterceptor requestInterceptor(){
    25. //创建拦截器
    26. return new RequestInterceptor() {
    27. @Override
    28. public void apply(RequestTemplate requestTemplate) {
    29. System.out.println("feign远程调用,拦截器封装请求头,给header添加cookie");
    30. ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    31. if(requestAttributes != null){
    32. HttpServletRequest request = requestAttributes.getRequest();
    33. if(request != null){
    34. //Cookie[] cookies = request.getCookies();
    35. String cookie = request.getHeader("cookie");
    36. requestTemplate.header("Cookie",cookie);
    37. }
    38. }
    39. }
    40. };
    41. }
    42. }

  • 相关阅读:
    Spring Cloud--从零开始搭建微服务基础环境【四】
    碰上这4种项目经理,项目必死无疑!
    【水果派不吃灰】Raspberry Pi树莓派小常识
    Python 无废话-办公自动化Excel修改数据
    令人心动的AI综述(1)
    并行算法优化(1)
    风电光伏混合储能功率小波包分解、平抑前后波动性分析、容量配置、频谱分析、并网功率波动分析(Matlab代码实现)
    如何修改 sensor 输出帧率
    【图论】Dijkstra 算法求最短路 - 构建邻接矩阵(带权无向图)
    TaskDispatcher源码解析
  • 原文地址:https://blog.csdn.net/pshdhx/article/details/126719669