一、Listener
1、Listener 主要作用于整个javaweb程序中,有几种常用监听器
ServletContextListener 这类监听器主要是监听于在javaWeb 程序的部署时和结束的操作,可用于你希望在程序启动前干啥,比如重新contextInitialized 方法可以在此处初始化 servlet 上下文相关数据重写contextDestroyed可以在此处操作在javaweb结束后想做的操作
HttpSessionListener这个监听器主要是监听Session的,这个可以监听通过重写sessionCreated和sessionDestroyed可以分别监听创建的session和销毁的session,统计在线用户数和下线用户HttpSessionAttributeListenerHttpSessionAttributeListener则用于监听HttpSession(session)范围内属性的变化
2、在idea创建Listener步骤
会自动实现三个监听器
会自动默认使用@WebListener() 注解,如果不用注解可以在web.xml配置
二、Filter过滤器处于客户端和服务器端资源之间,对所有的请求或者响应进行拦截操作
一般用于完成通用的操作,如:登录验证、统一编码处理、敏感字符过滤
1、登录拦截例子
1.1、idea创建filter
idea新建的filter默认也是使用注解方式,也可以不使用注解,在web.xml配置
注意url-pattern,这个主要是配置你想要拦截的 请求url,“/*"表示所有ur都会拦截
1.2、重写doFilter()实现拦截,,例子以登录为例,重写的的代码部分为
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
System.out.println(" req.getRequestURI() "+request.getRequestURI());
// 获取请求地址
String requestURI = request.getRequestURI().substring(request.getRequestURI().indexOf("/", 1),
request.getRequestURI().length());
System.out.println("====================requestURI"+requestURI);
// 登陆页面和接口放开限制,否则死循环
if ("/jstl/login.jsp".equals(requestURI) || "/login".equals(requestURI)) {
chain.doFilter(request, response);
} else {
// 默认不开启
HttpSession session = request.getSession(false);
// 如果session中没有用户信息,拦截返回登陆页面
if (session == null || session.getAttribute("name") == null) {
response.sendRedirect(request.getContextPath() + "/jstl/login.jsp");
// 返回
return;
} else {
chain.doFilter(request, response);
}
}
}
下面把login 的请求和login的jsp代码也贴进来
login接口,首先访问的时候会先调用doget请求,所以要记得在doget请求 要写一个跳到登录页面的,然后再login.jsp中要配置请求的方法和请求接口
package com.demo.servlert;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet(name = "LoginServlet",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// request.getRequestDispatcher("/jstl/login.jsp").forward(request, response);
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String userName = request.getParameter("uname");
String pwd = request.getParameter("pwd");
if ("admin".equals(userName) && "123".equals(pwd)){
request.setAttribute("uname",userName);
request.setAttribute("pwd",pwd);
HttpSession session = request.getSession();//获取session
session.setAttribute("name", userName);// 将用户名和密码保存在session中
session.setAttribute("pwd", pwd);// 将用户名和密码保存在session中
response.sendRedirect(request.getContextPath()+"/jstl/flag.jsp");
}else {
response.sendRedirect(request.getContextPath()+"/jstl/login.jsp");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/jstl/login.jsp").forward(request, response);
}
}
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
登录页面
最后呈现的效果是,如果密码不对或者session过期,那就会重定向回login.jsp,否则就是会放行



