提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
springboot基于过滤器实现用户未登陆不让访问资源
前言
笔记、笔记、笔记
`提示:以下是本篇文章正文内容,下面案例可供参考
一、涉及到的两个注解
@ServletComponentScan:该注解作用在引导类上,告诉springboot我要用注解做一个过滤器了。别的作用如下:
Servlet可以直接通过@WebServlet 注解自动注册
Filter可以直接通过@WebFilter 注解自动注册
Listener可以直接通过@WebListener 注解自动注册
@@WebFilter:作用在自定义的过滤器类上,定义该类是一个过滤器
1.引导类代码
代码如下(示例):
@SpringBootApplication
@ServletComponentScan //使用该注解后才可以定义过滤器
public class ReggieApplication {
public static void main(String[] args) {
SpringApplication.run(ReggieApplication.class, args);
}
}
2.过滤器代码
代码如下(示例):
package com.itheima.reggie.filter;
import com.alibaba.fastjson.JSON;
import com.itheima.reggie.common.R;
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;
/**
* 检查用户是否已经完成登录
*/
@Slf4j //用来在控制台输出内容的.比如log.info("拦截到的请求")
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*") // 表示本类是一个过滤器,相当于servlet或者ssm框架配置文件中的那部分。
//filterName:过滤器的名字,urlPatterns:过滤所有请求
public class LoginCheckFilter implements Filter {
// 路径匹配器,支持通配符。用来对比本次请求是否包含在不需要请求的数组中
public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// init方法会在项目启动,容器初始化的时候就执行。本次用不上。
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 拦截后的请求处理后继续请求需要用的request和response。
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 1.获取本次请求的URI
String requestURI = request.getRequestURI();
// 在控制台输出本次拦截的请求地址
log.info("拦截到的请求 {}"+ request.getRequestURI());
// 2.定义不需要拦截的请求,直接放行
String[] urls = new String[]{
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**"
};
// 3.判断本次请求是否需要处理,check方法是自定义的,在最下面
boolean check = check(urls, requestURI);
// 如果不需要处理,则直接放行
if (check) {
filterChain.doFilter(request, response);
return;
}
// 4. 判断登录状态,如果已经登录,则直接放行
if (request.getSession().getAttribute("employee") != null) {
// 说明已经登陆,则直接放行
filterChain.doFilter(request, response);
return;
}
// 5. 如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
// R对象是所有请求响应的格式。“NOTLOGIN”是前台接受的数据,表示请求失败,重新跳转到登录页。
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
@Override
public void destroy() {
// 该方法是过滤器被销毁是执行。比如项目停止启动
}
/**
* 路径匹配,检查本次请求是否需要放行
* @param urls 不需要拦截的url地址
* @param requestUrl 本次请求的url地址
* @return
*/
public boolean check(String[] urls,String requestUrl) {
for (String url : urls) {
// 判断本次请求是否属于不需要拦截的请求
boolean match = PATH_MATCHER.match(url, requestUrl);
if (match) {
return true;
}
}
return false;
}
}
该处使用的url网络请求的数据。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了springboot使用过滤器的使用。