现在的位置: 首页 > 综合 > 正文

【Filter】拦截器Filter

2018年05月06日 ⁄ 综合 ⁄ 共 2999字 ⁄ 字号 评论关闭

在网站中某些页面常常需要检查用户是否具有权限才放行访问,禁止用户直接输入网址就访问。可以把这样页面放到WEB-INF文件夹,但是这样做就不够清晰。一般使用拦截器Filter去现实。拦截器Filter是JavaEE,Javaweb里面一个很常见的东西,但是网上总是大篇幅的文章让人太长不看,更可怕的是讲解拦截器Filter的文章总是杂糅着其它技术让人一头雾水。其实就是一个比Servlet更加高级的Servlet。配置好Filter,其每次访问指定页面都要跳到相应的Java文件先进行一番检查。你可以看到,一些JavaEE组件要配置拦截器Filter,实际上,就是为了把这个组件里面的Java文件应该到网站里面的任何一个页面里去。

一、基本目标

网站结构图如下:

要求,在用户没有登录之前,也就是在Session容器为难找到username项之前,除了login.jsp,其它页面不能够被访问,一旦访问马上跳回login.jsp,如下图:

二、制作过程

这里登录的过程就省了,主要讲解Filter是怎么配置的,之前已经在很多地方做过,比如《【Servlet】根据MVC思想设计用户登陆、用户注册、修改密码系统》(点击打开链接),《【Struts2】创造一个最简单、最基本的Struts2工程》(点击打开链接)等

1、首先新建工程把相应的Servlet包放进lib文件夹,Tomcat里面配好的最好,在web.xml配置好Filter

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">
	<filter>
		<filter-name>loginFilter</filter-name>
		<filter-class>loginFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>loginFilter</filter-name>
		<!-- 写成/application/*则每当访问application目录下的页面都要跳去Java文件中检查 -->
		<url-pattern>/*</url-pattern>
	</filter-mapping>
</web-app>

上面这样写的意思是,访问本网络工程的所有页面都要到根目录下的loginFilter.java去检查,而这个拦截器的名称也叫做loginFilter,思想与《【Servlet】最简单的Servlet JavaWeb程序》(点击打开链接)中Servlet的配置完全相似!

2、在网络工程目录下随便新建三个jsp,login.jsp,NewFile.jsp,welcome.jsp里面什么都不用写,改改标题,在页面中敲几个英文,明确是哪个页面就可以,名字也不重要,我乱起的。

3、最后,整个拦截器Filter的核心在于Java文件loginFilter.java,首先在开头引入如下的包:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

之后重写Filter这个接口,你敲完implements Filter,利用Eclipse for javaee的自动除错功能,就可以自动生成方法里面的所有方法

接着,完成拦截器Filter的构造方法init与析构方法destroy,再修改doFilter方法里面Javaee生成出来的参数args0,args1,虽然理论上与实际上,不改这个参数也是没有问题的,但是,一般改回request等,让其他看你程序的人明确这是个什么。一般都是约定俗成改成request,response与chain

最后,重点拦截器Filter的执行方法doFilter,拦截什么,放行什么,都在这里。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class loginFilter implements Filter {

	// 下面的东西必须有
	// 这里是接口,Java要求必须重写旗下的所有方法
	private FilterConfig config;

	// 相当于构造函数,这样写才能与web.xml配合起来
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		this.config = config;
	}

	// 相当于析构函数
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		this.config = null;
	}

	// 以上的东西Eclipse for JavaEE会自动生成,不用管
	// 但要注意一下修改一下doFilter的参数

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		//这样相当于Jsp里面的request对象与response对象,以后可以用这些对象里面的方法
		//其来源与抽象类ServletRequest与ServletResponse强制类型转换
		HttpServletRequest httpRequest = (HttpServletRequest) request;
		HttpServletResponse httpResponse = (HttpServletResponse) response;
		//从session容器拿出用户名这个属性
		HttpSession session = httpRequest.getSession();
		//如果session容器没有用户名而且不是去访问登陆页面login.jsp的
		if (session.getAttribute("username") == null
				&& !httpRequest.getServletPath().endsWith("/login.jsp")) {
			//那么,利用丢弃所有参数的重定向强制定向会login.jsp
			httpResponse.sendRedirect("login.jsp");
		} else {
			//否则,放行
			chain.doFilter(request, response);
		}

	}

}

这里的重定向使用了response的重定向,它是丢失所有参数的重定向,此前request.getRequestDispatcher("/form.jsp").forward(request,response);就是《【Jsp】Forward指令》(点击打开链接),带参数的。

抱歉!评论已关闭.