在配置filter中的拦截功能时候 ,我们在web.xml中进行配置文件。filter过滤文件有系统自己带有的,还有就是我们手写的filter文件。网页调用servlter的时候,我们可以在此之前调用filter文件进行过滤然后在执行active里面的方法
1.要想一个类文件成为一个过滤器文件,着该类实现java.selver.filter的接口。
创建filter类要分为两个步骤
建立filter处理类
FilterConfig可以获取部署描述符文件(web.xml)中分配的过滤器初始化参数。
FilterConfig对象提供对servlet环境及web.xml文件中指派的过滤器名的访问。
FilterConfig对象具有一个getInitParameter方法,它能够访问部署描述符文件(web.xml)中分配的过滤器初始化参数。
web.xml文件配置Filter
实现接口的3个方法
《在此要看filter的api里面的方法》
1.1 init(FilterConfig filterConfid);
(服务器刚刚启动是会创建实例,这 个方法得到调用)这个方法可以读取web.xml中的servlet过滤的初始化参数
1.2 doFilter(ServletResquest request,ServletReaponse reponse,FilterChain chain);
ServletResquest 是接口 要用httpServletResquest的接口继承的 而 chain.toFilter();//chain.doFilter(request, response); 请求回转的方法
1.3 destroy();
下面是直接到页面
//res.sendRedirect("../failure.jsp");
下面这个是通过读取Filter文件进行跳转
//res.getRequestDispatcher(login).forward(request, response);
实例
package com.ljq.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.HttpSession;
public class AuthorityFilter implements Filter {
private FilterConfig config;
// 实现初始化方法
public void init(FilterConfig config) {
this.config = config;
}
// 实现销毁方法
public void destroy() {
this.config = null;
}
// 执行过滤的核心方法
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 获取该Filter的配置参数
String encoding = config.getInitParameter("encoding");
String login = config.getInitParameter("login");
// 设置request编码用的字符集
request.setCharacterEncoding(encoding);
HttpServletRequest req = (HttpServletRequest) request;
//获取session对象
HttpSession session = req.getSession();
// 获取客户请求的路径
String requestPath = req.getServletPath();
// 如果session范围的user为null,即表明没有登录
// 且用户请求的既不是登录页面,也不是处理登录的页面
if (session.getAttribute("username") == null
&& !requestPath.endsWith(login)) {
// forward到登录页面
request.setAttribute("A", "您还没有登录");
request.getRequestDispatcher
(login).forward(request, response);
}
// 放行请求
else {
chain.doFilter(request, response);
}
}
}
Web.xml的实体类
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 定义Filter -->
<filter>
<filter-name>authority</filter-name>
<filter-class>com.ljq.servlet.AuthorityFilter</filter-class>
<!-- 下面3个init-param元素配置了3个参数 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>login</param-name>
<param-value>/login.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>authority</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
文件是读取web.xml里面的<init-param></init-param>里面的属性 param-name得到value的值
也可以这样子的格式
下面只有一个过滤文件
<filter>
<!-- Filter 的名字 -->
<filter-name>security</filter-name>
<!-- Filter 的实现类 -->
<filter-class> test.filter.SecurityFilter</filter-class>
</filter>
<!-- 定义Filter 拦截地址 -->
<filter-mapping>
<!-- Filter 的名字 -->
<filter-name> security </filter-name>
<!-- Filter 负责拦截的URL -->
<url-pattern>/security/*</url-pattern>
</filter-mapping>