0
点赞
收藏
分享

微信扫一扫

Filter筛选与Listener监听的使用

梦幻之云 2022-04-24 阅读 83

Filter过滤器的使用

以指定资源匹配。例如"/index.jsp"
以目录匹配。例如"/servlet/*"
以后缀名匹配,例如"*.jsp"
通配符,拦截所有web资源。"/*"

 自动登录 未登录拦截到登录界面

Servlet界面

package com.zking.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String auto = request.getParameter("auto"); // 是否自动登录

		if ("admin".equals(username) && "123".equals(password)) {// 如果登录成功
			request.getSession().setAttribute("username", username);
			if (auto == null) {// 未勾选自动登录
				Cookie cookie = new Cookie("auto", null);
				cookie.setMaxAge(60 * 60 * 24);// cookie有效时间
				response.addCookie(cookie);
			} else {// 勾选自动登录
				Cookie cookie = new Cookie("auto", username + "_" + password);
				cookie.setMaxAge(60 * 60 * 24);// cookie有效时间
				response.addCookie(cookie);
			}
			// 登录成功,跳转
			response.sendRedirect("index.jsp");
		} else {
			// 未登录成功,重新登录
			response.sendRedirect("login.jsp");
		}
	}

}

监听器 Filter 

package com.zking.servlet;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.zking.utils.CookieUtil;

public class LoginFilter implements Filter {

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        if(req.getRequestURI().contains("login.jsp")) {//如果访问login,直接放行
            chain.doFilter(req, resp);
            return;
        }else {
            String username = (String) req.getSession().getAttribute("username");
            if(username==null) {//sesion中没有,去Cookie中找
                String val = CookieUtil.getCookieValByKey("auto", req);
                if(val!= null&& !val.equals("")) {
                    String name = val.split("_")[0];
                    String pass = val.split("_")[1];

                    if("admin".equals(name) && "123".equals(pass)) {//重新验证登录
                        req.getSession().setAttribute("username", name);//登录成功,放入Session,并放行
                        chain.doFilter(req, resp);
                        return;
                    }else {//验证失败,重新登录
                        resp.sendRedirect("login.jsp");
                    }
                }else {//Cookie中也没有,第一次访问,跳转登录页面
                    resp.sendRedirect("login.jsp");
                }
            }else {//session中有,放行
            	 chain.doFilter(req, resp);
                return;
            }
        }
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}


}

xml中配置文件 要包裹在</web-app>中才有效

<servlet>
		<servlet-name>LoginServlet</servlet-name>
		<servlet-class>com.zking.servlet.LoginServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>LoginServlet</servlet-name>
		<url-pattern>/login.do</url-pattern>
	</servlet-mapping>
	<filter>
		<filter-name>LoginFilter</filter-name>
		<filter-class>com.zking.servlet.LoginFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>LoginFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

注意 xml文件只有在创建web项目时点击下一步两次勾选后才会有

 

 过滤器中三个方法的作用

package com.zking.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

//该类要称为过滤器类       实现Filter接口   继承HttpFilter
public class FilterDemo implements Filter{

	@Override
	public void destroy() {
		System.out.println("过滤器被销毁了~~~~~~");
	}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
		//  所设的关卡   
		System.out.println("来了老弟~~~放我过去!!!!!!!!!!");
		System.out.println("放行  start");
		//没有什么要求  我直接放你过去
		arg2.doFilter(arg0, arg1);
		System.out.println("放行  end");
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		System.out.println("过滤器被初始化了~~~");
	}

}

 liaten 监听器的使用

package com.zking.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineCountListener implements HttpSessionListener,ServletContextListener {

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("上下文对象监听器被销毁了....");
	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("上下文对象监听器被初始化了....");
		
		//得到上下文对象
		ServletContext application = arg0.getServletContext();
		application.setAttribute("count", new Integer(0));
		
	}

	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		System.out.println("会话对象监听器被创建了....");
		ServletContext application = arg0.getSession().getServletContext();
		
		Integer count = (Integer)application.getAttribute("count");
		if(count == null) {
			application.setAttribute("count", new Integer(1));
		}else {
			count++;
			application.setAttribute("count", count);
		}
		
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		System.out.println("会话对象监听器被销毁了...");
		ServletContext application = arg0.getSession().getServletContext();
		
		Integer count = (Integer)application.getAttribute("count");
		if(count == null) {
			application.setAttribute("count", new Integer(1));
		}else {
			count--;
			application.setAttribute("count", count);
		}
	
	}

}

退出后需要手动调用销毁的方法或arg0.getSession().setMaxInactiveInterval(60);自动销毁

public class DestroySessionServlet extends HttpServlet{

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.invalidate();
    }
}

数据库帮助类util |实体类entity |  dao方法类与接口dao  dao.impl |业务逻辑层与接口biz biz.impl  |servlet包servlet |过滤器包filter |监听器分包listen

 

举报

相关推荐

0 条评论