Filter过滤器的应用--拦截未登录用户

来源:互联网 发布:制作身份证图片软件 编辑:程序博客网 时间:2024/05/21 13:41

Filter可认为是Servlet的一种加强版,它主要是对客户端请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链(chain)。

流程:

1:)Filter对客户端请求进行预处理

2:)接着将请求交给Servlet进行处理并生成响应

3:)最后Filter再对服务器响应进行后处理

Filter的几个用处:
1:)用户权限Filter:检查用户请求,过滤非法请求(如登录验证、权限验证)

2:)日志Filter:详细记录某些特殊的用户请求

....................

创建Filter的两个步骤:

1:)创建Filter处理类

              创建Filter处理类必须实现javax.servlet.Filter接口。在该接口中定义了如下三个方法:

              (:1  void init(FilterConfig   config)用于完成对Filter的初始化

              (:2  void destory()用于Filter销毁前,完成对某些资源的回收

              (:3  void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):过滤功能的实现

2:)在web.xml中配置Filter

              Filter的配置与Servlet的配置非常相似

              <filter>

                       <filter-name></filter-name>

                       <filter-class></filter-class>//Filter实现类全名

             </filter>

             <filter-mapping>

                       <filter-name></filter-name>

                       <url-patter></url-pattern>//多路径以空格或逗号作为分隔符

            </filter-mapping>

package com.sanxia.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.annotation.WebFilter;import javax.servlet.annotation.WebInitParam;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;/** * 使用注解配置Filter * @author lihao *value/urlPatterns这两个属性作用完全相同。都指定Filter所拦截的URL,值是数组。同<url-pattern></url-pattern> *@WebInitParam同<initParam></initParam>,可配置多个 */@WebFilter(filterName="authority",value={"/*"},initParams={@WebInitParam(name="encoding",value="UTF-8"),@WebInitParam(name="loginPage",value="/login.jsp"),@WebInitParam(name="handleLogin",value="/servlet/Login")})public class authority implements Filter {private FilterConfig fConfig;//自定义属性,初始化时获取初始化信息即@WebIninParam里面的内容public void destroy() {// TODO Auto-generated method stub}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {String encoding=fConfig.getInitParameter("encoding");String loginPage=fConfig.getInitParameter("loginPage");String handleLogin=fConfig.getInitParameter("handleLogin");HttpServletRequest req=(HttpServletRequest)request;HttpSession session=req.getSession(true);String requestPath=req.getServletPath();//获取请求路径,略去请求参数(即?之后的那一部分)                /**                   request.getContextPath()获取应用相对于服务器的路径 ,以/开头,代表服务器根目录,以应用名结尾                */                //notice:过滤器拦截的是客户端请求,对于服务器内部转发无法拦截//用户尚未登陆且客户端请求的既不是登录页面也不是处理登陆页面,则转发到登陆页面;<strong><strong>注意这里不能重定向,否则会形成死循环</strong></strong>if(session.getAttribute("user")==null && !requestPath.endsWith(loginPage) &&  !requestPath.endsWith(handleLogin)){req.setAttribute("tip", "您还没有登陆");req.getRequestDispatcher(loginPage).forward(req, response);}else{//放行请求到请求页面chain.doFilter(req, response);                        <div><span style="color:#97CDCC;">•</span><span style="color:black;">                       //在</span><span style="color:black;">doFilter</span><span style="color:black;">方法中,开发人员如果调用了</span><span style="color:black;">FilterChain</span><span style="color:black;">对象的</span><span style="color:black;">doFilter</span><span style="color:black;">方法,则</span><span style="color:black;">web</span><span style="color:black;">服务器会检查</span><span style="color:black;">FilterChain</span><span style="color:black;">对象中是否还有</span><span style="color:black;">filter</span><span style="color:black;">,                        如果有,则调用第</span><span style="color:black;">2</span><span style="color:black;">个</span><span style="color:black;">filter</span><span style="color:black;">,如果没有,则调用目标资源。</span></div>                    }}/** * @see Filter#init(FilterConfig) */public void init(FilterConfig fConfig) throws ServletException {this.fConfig=fConfig;}}


普通门户网站与后台管理系统的区别:

0 0
原创粉丝点击