过滤器:Filter(重点)
Filter:过滤器,用来过滤网站的数据;
- 处理中文乱码
- 登录验证…
步骤:
-
导包
-
编写过滤器:注意:导包不要错(javax.servlet下的)
实现Filter接口,重写对应的方法:
import javax.servlet.*; import java.io.IOException; public class CharacterEncodingFilter implements Filter { //初始化:web服务器启动,就已经初始化了;随时等待过滤器对象的出现 public void init(FilterConfig filterConfig) throws ServletException { System.out.println("CharacterEncodingFilter初始化"); } //Chain:链 /* 1. 过滤器中的所有代码,在过滤特定请求的时候都会执行 2. 必须要让过滤器继续同行 */ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset=UTF-8"); System.out.println("CharacterEncodingFilter执行前......"); filterChain.doFilter(servletRequest,servletResponse); //使我们的程序继续执行,如果不写,程序到这里会被拦截停止 System.out.println("CharacterEncodingFilter执行前......"); } //销毁:web服务器关闭时,过滤会销毁 public void destroy() { System.out.println("CharacterEncodingFilter销毁"); } }
-
在web.xml中配置Filter
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>com.lb.filter.CharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <!--只要是/servlet下的任何请求,都会经过这个过滤器--> <url-pattern>/servlet/*</url-pattern> <!--整个网站都会经过这个过滤器--> <!--<url-pattern>/*</url-pattern>--> </filter-mapping>
监听器:Listener
实现一个监听器的接口:有很多种
以Session为例,步骤:
-
编写一个监听器
实现监听器的接口
import javax.servlet.ServletContext; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; //统计在线人数:统计session个数:一个session代表一个用户 public class OnlineCountListener implements HttpSessionListener { //创建session监听 //一旦创建session就会触发一次这个事件 public void sessionCreated(HttpSessionEvent httpSessionEvent) { ServletContext ctx = httpSessionEvent.getSession().getServletContext(); System.out.println(httpSessionEvent.getSession().getId()); //只要进来就输出一个Id Integer onlineCount= (Integer) ctx.getAttribute("统计在线人数"); if (onlineCount == null) { //如果在线人数为空,就加1 onlineCount = new Integer(1); } else { int count = onlineCount.intValue(); onlineCount = new Integer(count + 1); } ctx.setAttribute("统计在线人数", onlineCount); } //销毁session监听 //一旦销毁session就会触发一次这个事件 public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { ServletContext ctx = httpSessionEvent.getSession().getServletContext(); Integer onlineCount= (Integer) ctx.getAttribute("统计在线人数"); if (onlineCount == null) { //如果在线人数为空,就加1 onlineCount = new Integer(0); } else { int count = onlineCount.intValue(); onlineCount = new Integer(count - 1); } ctx.setAttribute("统计在线人数", onlineCount); } } /* Session销毁: 1.手动销毁:getSession().invalidate(); 2.自动销毁:在web.xml中配置 */
补充:Session销毁:1.手动销毁:getSession().invalidate();
2.自动销毁:在web.xml中配置
<!--session自动销毁--> <session-config> <!--1分钟后session销毁--> <session-timeout>1</session-timeout> </session-config>
-
web.xml注册监听器
<!--注册监听器--> <listener> <listener-class>com.lb.listener.OnlineCountListener</listener-class> </listener>
Filter实现权限拦截
//登录
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取前端请求的参数
String username = req.getParameter("username");
if (username.equals("admin")) { //登录成功
req.getSession().setAttribute(Constant.USER_SESSION,req.getSession().getId());
resp.sendRedirect("/sys/success.jsp");
} else { //登陆失败
resp.sendRedirect("/error.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//登录失败
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object user_session = req.getSession().getAttribute(Constant.USER_SESSION);
if (user_session != null) {
req.getSession().removeAttribute(Constant.USER_SESSION);
resp.sendRedirect("/Login.jsp");
} else {
resp.sendRedirect("/Login.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//添加过滤器
public class SysFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
if (request.getSession().getAttribute(Constant.USER_SESSION) == null) {
response.sendRedirect("/error.jsp");
}
filterChain.doFilter(servletRequest, servletResponse); //Chain:链:让程序继续往下走
}
public void destroy() {
}
}