码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA Web基础4-过滤器与监听器

时间:2018-06-18 10:34:02      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:==   checkurl   dex   err   contain   AC   strong   filter   过程   

一.过滤器
1.定义:过滤器是指定义在服务器端的一段程序, 可以截获客户端发来的请求, 并根据一定规则进行过滤和拦截。
2.过滤器的生命周期:
        1.服务器启动:先通过web.xml加载过滤器进行实例化(这个过程是调用过滤器中init()方法, 同样也是只执行一次);
        2.客户端发送请求:执行过滤器中的doFilter()方法, 这个方法会执行N次, 每次有请求发送过来, 都会执行这个方法进行过滤;
        3.销毁过程:同servlet, 关闭或者停止服务器的时候会执行destroy()方法;
3.过滤器链:
        不同的请求互不影响,过滤器链主要是针对多个过滤器过滤同一个url请求,过滤器的先后顺序是按照在web.xml的配置顺序来的;
        运行顺序: 请求--->过滤器1过滤--->过滤器2过滤--->后台处理层--->过滤器2过滤--->过滤器1过滤--->客户端接收
4.在web.xml中配置过滤器:

<filter>
	<filter-name>Myfilter</filter-name>
	<filter-class>com.hanqi.filter.Myfilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>Myfilter</filter-name>
	<url-pattern>/Testfilter</url-pattern><!-- 指哪些请求可以被过滤 -->
</filter-mapping>

 5.过滤器应用示例:检测当前用户是否有效。

package com.hanqi.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;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebFilter(value = "/*", initParams = { @WebInitParam(name = "page", value = "Login,Register,index,.js") })
public class SessionFilter implements Filter {
	private String[] page;
	//构造方法
	public SessionFilter() {
		
	}
	//销毁方法,以便释放资源
	public void destroy() {
		
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request1 = (HttpServletRequest) request;//HttpServletRequest是ServletRequest的子类,可以强转获得request
		HttpServletResponse response1 = (HttpServletResponse) response;
		String url = request1.getRequestURI();//获取请求路径
		if (checkUrl(url)) {
			chain.doFilter(request1, response1);//对请求进行放行
		} else {
			Object o = request1.getSession().getAttribute("currentUser");
			if (o == null) {
				request.setAttribute("errmsg", "用户名已失效!");
				request.getRequestDispatcher("/WEB-INF/page/login.jsp").forward(request, response);
			} else {
				chain.doFilter(request1, response1);
			}
		}

	}
	//过滤器初始化时会调用该方法
	public void init(FilterConfig fConfig) throws ServletException {
		String pages = fConfig.getInitParameter("page");//获取初始化参数值
		this.page = pages.split(",");
		System.out.println(pages);
	}

	public boolean checkUrl(String url) {
		for (String p : page) {
			if (url.contains(p)) {
				return true;
			}
		}
		return false;
	}
}

6.关于注解:
在新版本(从Web2.5开始)中可以使用注解代替在web.xml中配置对象。
格式:@注解("属性值"),其等同于@注解(属性="属性值")例:@WebFilter("/*")或@WebFilter(value="/*")
带参数的格式:@WebFilter(filterName="Myfilter",value="/*",initParams= {@WebInitParam(name="",value="")})
注意:value和urlPatterns都可以用来声明过滤的请求, 也同样都可以使用数组的形式定义, 但是这两个属性不能同时使用, 否则会报java.lang.IllegalArgumentException异常而无法启动Tomcat服务器;

JAVA Web基础4-过滤器与监听器

标签:==   checkurl   dex   err   contain   AC   strong   filter   过程   

原文地址:https://www.cnblogs.com/wyc1991/p/9194252.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!