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