十七、过滤器
1、过滤器应用场景
过滤器是处于客户端与服务器资源文件之间的一道过滤网,在访问资源文件之前,通过一系列的过滤器对请求进行修改、判断等,把不符合规则的请求在中途拦截或修改。也可以对响应进行过滤,拦截或修改响应。
应用场景: 判断用户是否登录、过滤器请求记录日志、身份验证、权限控制等。
什么是过滤器?拦截过滤请求
过滤器可以减少代码冗余性问题。
2、使用方式
package com.mayikt.filter;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.LogRecord;
@WebFilter("/*")
public class MayiktFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setHeader("Content-type", "text/html;utf-8");
String userName = req.getParameter("userName");
if (!"mayikt".equals(userName)) {
PrintWriter writer = response.getWriter();
writer.print("权限不足");
writer.close();
return;
}
//放行
filterChain.doFilter(req, response);
}
}
3、拦截器路径配置
1.所有资源拦截:@WebFilter(“/*”) //这是指访问所有资源的时候都会经过过滤器
静态资源(css/js/mp4)
2.具体资源路z径拦截:@WebFilter(“/index.jsp”) //这是指访问index.jsp的时候会经过过滤器
3.具体目录拦截:@WebFilter(“/mayik/*”) //这是指访问mayikt目录下的所有资源时会经过过滤器
127.0.0.1:8080/mayikt/A
127.0.0.1:8080/mayikt/B
4.具体后缀名拦截:@WebFilter(“*.jsp”) //这时指访问后缀名为.jsp的资源时会经过过滤器
4、过滤器链
我们过滤器1执行完毕之后 在执行过滤器2
注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序
5、使用过滤器验证会话信息
需求:使用过滤器验证用户的会话信息,判断用户是否已经登录 如果 没有登录的话 则跳转到登录页面。排查“loginServlet、RegisterServlet”
package com.mayikt.filter;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter("/*")// 过滤器所有的请求
public class UserSessionFilter implements Filter {
private String[] excludeUrls = new String[]{"/login", "/register", "/VerifycodeServlet"};
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 从session获取到用户的会话信息 判断用户是否登录过
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
// 定义一个数组 哪些 请求是需要排除的
for (int i = 0; i < excludeUrls.length; i++) {
String excludeUrl = "/mayikt_session_war_exploded" + excludeUrls[i];
String requestURI = httpServletRequest.getRequestURI();
if (excludeUrl.equals(requestURI)) {
// 放行请求
filterChain.doFilter(httpServletRequest, httpServletResponse);
return;
}
}
// 排除请求
HttpSession session = httpServletRequest.getSession();
Object user = session.getAttribute("user");
if (user == null) {
// 当前用户没有登录或者登录会话失效
// 重定向到登录页面
httpServletResponse.sendRedirect("/mayikt_session_war_exploded/login");
return;
}
// 用户已经登录了 正常放行请求
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
}
十八、获取当前上下文
request.contextPath();
十九、监听器
1. 监听器Listener就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
2. Listener是Servlet的监听器,可以监听客户端的请求,服务端的操作等。
3. Listener实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等.
1.ServletContext监听
ServletContextListener:用于对Servlet整个上下文进行监听;
ServletContextAttributeListener:对Servlet上下文属性的监听。
2.Session监听
HttpSessionListener接口:对Session的整体状态的监听;
HttpSessionAttributeListener接口:对session的属性监听。
3.Request监听
ServletRequestListener:用于对Request请求进行监听;
ServletRequestAttributeListener:对Request属性的监听。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/81324.html