JavaWeb 연구 노트 9 : 리스너 및 필터

1 리스너 원칙 및 인터페이스 호출을 소개합니다

Listener- 청취자 : 인터페이스 호출의 사용, 특정 이벤트의 발생을 인식, 그것은의 상태 변화
세 가지 유형으로, 청취자 8 총 ↓
一类:监听作用域的创建和销毁
二类:监听作用域中属性的创建销毁和替换
三类:Session值的钝化和活化(Activation)
인터페이스 전화 : 인터페이스에 대한 클래스 A의 공정 변수를 가정하면, 당신은 테스트 클래스 방법은 다음 만 기입 인터페이스 및 방법의 실시 예에 의해 호출 될 수 있고, 호출되는
원칙 인터페이스를 호출

2 수신기는 세 가지 범위를 생성하고 파괴 수신합니다

web.xml 파일의 구성에 새로운 리스너를 만들려면
: 여러 범위 및 범위는 객체 무엇 첫번째 리콜
1、pageContext - PageContext
2、request - HttpServletRequest
3、session - HttpSession
4、application - ServletContext
우리는 다음과 같은 세 가지에 대해 주로 각 범위에 대한, 2,3,4 듣기 범위를 리스너 객체가 실제로 범위 오브젝트 이름 + 리스너입니다

  • ServletContextListener는
    ServletContext를 생성 :
    启动服务器的时候
    의 servletContext 파괴 :
    关闭服务器、从服务器移除项目

  • ServletRequestListener (거의 사용하지 않음)
    요청 생성 :
    访问服务器上的任意资源都会有请求出现。 访问 html、访问 jsp、访问 servlet
    요청 파괴 :
    服务器已经对这次请求作出了响应之后

    public class MyRequestListener implements ServletRequestListener {
    	@Override
    	public void requestDestroyed(ServletRequestEvent sre) {
    		System.out.println("servletrequest 销毁了");
    	}
    	@Override
    	public void requestInitialized(ServletRequestEvent sre) {
    		System.out.println("servletrequest 初始化了");
    	}
    }
    
  • HttpSessionListener
    의 세션 생성
    只要有调用getSession就创建。 html:(没有Session的调用) jsp:(默认调用getSession) servlet:(默认调用getSession)
    세션 파괴를
    1、超时,30分钟 2、非正常关闭,销毁 3、正常关闭服务器(序列化)

    public class MySessionListener implements HttpSessionListener {
    	@Override
    	public void sessionCreated(HttpSessionEvent se) {
    		System.out.println("创建session了");
    	}
    	@Override
    	public void sessionDestroyed(HttpSessionEvent se) {
    		System.out.println("销毁session了");
    	}
    }
    

    리스너 역할 :
    사용이 객체의 범위가 생성 된 경우에
    1. 자신의 초기화를 완료 할
    특정 작업 타이머 (타이머)를 수행하기 위해 사용자 지정 작업 스케줄러를 수행합니다

3 리스너 리스너 세 가지 범위 속성 상태 변경

사용 AttributeListener 재 작성 및 상태 변경 볼
세 가지 상태를 제거 (삭제) : 추가 (세트), 대체 (키처럼 설정 :) 속성

  • 의 servletContext - ServletContextAttributeListene
    의 servletContext
  • 요청 - ServletRequestAttributeListener
    의뢰
  • 세션 - HttpSessionAttributeListener에
    세션

는 HttpSessionBindingListener를 (이용 이하, 마찬가지의 효과가 추가 또는 속성의 제거 여부를 확인하는 것)
> 监听对象与session绑定和解除绑定的动作

@Override
public void valueBound(HttpSessionBindingEvent event) {
	System.out.println("对象被绑定进来了");
}

@Override
public void valueUnbound(HttpSessionBindingEvent event) {
	System.out.println("对象被解除绑定");
}

여기가 HttpSessionBindingListener를하고 HttpSessionAttributeListener에 차이를 설명 할 필요가있다.
두 가지의 역할과 유사 첫째, 차단하는 물체가 리프트에 추가, 가장 큰 차이점은, BindingListener는 리스너가 리스너를 트리거 할 시간의 세션에 개체를 추가 한 후이 인터페이스를 구현하고 개체를하지만, 경우 수합니다 다른 개체를 추가, 리스너가 트리거되지 않습니다.
대신, 클래스도 AttributeListener는 한 세션에 상관없이 객체가 추가됩니다 것을,이 청취자를 트리거하지 않습니다,이 같이 이해 될 수있다, web.xml 파일에서 듣고있는 세션 객체를주의하는 세션 객체 구성을 구현하는 그것은 보안 게이트입니다.

4 리스너 듣는다 HttpSession을 보호 활성화

위의 두 개의 리스너는 XML 파일에 등록해야하며, 마지막으로 리스너가 등록 할 필요가 없습니다 말했다, 당신은 단지 인터페이스를 구현해야

HttpSessionActivationListener
用于监听现在session的值是钝化(序列化)还是活化(反序列化)的动作
. 1 패시베이션 (직렬화)
把内存中的数据 存储到硬盘上
활성화 2 (직렬화)
一定要实现Serializable接口 若已经钝化,则重启服务器就自动活化了 即把硬盘中的数据读取到内存中

왜 수동 활성화가되어야 하는가?
우리가 일시적으로 수동하기 전에 뭔가를 할 수 있도록 메모리에 저장된 세션 활성화에 시간 사용, 값 너무 많은 부담을 증가
우리가 수동으로 구성 이벤트와 경로를 할 수있는, 자동으로 기본의 패시베이션은 30 분입니다 수행 이벤트

어떻게 세션 자동 보호를 구성?
 1 톰캣 / CONT / context.xml의 내부 구성
对所有的运行在这个服务器的项目生效
 2 CONT / 탈리 / 로컬 호스트 / context.xml의 구성
对 localhost生效 localhost:8080
 3 META-INF에서 웹 공학 프로젝트 / 구성의 context.xml
只对当前的工程生效

	#maxIdleSwap : 1分钟不用就钝化
	#directory :  钝化后的那个文件存放的目录位置。
	#D:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\ListenerDemo\helloworld
<Context>
	<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
		<Store className="org.apache.catalina.session.FileStore" directory="helloworld"/>
	</Manager>
</Context>
5 필터 소개 및 사용이 간편

필터 필터는 실제로 클라이언트의 요청, 브라우저 문제, 그리고 핸들에 서블릿을 보낼 수있는 서버로 전송, 당신이 필터링 할 수 있습니다 중간, 사실, 재생 필터 역할을 요격하는 것입니다
같은이 무엇을 할 수?
  민감한 단어 1. 필터링
  코딩 2. 통합 세트
  3. 자동 로그인을
  ...

필터 수명주기 : 서버가 프로젝트가로드 될 때 생성되고, 종료하거나 항목이있는 서버에서 제거 될 때 파괴 된
필터의 실행 순서 :
 클라이언트가 첫 번째 필터가 해제되면 필터를 통해, 요청을 한 후, 서블릿에 도착
 필터가 해제되지 않은 경우에만 복수의 필터가있는 경우 (2), 큐의 매핑 순서에 따라 등록되며, 그 큐의이면, 필터가 요구되지 서블릿


간단한 사용 필터 :
필터1, 클래스의 정의가 구현 필터

public class FilterDemo implements Filter {
	public void destroy() {}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("doFilter……");
		chain.doFilter(request, response);
	}
	public void init(FilterConfig fConfig) throws ServletException {}
}

2 필터 레지스터

#在web.xml里面注册 注册的手法与servlet基本一样
<filter>
	<display-name>FilterDemo</display-name>
	<filter-name>FilterDemo</filter-name>
	<filter-class>com.itheima.filter.FilterDemo</filter-class>
</filter>
<filter-mapping>
	<filter-name>FilterDemo</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

세부 사항을 필터 :
1, 당신은 해제 할 경우 이는 다음 doFilter의 조작 방법, 체인의 매개 변수
chain.doFilter (요청, 응답) 발표, 그래서 다음 요청이 목표에 도달하는 것이
2 <url-pattern>/*</url-pattern>로 작성 형식 서블릿
  1. 全路径匹配 以 / 开始
  2. 以目录匹配 以 / 开始 以 * 结束
  3. 以后缀名匹配 以 * 开始 以后缀名结束
발송자 3, 설정
  REQUEST : 只要是请求过来,都拦截,默认就是REQUEST
  FORWARD : 只要是转发都拦截
  ERROR : 页面出错发生跳转
  INCLUDE : 包含页面的时候就拦截

6 필터 로그 자동

1, 사례 연구
사례 연구
2, 좋은 데이터베이스를 구축 (사용자 정보), 페이지 (JSP)
3, AutoLoginFilter (주요 코드) :

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
	try {
		//1.首先,无论用户进入什么页面,先判断用户是否登陆并且没关闭浏览器
		HttpServletRequest req = (HttpServletRequest) request;
		//如果已登录且没关闭浏览器,则自动放行
		if(req.getSession().getAttribute("user")!=null){
			chain.doFilter(request, response);
		}else{//session值不存在
			Cookie[] cookies = req.getCookies();
			Cookie cookie = CookieUtil.findCookie(cookies, "autologin");
			if(cookie!=null){//如果cookie存在,则说明用户已经登录过
				String value = cookie.getValue();
				String username = value.split("#")[0];
				String password = value.split("#")[1];
				UserDao dao = new UserDaoImpl();
				UserBean user = dao.login(username, password);
				req.getSession().setAttribute("user", user);
				chain.doFilter(request, response);
			}else{
				//cookie和session都不存在,直接放行要求登录
				chain.doFilter(request, response);
			}
		}
	} catch (Exception e) {
		e.printStackTrace();
		chain.doFilter(request, response);
	}
}

4, LoginServlet (주요 코드) :

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	try {
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String auto_login = "";
		auto_login+=request.getParameter("autologin");
		System.out.println(auto_login);
//			System.out.println(username+"=="+password+"=="+aotologin);
		UserDao dao = new UserDaoImpl();
		UserBean user = dao.login(username,password);
		if(user != null){
			//将user存储到session中
			request.getSession().setAttribute("user", user);
			if(auto_login.equals("on")){
				//设置autologin的Cookie,包含账号密码,准备自动登录
				Cookie autologin = new Cookie("autologin", (username+"#"+password));
				//设置最长存活时间
				autologin.setMaxAge(60*2);
				//设置保存路径
				autologin.setPath(request.getContextPath());
				response.addCookie(autologin);
			}
			response.sendRedirect("index.jsp");
		}else{
			response.setContentType("text/html;charset=utf-8");
			response.getWriter().write("账号或密码错误!请重新登录!");
			response.setHeader("refresh", "3;login.jsp");
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}
HPF- 자기 요약

  청취자, 특히 필터, 특히이 경우 자동 로그인이 장소 이해하지만,이 블로그를 작성하지 않을와 첫 접촉, 나는 경우가, 원래와 수정 된 코드에 대한 코드를 변경 한 경우 코드 비교, 마지막으로 문제를 발견되었다. 모두 모두, 나는 깊은 이해의 두 가지 구성 요소가 적어 수 있기를 바랍니다!
  --- 짧은 단계, 천 마일, 강력한 급류에없는 작은 스트림.

게시 15 개 원래 기사 · 원의 찬양 (18) · 전망 4568

추천

출처blog.csdn.net/oZuoShen123/article/details/105338631