Spring_Session解决Session共享的问题(二十三)下

简介: 三.五 配置静态资源,添加过滤器三.六 配置静态资源三.七 页面跳转 Controller PageController三.八 员工的登录和注销三.九 模拟验证

三.五 配置静态资源,添加过滤器

以前的 MvcConfig 静态资源配置

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
    /**
     * 配置静态的资源信息
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        //映射 static 目录
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        //放置其他 业务页面资源
        registry.addResourceHandler("/**").addResourceLocations("classpath:/templates/");
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry)
    {
        //注册自己的拦截器并设置拦截的请求路径
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }
}

三.六 配置静态资源

三.六.一 static 目录下添加库

8.png

三.六.二 templates 目录下 添加静态页面

login.html 是登录页, main.html 是登录后的展示主页 noPrivilege 是没有权限展示的页面

add delete select update 是 添加,删除,查询,修改的页面,表示 员工的权限。

login.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>登录页面</title>
  <link rel="StyleSheet" href="static/bootstrap/css/bootstrap.css" type="text/css">
  <script type="text/javascript" src="static/jquery-1.11.3.min.js"></script>
  <script type="text/javascript" src="static/bootstrap/js/bootstrap.js"></script>
</head>
<script>
  $(function(){
    $("#submit").click(function(){
      var code=$("#code").val();
      var password=$("#password").val();
      var info=new Object();
      //传入进去,员工的id编号
      info.account=code;
      info.password=password;
      $.post("User/login",info,function(data){
        if(data.code==200){
          alert("登录成功");
          window.location.href="toMain";
        }else{
          alert("用户名或者密码错误");
        }
      },"json")
    })
  })
</script>
<body>
  <div class="col-sm-6 col-sm-offset-3">
    <div style="margin-top:40px;">
      <div class="row col-md-offset-3 ">
        <h3>登录页面</h3>
      </div>
      <div class="row" style="margin-top:30px;">
        <form class="form-horizontal" role="form">
          <div class="form-group">
                <label for="code" class="col-md-3 control-label">用户名:</label>
                <div class="col-md-4">
                  <input type="text" class="form-control" id="code"
                     name="code" value=""/>
                </div>
          </div>
          <div class="form-group">
                <label for="password" class="col-md-3 control-label">密码:</label>
                <div class="col-md-4">
                  <input type="password" class="form-control" id="password"
                     name="password"/>
                </div>
          </div>
          <div class="form-group">
            <div class="col-sm-offset-4">
              <input type="button" value="登录" id="submit" class="btn btn-success"/>
            </div>
          </div>
        </form>
      </div>
    </div>
  </div>
</body>
</html>

main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>登录成功,展示首页</title>
</head>
<body>
    登录成功  <span>
            <a href="javascript:void(0);" onclick="window.location.href='User/logout'">退出</a>
        </span>
</body>
</html>

其他的页面,都是一句话描述

<body>
  抱歉,您没有权限访问!!!
</body>
<body>
  添加用户
</body>
<body>
  删除用户
</body>
<body>
  查询用户
</body>
<body>
  修改用户
</body>

三.七 页面跳转 Controller PageController

@Controller
public class PageController {
    @RequestMapping("/toLogin")
    //跳转到登录页面
    public String toLogin(){
        return "login";
    }
    @RequestMapping("/toMain")
    //跳转到登录页面
    public String toMain(){
        return "main";
    }
    @RequestMapping("/add")
    //跳转到登录页面
    public String add(){
        return "add";
    }
    @RequestMapping("/update")
    //跳转到登录页面
    public String update(){
        return "update";
    }
    @RequestMapping("/select")
    //跳转到登录页面
    public String select(){
        return "select";
    }
    @RequestMapping("/delete")
    //跳转到登录页面
    public String delete(){
        return "delete";
    }
}

三.八 员工的登录和注销

UserController.java

@Controller
@RequestMapping("/User")
public class UserController {
  @Autowired
  private UserService  userService;
  @RequestMapping("/login")
  @ResponseBody
  public OutputResult login(User userInfo, HttpSession session){
    //将请求信息,封装到对象里面。
    Map<String,Object> map=new HashMap<String,Object>();
    //从数据库中查询密码
    User user=userService.findByAccountAndPassword(userInfo.getAccount(),
        userInfo.getPassword());
    if(null==user){
      return OutputResult.fail();
    }
    //说明登录成功,放置到session里面
    session.setAttribute("loginUser",user);
    //模拟设置权限
    List<String> privileges=getPrivilegeByAccount(user.getAccount());
    session.setAttribute("privilegeList_"+user.getId(),privileges);
    //登录成功
    return OutputResult.success(user);
  }
    /**
     * 模拟权限   yzl 有 添加的 权限, zxh有 delete的权限。 都没有 update 的权限
     * @date 2021/10/21 17:39
     * @author zk_yjl
     * @param account 
     * @return java.util.List<java.lang.String> 
     */
  private List<String> getPrivilegeByAccount(String account) {
    List<String> privileges = new ArrayList<>();
    privileges.add("/select");
    privileges.add("/toMain");
        privileges.add("/logout");
    if("yzl".equals(account)){
      privileges.add("/add");
    }else{
      privileges.add("/delete");
    }
    return privileges;
  }
  @RequestMapping("/logout")
  //退出登录
  public String logout(HttpSession session){
    //注销
    session.invalidate();
    return "login";
  }

其中 OutputResult 与以前是一样的.

/**
 * @ClassName:OutputResult
 * @Description 返回的响应实体信息
 * @Author 岳建立
 * @Date 2021/1/1 10:09
 * @Version 1.0
 **/
@Data
public class OutputResult implements Serializable {
    /**
     * @param code 响应代码
     * @param message 响应信息
     * @param data 响应的数据
     */
    private Integer code;
    private String message;
    private Map<String,Object> data=new HashMap<String,Object>();
    /**
     * 构造方法 私有。 避免外部构造
     */
    private OutputResult(){
    }
    /**
     * 成功
     * @return
     */
    public static  OutputResult fail(){
        OutputResult outputResult=new OutputResult();
        outputResult.code=500;
        outputResult.message="失败";
        return outputResult;
    }
    /**
     * 成功
     * @return
     */
    public static  OutputResult success(){
        OutputResult outputResult=new OutputResult();
        outputResult.code=200;
        outputResult.message="成功";
        return outputResult;
    }
    /**
     * 成功
     * @param data  要响应的数据
     * @return
     */
    public static  OutputResult success(Object data){
        OutputResult outputResult=new OutputResult();
        outputResult.code=200;
        outputResult.message="成功";
        outputResult.data.put("result",data);
        return outputResult;
    }
}

三.九 模拟验证

将项目进行打包, 然后启动项目.

9.png

启动 8081 端口的项目

 java -jar learn-1.0-SNAPSHOT.jar --spring.profiles.active=808

启动8082的端口的项目

java -jar learn-1.0-SNAPSHOT.jar --spring.profiles.active=8082

在 8081 项目上 直接 请求 /select 进行查询, 会跳转到登录的页面

10.png

输入正确的用户名和密码, yzl/12345 会登录进去

11.png

可以进行查询

12.png

但是如果是修改和删除的话

13.png14.png

是没有权限的

直接访问 8082 项目,查询 select 用户, 是可以直接访问的

15.png

如果在 8081 项目上 退出登录

16.png

那么在 8081项目上会退出,

同时8082 项目上,也将无法访问

17.png

这是整合 Spring-Session的基本用法。

相关文章
|
存储 NoSQL Java
Spring Session分布式会话管理
Spring Session分布式会话管理
96 0
|
2月前
|
存储 NoSQL Java
Spring Session框架
Spring Session 是一个用于在分布式环境中管理会话的框架,旨在解决传统基于 Servlet 容器的会话管理在集群和云环境中的局限性。它通过将用户会话数据存储在外部介质(如数据库或 Redis)中,实现了会话数据的跨服务器共享,提高了应用的可扩展性和性能。Spring Session 提供了无缝集成 Spring 框架的 API,支持会话过期策略、并发控制等功能,使开发者能够轻松实现高可用的会话管理。
Spring Session框架
|
5月前
|
JSON 前端开发 Java
Spring第一课,了解IDEA里面的文件,回顾Cookie和Session,获取Session,Cookie,Header的方式
Spring第一课,了解IDEA里面的文件,回顾Cookie和Session,获取Session,Cookie,Header的方式
|
6月前
|
负载均衡 NoSQL Java
Spring Boot + Redis 处理 Session 共享
Spring Boot + Redis 处理 Session 共享
65 1
|
6月前
|
存储 NoSQL Redis
spring-session-core排除某些接口不设置session
spring-session-core排除某些接口不设置session
140 0
|
Java Spring
Spring Boot 中的 Session 是什么,如何使用
Spring Boot 中的 Session 是什么,如何使用
|
缓存 NoSQL Java
Spring Session MongoDB管理会话
Spring Session MongoDB管理会话
104 0
|
安全 Java Spring
SpringBoot整合Spring Security,使用Session方式的验证码(六)
这里用到了一个常量类,到时候做验证码判断时用的比较多:
178 0
|
设计模式 缓存 NoSQL
简述 Spring Session 集成 Redis 底层实现及自定义扩展配置
简述 Spring Session 集成 Redis 底层实现及自定义扩展配置
615 0
|
NoSQL Java Redis
Spring Session - 源码解读
Spring Session - 源码解读
293 0