实现Filter有几种方法
1、通过注解方法@WebFilter("/*") //拦截登录路径,如果将该类加入到bean容器中时,会使得所有的路径都会被拦截。
package com.example.reggie.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.reggie.vo.DataView;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.util.AntPathMatcher;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(filterName = "ccFilter",urlPatterns = "/*")
@Slf4j
public class ReggieFilter implements Filter {
//需要放行的路径,可以放在配置文件中
private String release[] = {"/employee/login","/employee/logout","/backend/**","/front/**","/favicon.ico"};
//路径匹配的对象,可以匹配通配符
private final static 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);
//如果请求路径为应该放行的路径则直接放行例如:登录、登出、resources等
Boolean releases = getReleases(requestURI);
if(releases)
{
log.info("直接放行路径{}",requestURI);
filterChain.doFilter(request,response);
return;
}
//如果不是放心路径则判断用户是否已经登录,登录则直接放行
Object employee = request.getSession().getAttribute("employee");
if(employee != null)
{
log.info("直接访问.....");
filterChain.doFilter(request,response);
return;
}
log.info("页面重定向.......");
//剩余的则是没有登录,不允许放行的,需要重定向将页面转发到登录界面。
response.getWriter().write(JSON.toJSONString(DataView.fail(0,"NOTLOGIN",null)));
}
private Boolean getReleases(String requestUrl)
{
for (String url : release)
{
boolean match = PATH_MATCHER.match(url, requestUrl);
if(match)
{
return true;
}
}
return false;
}
}
2、通过在springboot的configuration中配置不同的FilterRegistrationBean实例,来注册自定义过滤器
package com.example.reggie.config;
import com.example.reggie.util.ReggieFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//@Configuration
public class FilterConfig{
@Bean
public FilterRegistrationBean<ReggieFilter> filterRegistrationBean ()
{
FilterRegistrationBean<ReggieFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new ReggieFilter()); //自定义过滤器
bean.addUrlPatterns("/*"); //过滤所有路径,交由自定义过滤器处理
bean.setOrder(1); //优先级,如果有几个过滤器,则根据优先级来执行,默认是5,越小则优先级越大
return bean;
}
}