一、什么是Filter过滤器
二、 为什么要用Filter过滤器
场景: 防止用户未登录就随意访问了网站内部
在实际场景中,我们在开发完成后,为了保证网站的安全性,只有登录后才能访问某些网站内部的页面,如果不进行一层登录的过滤,那么任何人都能通过URL来随意的访问到网站内部的页面,这是不合理的。例如此刻的我网站内部一个页面URL是
http://localhost:8080/sis/public/page/main.html
但是我想让只有登录过的人才能合法的访问到这个页面,此时使用Filter过滤器就能解决这个问题。实现逻辑是通过Session信息判断是否登录了,如果未登录就重定向到登录的首页。
其他:通过对JSP、Servlet、静态图片文件、或静态HTML文件进行拦截,以实现URL级别的权限控制、过虑敏感词汇、压缩响应信息等一些高级功能。
三、如何使用 1. 重写过滤器的三个方法
public class QuickFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("qucikFilterRunning");
//放行请求
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
三个方法都是可以表现 Filter 生命周期的方法,其中 init() 方法在 Web 应用程序加载时会被调用,destroy() 方法在 Web 应用程序卸载(或关闭)时被调用,这两个方法都只会被调用一次,而 () 方法会被调用多次(只要客户端有请求时就会被调用),Filter 所有的工作集中在 () 方法中。
2.使用案例
防止未登录用户访问到网站内部页面,未登录的情况下访问,会进行一个重定向跳转到登录页面。而请求后端非登录接口,不允许访问,一律设置为401
@WebFilter("/*")//模糊匹配 所以的路径都会过滤
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
/** 只要是匹配到了路径,①都先执行doFilter ,②再去执行Servlet*/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse res = (HttpServletResponse) servletResponse;
String uri = req.getServletPath();
// 校验:①前端html拦截 ②非前端的就是后台接口,除了登录接口之外
HttpSession session = req.getSession(false);//没有session时候 返回null
if (session == null) { //没有登录
//首页重定向到登录页面
if ( "/public/page/main.html".equals(uri) ) {
res.setContentType("text/html;charset= UTF-8");
//开始重定向
String schema = req.getScheme();//HTTP
String host = req.getServerName();//服务器ip
int port = req.getServerPort();//端口号
String ctx = req.getContextPath();//项目部署路径 应用上下文 sis
// 错误写法①res.sendRedirect("/public/page/main.html");②res.sendRedirect("public/page/main.html");

String basePath = schema+"://"+host+":"+port+ctx;
res.sendRedirect(basePath+"/public/index.html");//正确写法
return;
//请求后端非登录接口, 未登录不允许访间的请求,一般返回401状态码
}else if ( (!uri.startsWith("/public/")
&& !uri.startsWith("/static/") && !"/user/login".equals(uri))) {
res.setContentType("application/json");
PrintWriter pw = res.getWriter();
Response r = new Response();
r.setCode("ERR401");
r.setMessage("不允许访问");
res.setStatus(401);//设置响应的状态码
pw.println(JSONUtil.write(r)); //响应打到前端
pw.flush();
return;
}
}
filterChain.doFilter( servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
*请认真填写需求信息,我们会在24小时内与您取得联系。