在项目中,当我们完成登录功能时,我们需要编写一个过滤器或者拦截器去防止用户在没有登录的情况下直接访问首页,以下我们用过滤器来实现该功能。
接下来我们来介绍一下过滤器:
过滤器(Filter)
概念:
Filter:过滤器,是一个接口,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
作用:
过滤器Filter可以把对资源的请求拦截下来,从而实现一些通用的操作,如:权限控制、统一编码处理、敏感字符处理等。
使用方法:
实现接口 :
定义Filter的实现类,并重写doFilter方法;
【注意】实现Filter接口导包时,导的是javax.servlet.*。
配置所需拦截的路径:如
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
这里是通过@WebFilter标签进行路劲的设置,其中filterName是过滤器的名称,urlPatterns是所需要拦截的路劲。我这里是拦截所有请求路劲。
发行:
对资源进行处理后,放行(doFilter())资源。
通过重写Filter中的doFilter()方法,进行响应和请求资源进行放行。例如:当check()方法为turn时方法执行filterChain.doFilter(request,response);对该资源进行放行
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request= (HttpServletRequest) servletRequest;
HttpServletResponse response= (HttpServletResponse) servletResponse;
if (check(urls,url)){
log.info("本次请求{}不需要处理",url);
//直接放行
filterChain.doFilter(request,response);
return;
}
}
实现过滤器的完整代码:
@Slf4j
//引入WebFilter标签设置过滤器名称,并设置拦截路劲
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
//定义路劲比较类AntPathMatcher专门对url进行比较
AntPathMatcher antPathMatcher=new AntPathMatcher();
//重写doFilter方法
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request= (HttpServletRequest) servletRequest;
HttpServletResponse response= (HttpServletResponse) servletResponse;
//获取url
String url=request.getRequestURI();
//定义不需要拦截的url
String [] urls=new String[]{
"/employee/logout",
"/backend/**",
"/front/**"
};
//判断是否需要拦截
if (check(urls,url)){
log.info("本次请求{}不需要处理",url);
//直接放行
filterChain.doFilter(request,response);
return;
}
//4、判断登录状态,如果已登录,则直接放行
if(request.getSession().getAttribute("employee") != null){
filterChain.doFilter(request,response);
return;
}
//5、如果未登录则返回未登录结果,通过输出流方式向客户端页面响应数据
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
public boolean check(String []urls,String url) {
for (String s : urls) {
boolean match = antPathMatcher.match(s, url);
if (match){
return true;
}
}
return false;
}
}