package com.itheima.filter;
import com.alibaba.fastjson.JSON;
import com.itheima.domain.R;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* 登录校验
* 1.判断标记是否存在
* 2.从session中取出来
* 2.
* 存在。放行
* 不存在。则拦截。跳转到登录界面
*/
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
/**
*判断登录标记是否存在:session=> servletRequest(有的是request),而因为这里的类型是ServletRequest,所以要进行强转为HttpServletRequest
*/
HttpServletRequest hsr = (HttpServletRequest)servletRequest;
HttpSession session = hsr.getSession();
Object loginUserSuccess = session.getAttribute("loginUserSuccess");
//放行对应资源文件:前端资源(html、css、js、image)、登录接口、注册接口、
//定义换一个目标数组,把放心的
//判断请求路径,是否包含request.js
String[] ignoreUrls={".html",".css",".js","/img","/element-ui","/login"};
//建个循环
String url = hsr.getRequestURI();
for (String ignoreUrl : ignoreUrls) {
if (url.contains(ignoreUrl)){
//放行
filterChain.doFilter(servletRequest,servletResponse);
return;
}
}
if (loginUserSuccess!=null){
//登录成功,放行
filterChain.doFilter(servletRequest,servletResponse);
//不想让其继续往下执行,所以使用return,结束改方法
return;
}
//如果用户没有登录成功,就跳转回登录界面
//方法一:response,此方法不推荐,因为不知道跳转界面的地址
/* HttpServletRequest resp=(HttpServletRequest) servletResponse;
resp.senndRedirect("");*/
//方法二:返回R对象
R r = R.error("NO LOGIN");
//只能通过手动将R转为json,返回
//使用json工具的toJSONString方法,将R对象转为JSON字符串
String jsonString = JSON.toJSONString(r);
//返回数据:responce有一个方法:getWriter=》writer
servletResponse.getWriter().write(jsonString);
}
}
黑马拦截器学习笔记
最新推荐文章于 2024-05-17 18:09:22 发布