Filtro y escucha de JavaWeb
Configuración de filtro detallada
Mecanismo de seguimiento de eventos
Caso de interceptación de inicio de sesión mediante filtro
Filtro: filtrar
Filtro: Al acceder a los recursos del servidor, el filtro puede interceptar la solicitud y realizar algunas funciones especiales. Generalmente se usa para completar operaciones comunes. Tales como: verificación de inicio de sesión, procesamiento de codificación unificado, filtrado de caracteres sensibles ...
El filtro es equivalente a un filtro entre el navegador y el recurso Web. Antes de acceder al recurso, la solicitud se modifica, juzga e intercepta a través de una serie de filtros, y la respuesta también se puede modificar, juzgar e interceptar.
Proceso de implementación:
-
El cliente envía una solicitud, primero pasa por el filtro, si el filtro está permitido, luego puede ir al servlet
-
Si hay varios filtros, se pondrán en cola de acuerdo con el orden de asignación registrado. Mientras haya un filtro que no esté permitido, los filtros posteriores y nuestro servlet no recibirán la solicitud.
Cómo utilizar :
1. Defina una clase que implemente la interfaz Filter.
2. Reescribe el método (ejecuta la acción de interceptación)
3. Configure la ruta de interceptación: use la anotación @WebFilter o web.xml
@WebFilter("/*")//访问所有资源之前,都会执行该过滤器
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//过滤器初始化的方法,一般用于申请资源
// init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//执行拦截的动作,具体的拦截逻辑写在这里
//doFilter:每一次请求被拦截资源时,会执行。执行多次
System.out.println("filterDemo1被执行了....");
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
//过滤器销毁的方法,一般用于释放资源
//destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
}
}
Configuración de filtro detallada
Configuración de la ruta de interceptación:
1. Ruta de recurso específica: /index.jsp El filtro solo se ejecutará cuando se acceda al recurso index.jsp
2. Directorio de intercepción: / usuario / * Al acceder a todos los recursos en / usuario, se ejecutará el filtro
3. Intercepción de nombre de sufijo: * .jsp Al acceder a todos los recursos con el nombre de sufijo jsp, se ejecutará el filtro
4. Interceptar todos los recursos: / * Cuando se acceda a todos los recursos, se ejecutará el filtro
Oyente: oyente
Un componente especial definido en la especificación de Servlet se utiliza para escuchar los eventos generados por el contenedor de Servlet y procesarlos en consecuencia.
Mecanismo de seguimiento de eventos
* Evento: una cosa
* Fuente del evento: el lugar donde ocurrió el evento.
* Oyente: un objeto
* Oyente registrado: vincule el evento, la fuente del evento y el oyente juntos. Cuando ocurre un evento en la fuente del evento, ejecute el código de escucha
ServletContextListener
El ServletContextListener será notificado cuando se cree y cierre el ServletContext.
El oyente debe configurarse en web.xml.
Cómo utilizar :
1. Defina una clase que implemente la interfaz ServletContextListener.
2. Método de reescritura.
3.Haz la configuración
ServletContextListener:监听ServletContext对象的创建和销毁
* 方法:
* void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
* void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
Caso de interceptación de inicio de sesión mediante filtro
@WebFilter("*.jsp")
public class FilterTest1 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//判断是否已经登录了,如果没有登录就需要跳转到登录界面,但是如果访问的资源路径本来
//就是登录页面,那么就不需要拦截了,这里需要进行判断排除
//记得强制转型
HttpServletRequest request = (HttpServletRequest)req ;
//获取session对象,看看对应的属性是否有值
HttpSession session = request.getSession();
Object login = session.getAttribute("login");
//获取url路径,看看里面是否是登录资源相关的
String requestURI = request.getRequestURI();
//在过滤掉登录相关时,一定要排除一些js,css文件
if (login != null || requestURI.contains("/longin.jsp") || requestURI.contains("/css/") ||
requestURI.contains("/js/") || requestURI.contains("/fonts/") ) {
chain.doFilter(req, resp);
} else {
request.getRequestDispatcher("/longin.jsp").forward(request, resp);
}
}
public void init(FilterConfig config) throws ServletException {
}
}