本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
如果知道系统中的某些页面时,我们跳过登录就能访问该页面,这时就用到了过滤器
过滤器
过滤器:即Filter,是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件前,通过一些列的过滤器对请求进行修改、判断等,把不符合规则的请求拦截或修改。也可以对响应进行过滤、拦截或修改响应
常见的过滤器
- 字符集过滤器:给全站添加统一的UTF-8字符集
- URL过滤器:实现不登录不能使用
- 缓存过滤器:禁止浏览器缓存所有动态页面
作用
一般用于登录权限的验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重用
注意:
过滤器并不是越多越好,也不是所有的模块都要用上,结合实际的业务逻辑需求巧妙的使用
编码集过滤器
/**
* @author : lupingzhao
* @desc : 编码集过滤器:目的为项目中每一个URL设置统一的编码集
* @date : 21:54 2021/6/19
*/
@WebFilter(filterName = "CharacterEncodingFilter", urlPatterns = "/manage/*")
public class CharacterEncodingFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
System.out.println("初始化(编码集过滤器)");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("开始过滤(编码集过滤器)");
//获取request、response对象
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
public void destroy() {
System.out.println("开始销毁(编码集过滤器)");
}
}
Session过滤器(过滤未登录的用户)
@WebFilter(filterName = "SessionFilter", urlPatterns = "/manage/*")
public class SessionFilter implements javax.servlet.Filter {
public void init(FilterConfig config) throws ServletException {
System.out.println("SessionFilter初始化");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("SessionFilter开始过滤");
//1.获取request、response对象
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
//2.获取特权页面
String path = request.getServletPath(); // 获取访问的Servlet路径
System.out.println("path:" + path);
if (("/manage/login.jsp".equals(path) || ("/manage/manager.do".equals(path)))) {
chain.doFilter(request, response); // 放行
return;
}
//3.过滤session(判断session域对象中是否有值)
HttpSession session = request.getSession();
if (session.getAttribute("user") == null) {
System.out.println("没有登录");
request.setAttribute("error", "您没有登录"); // 将错误信息存储到request域对象中
request.getRequestDispatcher("/manage/error.jsp").forward(request, response);
return;
} else {
System.out.println("登录成功了。。。。");
chain.doFilter(request, response);
return;
}
}
public void destroy() {
System.out.println("SessionFilter销毁");
}
}