【Filter】拦截器Filter

来源:互联网 发布:四川广电网络在线缴费 编辑:程序博客网 时间:2024/05/16 15:37

在网站中某些页面常常需要检查用户是否具有权限才放行访问,禁止用户直接输入网址就访问。可以把这样页面放到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配合起来@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stubthis.config = config;}// 相当于析构函数@Overridepublic void destroy() {// TODO Auto-generated method stubthis.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.jsphttpResponse.sendRedirect("login.jsp");} else {//否则,放行chain.doFilter(request, response);}}}

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



0 0
原创粉丝点击