官网网站建设收费,网站方案怎么写,怎么注册免费个人网站,php 导航网站系列文章目录
Spring Boot读取配置文件内容的三种方式 Spring Boot自动配置–如何切换内置Web服务器 SpringBoot项目部署 上述为该系列部分文章#xff0c;想了解更多可看我博客主页哦#xff01; 文章目录系列文章目录前言一、创建自定义过滤器LoginCheckFilter二、在启动类…系列文章目录
Spring Boot读取配置文件内容的三种方式 Spring Boot自动配置–如何切换内置Web服务器 SpringBoot项目部署 上述为该系列部分文章想了解更多可看我博客主页哦 文章目录系列文章目录前言一、创建自定义过滤器LoginCheckFilter二、在启动类上加入注解ServletComponentScan三、完善过滤器的处理逻辑3.1 获取本次请求的URI3.2 判断本次请求是否需要处理3.3 如果不需要处理则直接放行3.4 判断登录状态如果已登录则直接放行3.5 未登录情况处理总结前言
在我们实现完成登录校验功能后当输入正确的用户名和密码就会跳转到首页输入错误信息则不跳转首页。但是我们会发现不进行登录直接在访问路径时直接访问首页的url路径也是可以访问的就是不用输入用户名和密码也是可以访问首页的。那这样我们的登录功能做的就没有太大的意义。所以我们要进一步去拦截它使得用户在不登录时访问不了其他的页面。这里就涉及到了今天的过滤器当然拦截器也是可以实现的我们这篇文章以过滤器为例来完善登录功能。使得用户在没有登录时访问其他页面时会自动跳回登录页面。 一、创建自定义过滤器LoginCheckFilter
首先要新建一个filter包在filter包下创建LoginCheckFilter用来实现检查用户是否已经完成登录操作。 在该类上添加WebFilter注解过滤的注解里面的参数是filterName就是该过滤器的名字urlPatterns是需要拦截的路径这里因为是登录功能所以我们urlPatterns /表示拦截所有路径“”通配符在访问所有路径时都会进入这个函数进行逻辑处理。 然后实现Filter接口下的doFilter方法将servletRequest、servletResponse强转为HttpServletRequest、HttpServletResponse用来后续做逻辑处理时会用到。 代码如下所示
/**** 检查用户是否已经完成登录操作*/
WebFilter(filterName loginCheckFilter,urlPatterns /*)
Slf4j
public class LoginCheckFilter implements Filter {Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request (HttpServletRequest) servletRequest;HttpServletResponse response (HttpServletResponse) servletResponse;}
}二、在启动类上加入注解ServletComponentScan
ServletComponentScan注解用来扫描你创建的自定义过滤器LoginCheckFilter所以要在启动类上加上该注解才会生效。 代码如下所示
Slf4j
SpringBootApplicationServletComponentScan
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class,args);log.info(项目启动成功...);}
}三、完善过滤器的处理逻辑
我们上述两个步骤已经是做完了准备工作但最核心的如何判断用户是否登录以及用户在访问什么页面时需要阻止等逻辑代码还没有编写。所以下面我们就来编写逻辑代码。 在filter包下创建的自定义过滤器LoginCheckFilter中编写核心代码。
3.1 获取本次请求的URI
首先我们要获取用户当前访问页面的URI。“/employee/logout”返回的就是这样的路径。 代码如下
String requestURI request.getRequestURI();然后我们要定义出哪些路径是需要放行的比如用户访问登录页面、静态资源、用户退出等。我们用一个字符串数组存起来。
//直接放行的路径String[] urls new String[]{/employee/login,/employee/logout,/backend/**,/front/**};3.2 判断本次请求是否需要处理
如果是上述直接放行的路径我们则不需要处理不是上述字符串数组中的URI我们就需要做进一步的处理。 但我们怎么判断是不是呢 问题字符串数组中有/backend/**的通配符写法但我们获取到的URI是固定的写法例如“/backend/index.html”。这样就不能直接用等号所对比。 解决根据上述问题我们就有一个spring自带的用来处理路径匹配的方法AntPathMatcher,可以自动的做上述的匹配操作。 所以我们先初始化代码如下
public static final AntPathMatcher PATH_MATCHERnew AntPathMatcher();编写匹配的逻辑,这里我们将检查是不是需要放行的逻辑放到了一个函数里如果需要放行就返回true,不放行就返回false表示字符串数组中的URI没有与之相同的我们需要拦截。 代码如下
public boolean check(String[] urls,String requestURI){for (String url : urls) {boolean match PATH_MATCHER.match(url, requestURI);if(match){return true;}}return false;}3.3 如果不需要处理则直接放行
这里就是字符串数组中匹配到与之相对的URI我们需要放行。 代码如下
if(check){filterChain.doFilter(request,response);return;}3.4 判断登录状态如果已登录则直接放行
如果用户是已经登录状态那么当然可以访问首页等页面所以我们直接放行。就是获取session,查看session中是否有值null就表示用户没有登录。 代码如下
if(request.getSession().getAttribute(employee)!null){filterChain.doFilter(request,response);return;}3.5 未登录情况处理
如果上述的条件都没有满足那么就是用户未登录。 则返回未登录结果,通过输出流方式向客户端页面响应数据因为前端写好了跳转路径所以我们就只需要返回满足前端代码跳转路径的条件即可。这里为了解释清楚我们看一下前端的写法。 前端代码如下 if (res.data.code 0 res.data.msg NOTLOGIN) {// 返回登录页面console.log(---/backend/page/login/login.html---)localStorage.removeItem(userInfo)window.top.location.href /backend/page/login/login.html} else {return res.data}通过上述的js代码我们了解到如果满足条件code0msg为“NOTLOGIN”则会返回登录页面。所以我们只需要返回一个JSON字符串格式的数据数据值为code 0 并且msg NOTLOGIN’即可。 java代码如下 注R是自定义的返回结果类返回的数据就包含了上述的code、msg。 response.getWriter().write(JSON.toJSONString(R.error(NOTLOGIN)));return;总结
上述就是过滤器完善登录功能的全部代码以及实现流程了这样我们在未登录时访问首页就会自动跳转至登录页面要求用户登录。 实现起来其实也不算很难只要记住那些技术要点即可例如路径匹配AntPathMatcher加什么注解等。还有就是逻辑处理的部分将思路理顺后一步一步编写代码每一小步的代码实现起来也不难但合起来的整个逻辑需要仔细的查看理解。 这次的文章到这里就结束了我是心态还需努力呀。我们下篇文章再见