vue-admin-template 登录过滤器Filter,校验session 作者:马育民 • 2022-09-24 09:37 • 阅读:10061 # 废弃 废弃 废弃 ### 废弃原因 本文的代码没有判断是否ajax请求 ### 解决 详见:https://www.malaoshi.top/show_1IX46aIZfaGv.html ----------------------- 需要掌握:[vue-admin-template 目录](https://www.malaoshi.top/show_1IX2LobgPU2c.html "vue-admin-template 目录") # 说明 需要依赖 jackson 库,将 java 对象转成 json字符串 # 代码 ### 登录过滤器 - 跨域时,非简单请求,会发送 `OPTIONS` 请求,需要判断该请求,并直接放行 - 从 `session` 中取出用户信息对象,并判断是否登录 ``` package com.zrgj.epidemic.filter; import com.zrgj.epidemic.pojo.Result; import com.zrgj.epidemic.util.ResponseUtil; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.ArrayList; import java.util.List; @WebFilter(urlPatterns = {"/*"}) public class LoginFilter implements Filter { private static List notFilterList = new ArrayList(); static { notFilterList.add("/login"); } public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; String method = request.getMethod(); System.out.println("method:"+method); //跨域会发送 OPTIONS 请求,该请求header中没有auth,直接放行 if("OPTIONS".equals(method)){ chain.doFilter(req,resp); return; } boolean res = isNotFilter(request); if(res){ chain.doFilter(req,resp); return; } HttpSession session = request.getSession(); if(session.getAttribute("user") == null){ Result result = new Result(); result.setFlag(false); result.setMessage("您未登录或登录超时,请重新登录!"); ResponseUtil.sendJSON(response,result); }else{ chain.doFilter(req, resp); } } /** * 判断该路径是否需要过滤 * @param request false,不需要过滤;true,需要过滤 * @return */ private boolean isNotFilter(HttpServletRequest request){ String servletPath = request.getServletPath(); // 问1:如何在过滤器中,知道访问的是 静态文件(内容不会变的文件:.html、.css、.jpg、.gif) // String uri = request.getRequestURI(); // System.out.println("uri:"+servletPath); // 问2:如何刨除去这些请求,不经过过滤器 for(String item : notFilterList){ item = item.replaceAll("\\.","\\\\."); item = item.replaceAll("\\*","\\.\\*"); boolean res = servletPath.matches(item); if(res){ return true; } } return false; } } ``` ### Result 类 ``` package com.zrgj.epidemic.pojo; import lombok.Data; import java.util.List; @Data public class Result { /** * 0表示成功 */ private int status; private String message; private String code; private E object; private boolean flag; private List list; } ``` ### ResponseUtil 将 java 对象转成 json 字符串,并发送到浏览器 ``` public class ResponseUtil { public static void sendJSON(HttpServletResponse response,Object obj) throws IOException { // 调用 jackson,将javabean转换成json字符串 ObjectMapper om=new ObjectMapper(); String json=om.writeValueAsString(obj); response.getWriter().println(json); } } ``` 原文出处:http://malaoshi.top/show_1IX46aCEJAlV.html