标签:filter web.xml 拦截器 servlet javaee
在网站中某些页面常常需要检查用户是否具有权限才放行访问,禁止用户直接输入网址就访问。可以把这样页面放到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的构造方法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); } } }
标签:filter web.xml 拦截器 servlet javaee
原文地址:http://blog.csdn.net/yongh701/article/details/44018361