From fdef4e5429bffe9f44af3c0e2a6e159f32b00cfc Mon Sep 17 00:00:00 2001 From: "@t2652009480" <2652009480@qq.com> Date: Sat, 19 Aug 2023 13:28:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=AE=E5=BD=95=E7=9A=84?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++ .../zhiyun03/filter/LoginCheckFilter.java | 79 +++++++++++++++++++ .../zhiyun/zhiyun03/filter/LoginFilter.java | 50 ------------ .../service/impl/TextualServiceImpl.java | 2 +- .../user/controller/UserController.java | 11 ++- .../zhiyun03/utils/common/ResultCode.java | 4 +- src/main/resources/application.yml | 2 +- .../templates/layui-v2.6.8/index.html | 4 +- .../templates/layui-v2.6.8/login.html | 11 +-- 9 files changed, 104 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/zhiyun/zhiyun03/filter/LoginCheckFilter.java delete mode 100644 src/main/java/com/zhiyun/zhiyun03/filter/LoginFilter.java diff --git a/pom.xml b/pom.xml index 696d351..42172eb 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,12 @@ spring-boot-starter-web + + com.alibaba + fastjson + 1.2.76 + + org.projectlombok lombok diff --git a/src/main/java/com/zhiyun/zhiyun03/filter/LoginCheckFilter.java b/src/main/java/com/zhiyun/zhiyun03/filter/LoginCheckFilter.java new file mode 100644 index 0000000..8bcdcee --- /dev/null +++ b/src/main/java/com/zhiyun/zhiyun03/filter/LoginCheckFilter.java @@ -0,0 +1,79 @@ +package com.zhiyun.zhiyun03.filter; + +import com.alibaba.fastjson2.JSON; +import com.zhiyun.zhiyun03.utils.common.JsonResult; +import com.zhiyun.zhiyun03.utils.common.ResultCode; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.AntPathMatcher; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @description: 检查用户是否已经完成登录 + * @author: Jie + * @date: 2022/8/10 9:48 + **/ +@WebFilter(filterName = "LoginCheckFilter", urlPatterns = "/*") +@Slf4j +public class LoginCheckFilter implements Filter { + + /** + * 路径匹配器,支持通配符 + */ + public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher(); + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; + String requestURI = request.getRequestURI(); + log.info("拦截到请求,{}", requestURI); + + //2、判断本次请求是否需要处理 + //定义不需要处理的请求路径 + String[] urls = new String[]{ + "/user/login", + "/user/logout", + "/layui/**", + "/front/**" + }; + boolean check = check(urls, requestURI); + + //3、如果不需要处理,则直接放行 + if (check) { + log.info("本次请求{}不需要处理", requestURI); + filterChain.doFilter(request, response); + return; + } + + //取出token + String token = request.getHeader("token"); + //第一次登录没有token,给null会报错,所以我们判断一下token是否为空,为空给一个空串 + //三元运算 + token = token==null?"":token; + //4、判断登录状态,如果已登录,则直接放行 + if (token!= null) { +// log.info("用户已登录,用户id为:{}", request.getSession().getAttribute("USER")); + filterChain.doFilter(request, response); + return; + } + log.info("用户未登录"); + //5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据 + response.getWriter().write(JSON.toJSONString(JsonResult.error(ResultCode.ERROR,"用户未登录"))); + return; + } + + public boolean check(String[] urls, String requestURI) { + for (String url : urls) { + boolean match = PATH_MATCHER.match(url, requestURI); + if (match) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/com/zhiyun/zhiyun03/filter/LoginFilter.java b/src/main/java/com/zhiyun/zhiyun03/filter/LoginFilter.java deleted file mode 100644 index 24f4a98..0000000 --- a/src/main/java/com/zhiyun/zhiyun03/filter/LoginFilter.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.zhiyun.zhiyun03.filter; - -import javax.servlet.*; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -//@WebFilter(urlPatterns = "*")//表示所有请求都走这个过滤器(可以用来设置编码) -public class LoginFilter implements Filter { - @Override - public void init(FilterConfig filterConfig) throws ServletException { - //服务器启动时执行init方法 - } - - @Override//有请求就执行,且无论是前端到后端还是后端到前端都会走过滤器,真的很形象(就像量有滤网的水杯,装水和倒水都会经过滤网,前提是你有滤网(过滤器)) - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - //filter是抽象类,所以要强转 - HttpServletRequest request = (HttpServletRequest) servletRequest; - HttpServletResponse response = (HttpServletResponse) servletResponse; - //统一资源标识符(Uniform Resource Identifier)得到一个uri - //URI和URL都定义了资源是什么,但URL还定义了该如何访问资源。URL是一种具体的URI,它是URI的一个子集,它不仅唯一标识资源,而且还提供了定位该资源的信息。URI 是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,是绝对的。 - //只要能唯一标识资源的就是URI,在URI的基础上给出其资源的访问方式的就是URL - String requestURI = request.getRequestURI(); - System.out.println("requestURI=" + requestURI); - //这个user得先存才能取(作用范围是session,也就是其存值时是存于session中的) - Object user = request.getSession().getAttribute("USER"); - System.out.println(user);//只是打印在控制台,为了测试 - if (ignore(requestURI) || user != null)//满足其一就让其通过 - filterChain.doFilter(request, response); - else - response.sendRedirect("/login.html");//重定向到login.jsp页面 - } - - private boolean ignore(String requestURI) { - //login请求 和 login.jsp页面 要让行,不然永远无法登录 - String[] uris = {"login", "login.html"}; - for (String u : uris) { - if (requestURI.endsWith(u)) - //只能用上面的方式,不然会一直输出下面两行 - // requestURI=/login.jsp - //null - //if (u.endsWith(requestURI)) - return true; - } - return false; - } -} - - \ No newline at end of file diff --git a/src/main/java/com/zhiyun/zhiyun03/textual/service/impl/TextualServiceImpl.java b/src/main/java/com/zhiyun/zhiyun03/textual/service/impl/TextualServiceImpl.java index e33abaf..3e81ab8 100644 --- a/src/main/java/com/zhiyun/zhiyun03/textual/service/impl/TextualServiceImpl.java +++ b/src/main/java/com/zhiyun/zhiyun03/textual/service/impl/TextualServiceImpl.java @@ -86,7 +86,7 @@ public class TextualServiceImpl extends ServiceImpl impl Textual textual = convertUtil.VoToEntity(textualVo, Textual.class); //根据目录名称查询目录id QueryWrapper qwd=new QueryWrapper<>(); - qwd.lambda().eq(Directory::getDirName,textualVo.getDirName()); + qwd.lambda().eq(Directory::getDirName,textualVo.getDirName()).eq(Directory::getDirIden,4); Directory directory = directoryMapper.selectOne(qwd); //将目录id封装到实体类 textual.setDirId(directory.getId()); diff --git a/src/main/java/com/zhiyun/zhiyun03/user/controller/UserController.java b/src/main/java/com/zhiyun/zhiyun03/user/controller/UserController.java index 4ca7e31..58569d1 100644 --- a/src/main/java/com/zhiyun/zhiyun03/user/controller/UserController.java +++ b/src/main/java/com/zhiyun/zhiyun03/user/controller/UserController.java @@ -23,6 +23,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; +import java.util.UUID; @RestController @RequestMapping("/user") @@ -37,9 +38,17 @@ public class UserController { } User login = userService.login(username, password); if (login != null) { + String token = UUID.randomUUID()+""; request.getSession().setAttribute("USER", login); - return JsonResult.success(ResultCode.SUCCESS); + return JsonResult.success(token); } return JsonResult.error(ResultCode.USER_ACCOUNT_ERROR, "账号或密码错误"); } + + @PostMapping("/logout") + public JsonResult loginOut(HttpServletRequest request){ + // 去除session + request.getSession().removeAttribute("USER"); + return JsonResult.success("退出成功"); + } } diff --git a/src/main/java/com/zhiyun/zhiyun03/utils/common/ResultCode.java b/src/main/java/com/zhiyun/zhiyun03/utils/common/ResultCode.java index 3253cea..4c4f8c8 100644 --- a/src/main/java/com/zhiyun/zhiyun03/utils/common/ResultCode.java +++ b/src/main/java/com/zhiyun/zhiyun03/utils/common/ResultCode.java @@ -4,11 +4,11 @@ public enum ResultCode { SUCCESS("200", "成功"), Fail("500","失败"), - ERROR("-1", "NOTLOGIN"), + ERROR("1", "NOTLOGIN"), PARAM_ERROR("1001", "参数异常"), USER_EXIST_ERROR("2001", "用户已存在"), USER_ACCOUNT_ERROR("2002", "账号或密码错误"), - USER_NOT_EXIST_ERROR("2003", "未找到用户"), + USER_NOT_EXIST_ERROR("2003", "请先登录"), NO_NULL_ERROR("3001", "账号或密码不能为空"), PARAM_LOST_ERROR("2004", "参数缺失"), PARAM_PASSWORD_ERROR("2005", "原密码输入错误"), diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 8f27ab5..0befe0c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -19,7 +19,7 @@ spring: druid: url: jdbc:mysql://localhost:3306/zhiyun?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username: root - password: root + password: 123456 thymeleaf: cache: false prefix: classpath:/templates diff --git a/src/main/resources/templates/layui-v2.6.8/index.html b/src/main/resources/templates/layui-v2.6.8/index.html index 4f275bd..6c6eb1b 100644 --- a/src/main/resources/templates/layui-v2.6.8/index.html +++ b/src/main/resources/templates/layui-v2.6.8/index.html @@ -17,9 +17,7 @@ tester
-
Your Profile
-
Settings
-
Sign out
+
退出
  • diff --git a/src/main/resources/templates/layui-v2.6.8/login.html b/src/main/resources/templates/layui-v2.6.8/login.html index 4a66899..fbfc471 100644 --- a/src/main/resources/templates/layui-v2.6.8/login.html +++ b/src/main/resources/templates/layui-v2.6.8/login.html @@ -53,22 +53,19 @@ type:"post", success:function(result){ console.log(result); - if (result.msg==='success'){ + if (result.data!=null && result.data!= ''){ layer.msg(result.tip,{icon:1,time:100},function () { + localStorage.token=result.data; location.href="http://localhost:63342/zhiyun/src/main/resources/templates/layui-v2.6.8/index.html" }) - }else if (result.type==='error'){ - layer.msg(result.tip) }else { - layer.msg('未知异常,请联系管理员') + layer.msg(result.msg) + // location.href="http://localhost:63342/zhiyun/src/main/resources/templates/layui-v2.6.8/login.html" } }, }) }); - - - });