notas de estudo JavaWeb 9: Listener & Filtro

1-Listener introduz as chamadas princípio e interface

ouvinte Listener-: uso de chamadas de interface, para ouvir a ocorrência de um determinado evento, muda o estado do
ouvinte um total de 8, em três tipos ↓
一类:监听作用域的创建和销毁
二类:监听作用域中属性的创建销毁和替换
三类:Session值的钝化和活化(Activation)
chamada de interface: assumindo parâmetros de processo classe A para uma interface, você classe de teste um método a ser chamado, em seguida, um só pode ser invocado por interfaces de escrita e exemplos de métodos
Chamada princípio de Interface

2-Listener escuta criados e destruídos três âmbitos

Para criar um novo ouvinte em configure web.xml a
primeira recordação que o objeto que vários escopos e escopos são:
1、pageContext - PageContext
2、request - HttpServletRequest
3、session - HttpSession
4、application - ServletContext
Nós são principalmente para os três seguintes escopos 2,3,4 escuta, para cada escopo o objeto ouvinte é de fato o escopo do objeto nome + ouvinte

  • ServletContextListener
    o ServletContext criado:
    启动服务器的时候
    servletContext destruída:
    关闭服务器、从服务器移除项目

  • ServletRequestListener (raramente usado)
    criação Solicitação:
    访问服务器上的任意资源都会有请求出现。 访问 html、访问 jsp、访问 servlet
    Pedido destruída:
    服务器已经对这次请求作出了响应之后

    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
    criar sessão da
    只要有调用getSession就创建。 html:(没有Session的调用) jsp:(默认调用getSession) servlet:(默认调用getSession)
    Destruição da sessão
    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了");
    	}
    }
    

    papel ouvinte:
    usá-lo para, quando o escopo de objetos criados
    1. deseja concluir sua inicialização
    2. Execute um agendador de tarefas personalizado para executar uma determinada tarefa Timer (temporizador)

3-Listener Listener três âmbitos alterações do estado propriedade

Use AttributeListener reescrita e ver a mudança de status
que atribui: Add (set), substitua (set: key Gosta), a remoção (remoção) três estados

  • servletContext - ServletContextAttributeListene
    servletContext
  • pedido - ServletRequestAttributeListener
    solicitação
  • sessão - HttpSessionAttributeListener
    sessão

O HttpSessionBindingListener (menos usado, um efeito semelhante é para ver se a adição ou remoção de propriedade)
> 监听对象与session绑定和解除绑定的动作

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

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

Aqui é necessário para explicar a diferença entre o HttpSessionBindingListener e HttpSessionAttributeListener.
primeiro objeto, semelhante ao papel dos dois, são interceptadas é adicionado ao elevador, a maior diferença é, BindingListener para ser um ouvinte objetos para implementar essa interface, e depois adicionar o objeto na Sessão do tempo irá desencadear o ouvinte, mas se você adicionar um outro objeto, o ouvinte não será acionado.
Em vez disso, AttributeListener também para uma classe para implementar, configurar objeto de sessão para ouvir em web.xml, observe o objeto Session, isto é, enquanto a sessão não importa o que o objeto é adicionado, isso vai desencadear o ouvinte, isso pode ser entendido como é um portão de segurança.

4-ouvinte escutas HttpSession passivação activação

Disse que os dois acima ouvintes deve ser registrado no arquivo xml, eo último ouvinte não precisa se registrar, você só precisa implementar a interface

HttpSessionActivationListener
用于监听现在session的值是钝化(序列化)还是活化(反序列化)的动作
. 1, uma passivação (serialização)
把内存中的数据 存储到硬盘上
2, activado (deserialização)
一定要实现Serializable接口 若已经钝化,则重启服务器就自动活化了 即把硬盘中的数据读取到内存中

Por que deveria haver activação passiva?
Sessão armazenados na memória irá aumentar o valor muita carga, para que possamos fazer temporariamente algo antes passiva, usar o tempo para ativação
eventos efectua automaticamente a passivação do padrão é de 30 minutos, nós podemos eventos configurar manualmente e caminhos

Como configurar Sessão passivação automática?
 1, no tomcat / conf / context.xml configuração interior
对所有的运行在这个服务器的项目生效
 2 em conf / Catalina / localhost / context.xml configuração
对 localhost生效 localhost:8080
 3, META-INF em projectos de engenharia web / context.xml configuração
只对当前的工程生效

	#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-Filter Introdução e simples de usar

Filtro filtro é realmente enviou a solicitação do cliente, o problema com o navegador eo servidor para enviar servlet para manipular, você pode filtrar no meio, de fato, desempenhar um papel de filtro é interceptar
tais como o que pode fazer?
  1. Para algumas palavras sensíveis filtrada
  2. conjunto unificado de codificação
  3. Login automático
  ...

ciclo de vida útil do filtro: o servidor é criado quando o projeto é carregado, desligar ou destruídas quando o item é removido dos servidores na
ordem de execução de filtro:
 1, o cliente faz uma solicitação, primeiro através do filtro Se o filtro é liberado, em seguida, chegar ao servlet
 servlet 2, se houver uma pluralidade de filtros, será registado de acordo com a ordem de mapeamento de fila, se apenas um filtro não é libertado, em seguida, a parte de trás da fila, e o filtro não vai ser solicitada


Filtrar o simples uso de:
filtro1, a definição de uma classe que implementa filtro

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, o registo filtro

#在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>

Filtrar os detalhes:
1, se você quiser liberar, que, em seguida, método de operação doFilter, os parâmetros da cadeia
chain.doFilter (request, response); liberado, para que o próximo pedido chega em um alvo
2, <url-pattern>/*</url-pattern>escrito servlet formato
  1. 全路径匹配 以 / 开始
  2. 以目录匹配 以 / 开始 以 * 结束
  3. 以后缀名匹配 以 * 开始 以后缀名结束
3, para o despachante estabelecer
  REQUEST : 只要是请求过来,都拦截,默认就是REQUEST
  FORWARD : 只要是转发都拦截
  ERROR : 页面出错发生跳转
  INCLUDE : 包含页面的时候就拦截

6-Filter automaticamente log

1, Estudo de Caso
Estudo de caso
2, construir um banco de dados bom (informações do usuário), página (JSP)
3, AutoLoginFilter (major código):

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 (código principal):

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- auto-summary

  Quando o primeiro contato com os ouvintes, especialmente filtros, login automático para este caso em particular não está no lugar de entender, mas para escrever este blog, eu fiz alterações ao código Nesse caso, e para o código modificado com o original código foram comparados, e finalmente encontrei o problema. Tudo em tudo, eu espero que estes dois componentes de uma profunda compreensão pode escrever!
  --- pequeno passo, a mil milhas, não pequenos riachos em uma poderosa torrente.

Publicado 15 artigos originais · ganhou elogios 18 · vista 4568

Acho que você gosta

Origin blog.csdn.net/oZuoShen123/article/details/105338631
Recomendado
Clasificación