一.实现原理
实现步骤:
1、创建自定义过滤器LoginWebFilter.java
2、在启动类上加入注解@ServletComponentScan,用来扫描web相关的注解
3、完善过滤器的处理逻辑
二.代码实现
首先在main/java/下创建一个filter文件夹用来存储所有过滤器的文件,在此文件夹下创建一个LoginWebFilter.java
接下来在启动类上加入注解@ServletComponentScan,用来扫描web相关的注解
最后 完善过滤器的处理逻辑
过滤器的处理逻辑
LoginWebFilter类
package com.itheima.regiee.filter;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.itheima.regiee.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;
/**
* 检测员工是否登录
*/
@WebFilter(filterName = "loginWebFilter",urlPatterns = "/*")
@Slf4j
public class LoginWebFilter implements Filter {
private static AntPathMatcher pathMatcher=new AntPathMatcher(); //uri自动匹配
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) servletRequest; //强制转换为Httpservlet
HttpServletResponse response=(HttpServletResponse) servletResponse;
/**
* 1、获取本次请求的URI
* 2、判断本次请求是否需要处理
* 3、如果不需要处理,则直接放行
* 4、判断登录状态,如果已登录,则直接放行
* 5、如果未登录则返回未登录结果
*/
//1、获取本次请求的URl
String requestUrl=request.getRequestURI();
//需要定义放行的请求
String[] uris=new String[]{ //这些请求都需要放行
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**"
};
//2、判断本次请求是否需要处理
boolean flag=check(uris,requestUrl);
if(flag){ //本次请求直接放行
filterChain.doFilter(request,response);
return; //如果本次请求不拦截,直接不用走后面的代码了
}
//long id = (long)request.getSession().getAttribute("employee");
//4、判断登录状态,如果已登录,则直接放行,这个attribute是记录是否已经登录的
if(request.getSession().getAttribute("employee")!=null){ //说明已经登录了
filterChain.doFilter(request,response);
return;
}
//5、如果未登录则返回未登录结果
//设置返回json格式,可以看到res.data.msg就是返回的输出流
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
/**
* 路径匹配,如果检验本次请求是否需要放行
* @param uris
* @param requestUrl
* @return
*/
public boolean check(String[] uris,String requestUrl){
for (String s : uris) { //请求的url地址看是否需要放行,其中urlis中的资源都是需要放行的
boolean flag=pathMatcher.match(s,requestUrl);
if(flag){ //匹配上了,说明请求的资源需要放行
return true;
}
}
return false; //说明请求的地址是不能放行的
}
}
R的工具类
package com.itheima.regiee.common;
import lombok.Data;
import java.util.HashMap;
import java.util.Map;
/*
* 通用返回结果,服务端响应的数据最终都会封装成此对象
* */
@Data
public class R<T> {
private Integer code; //编码:1成功,0和其它数字为失败
private String msg; //错误信息
private T data; //数据
private Map map = new HashMap(); //动态数据
public static <T> R<T> success(T object) {
R<T> r = new R<T>();
r.data = object;
r.code = 1;
return r;
}
public static <T> R<T> error(String msg) {
R r = new R();
r.msg = msg;
r.code = 0;
return r;
}
public R<T> add(String key, Object value) {
this.map.put(key, value);
return this;
}
}
前端vue.js