台湾体育博彩


台湾体育博彩他稍微振作一点,这才盯着扑克凝神,只听得钱怀生大喝一声开始,他的手便飞似的在茶几上移动着。 台湾体育博彩一夜狂欢。台湾体育博彩再说这里只有郝仁这么一个男生在,平时和郝仁在一起时,别说看,都被他干过了,唐素同学心里想,让他看一下身子也没有什么,只要不让他乱摸就行了。在郝仁一个人面前脱衣服,胜过那些艺校里女生,把身体给几千,几万至更多的人看。台湾体育博彩邂逅,没有约定,没有守侯,又似是冥冥之中的一种安排。
台湾体育博彩除此以外,他们还惦记着自己的课堂,会想着怎样才能使自己的课堂变得更加生动有趣,让学生喜欢。但是,别忘了,他们都还是大一学生,能力是有限的,要做好一些超出自己能力范围的事是不容易的。但是,他们依旧努力地突破自我。
台湾体育博彩最后,阳曦实践队还在龙樟小学的多媒体室举行了以领导来访暨捐赠仪式为主题的简短会议,会议的目的是欢迎岭南师范学院化学化工学院领导、老师的到访,并给龙樟小学的学生和学校捐赠书籍以及一些体育用品。出席本次会议的除了有到龙樟小学走访的领导、老师外,还有龙樟小学的柯亚统、李森老师、阳曦实践队的队员以及支教的对象。在会议中,李梓副书记再一次强调了安全的重要性,同时龙樟小学的柯主任也对岭南师范学院化学化工学院领导、老师以及阳曦社会实践队对其学校的支持表示了衷心的感谢。
台湾体育博彩对呀,有什么好怕的?台湾体育博彩有位非常漂亮的女同事,上班起晚了,没有时间化妆便急忙冲到公司。  结果,那天她被记旷工了……

皇冠足球比分

大发论坛时时彩平台尊龙娱乐是黑网吗海天国际娱乐城注册送钱凯发娱乐乐宝娱乐城真人赌钱bodog888亚美国际娱乐城 金龙国际 www.am8.com 亚洲城娱乐 老k国际娱乐城 666k8.com 金威国际娱乐城 名人国际娱乐城 ag娱乐平台 V博娱乐城 凤凰娱乐平台网站地图秀秀456美女直播间网站地图优博国际文化传媒有限公司网站地图www.789zx.com/news/news_467.html网站地图葡京现场网站地图葡京赌综合报2015网站地图乐橙国际注册送钱e8889.com网站地图http://tinyurl.com/ouaxzb8网站地图澳门百家乐【注册送钱e8889.com】网站地图足球网上投注注册送钱e8889.com网站地图波音平台维护网站地图滦县国语学校网站地图皇冠足球比分网站地图威尼斯赌城网站地图伟易博娱乐二八杠网站地图998992好日子论坛网站地图凯发娱乐积分兑换网站地图环亚国际注册网站地图皇冠注册网站地图赌博游戏机注册送钱e8889.com网站地图新利娱网站地图庄闲和投注法技巧网站地图乐橙娱乐网站地图金花娱乐场官网网站地图

Filter过滤器原理和登录实现

Filter过滤器API
     Servlet过滤器API包含了3个接口,它们都在javax.servlet包中,分别是Filter接口、FilterChain接口和FilterConfig接口。
Filter接口(源码)

public interface Filter {

    public void init(FilterConfig filterConfig) throws ServletException;

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;

    public void destroy();
}

所有的过滤器都必须实现Filter接口。该接口定义了init,doFilter0,destory()三个方法:
  (1)init(FilterConfig filterConfig)
      在web应用程序启动时,web服务器将根据 web.xml文件中的配置信息来创建每个注册的Filter实例对象,并将其保存在服务器的内存中。Web容器创建Filter对象实例后,将立即调用该Filter对象的init方法。Init方法在Filter生命周期中仅执行一次,web容器在调用init方法时,会传递一个包含Filter的配置和运行环境的FilterConfig对象(FilterConfig的用法和ServletConfig类似)。利用FilterConfig对象可以得到ServletContext对象,以及部署描述符中配置的过滤器的初始化参数。
  (2)
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

      doFilter()方法类似于Servlet接口的service()方法。当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的 doFilter()方法。其中参数 request, response 为 web 容器或 Filter 链的上一个 Filter 传递过来的请求和相应对象;参数 chain 为代表当前 Filter 链的对象,在特定的操作完成后,可以在当前 Filter 对象的 doFilter 方法内部需要调用 FilterChain 对象的 chain.doFilter(request,response)方法才能把请求交付给 Filter 链中的下一个 Filter 或者目标 Servlet 程序去处理,也可以直接向客户端返回响应信息,或者利用RequestDispatcher的forward()和include()方法,以及 HttpServletResponse的sendRedirect()方法将请求转向到其他资源。这个方法的请求和响应参数的类型是 ServletRequest和ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议。
 (3)public void destroy()
       在Web容器卸载 Filter 对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用的资源。
FilterChain接口(源码)

public interface FilterChain {

    public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException;
}

(1)doFilter(ServletRequest request,ServletResponse response)
      此方法是由Servlet容器提供给开发者的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤  器,如果是最后一个过滤器,则下一个就调用目标资源。
FilterConfig接口(源码)  FilterConfig接口检索过滤器名、初始化参数以及活动的Servlet上下文。

public interface FilterConfig {
  //返回web.xml部署文件中定义的该过滤器的名称
    public String getFilterName();
  //返回调用者所处的servlet上下文
    public ServletContext getServletContext();
  //返回过滤器初始化参数值的字符串形式,当参数不存在时,返回nul1.name是初始化参数名
    public String getInitParameter(String name);
  //以Enumeration形式返回过滤器所有初始化参数值,如果没有初始化参数,返回为空
    public Enumeration getInitParameterNames();
}

 

了解了Filter的基本概念和源码,下面具体使用下Filter过滤器来实现登录过滤。

需求:访问A页面(登录后才能访问的页面)-->未登录-->跳转到登录页面-->登陆成功后,跳转到A页面

自定义HttpFilter

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.HttpServletResponse;

/**
 * HttpFilter
 */
public abstract class HttpFilter implements Filter{

    //保存filterConfig对象
    private FilterConfig filterConfig;
    
    /**
     * 直接返回filterConfig对象
     * @return
     */
    public FilterConfig getFilterConfig() {
        return filterConfig;
    }
    
    /**
     * 不建议子类直接覆盖,若直接失败,将可能导致filterConfig成员变量初始化失败
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {        
        this.filterConfig = filterConfig;    
        init();
    }

    /**
     * 供子类继承的初始化方法,刻通过getFilterConfig()方法获得filterConfig对象
     */
    private void init() {}

    /**
     * 原生的doFilter方法,在方法内部把ServletRequest和ServletResponse转化化为了HttpServletRequest和HttpServletResponse,
     * 并调用了doFilter(HttpServletRequest request, HttpServletResponse response,FilterChain filterChain)方法
     */
    @Override
    public void doFilter(ServletRequest req, ServletResponse res,
            FilterChain filterChain) throws IOException, ServletException {
        
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        
        doFilter(request, response, filterChain);
    }
    
    /**
     * 抽象方法,为http请求定制,必须实现的方法
     * @param request
     * @param response
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    public abstract void doFilter(HttpServletRequest request, HttpServletResponse response,
            FilterChain filterChain) throws IOException, ServletException;

    @Override
    public void destroy() {}

}
View Code

web.xml配置CommonFilter

    <filter>
        <filter-name>commonFilter</filter-name>
        <filter-class>com.gcx.emall.Filter.CommonFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>commonFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

登录过滤器CommonFilter

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CommonFilter extends HttpFilter {

    private final Logger log = LoggerFactory.getLogger(CommonFilter.class);
    
    @Override
    public void doFilter(HttpServletRequest request,
            HttpServletResponse response, FilterChain filterChain)
            throws IOException, ServletException {

        log.info("==============拦截get请求================");
        if ("GET".equalsIgnoreCase(request.getMethod())) {
            RequestUtil.saveRequest(request);
        }        
        String requestUri = request.getRequestURI();
        String contextPath = request.getContextPath();
        String url = requestUri.substring(contextPath.length());
        if ("/login".equals(url)) {
            filterChain.doFilter(request, response);
            return;
        } else {
            String username = (String) request.getSession().getAttribute("user");
            if (username == null) {
                log.info("被拦截:跳转到login页面!");
                request.getRequestDispatcher("/page/index1.jsp").forward(request, response);
            } else
                filterChain.doFilter(request, response);
        }
    }
}

RequestUtil 保存、获取request并加密请求页面

public class RequestUtil {
    private  static  final  Logger  logger = LoggerFactory.getLogger(RequestUtil.class);
    private  static  final  Base64  base64 = new Base64(true);
    public  static  final  String  LAST_PAGE = "lastPage";//未登录时访问的页面
    public  static  final  String  REDIRECT_HOME = "/";//未登录时跳转到首页
    public  static  final  String  LOGIN_HOME = "/index.jsp";//登录成功后进入的页面
       
    
    /**
     * 保存当前请求
     */
    public static void saveRequest(HttpServletRequest request) {
        request.getSession().setAttribute(LAST_PAGE, RequestUtil.hashRequestPage(request));
        logger.debug("被拦截的url的sessionID:{}", request.getSession().getId());
        logger.debug("save request for {}", request.getRequestURI());
    }
    
    /**
     * 加密请求页面
     * @param request
     * @return
     */
    public static  String hashRequestPage(HttpServletRequest request) {
        String reqUri = request.getRequestURI();
        String query = request.getQueryString();
        if (query != null) {
            reqUri += "?" + query;
        }
        String targetPage = null;
        try {
            targetPage = base64.encodeAsString(reqUri.getBytes("gb2312"));
        } catch (UnsupportedEncodingException ex) {
            //this does not happen
        }
        return targetPage;
    }
    
    /**
     * 取出之前保存的请求
     * @return
     */
    public static String retrieveSavedRequest(HttpServletRequest request) {
        HttpSession session = request.getSession();
        if (session == null) {
            return REDIRECT_HOME;
        }
        String HashedlastPage = (String) session.getAttribute(LAST_PAGE);
        if (HashedlastPage == null) {
            return LOGIN_HOME;
        } else {
            return retrieve(HashedlastPage);
        }
    }

    /**
     * 解密请求的页面
     * @param targetPage
     * @return
     */
    public static String retrieve(String targetPage) {
        byte[] decode = base64.decode(targetPage);
        try {
            String requestUri = new String(decode, "gb2312");
            int i = requestUri.indexOf("/", 1);
            return requestUri.substring(i);
        } catch (UnsupportedEncodingException ex) {
            //this does not happen
            return null;
        }
    }
}
View Code

LoginCOntroller

        @RequestMapping(value = "/hello",method = RequestMethod.GET)
     public String testHello( String test) {
         log.info("执行了Hello方法!");
         return "loginSuccess";
     }
@RequestMapping(value = "/login",method = RequestMethod.POST) public String login(HttpServletRequest request,String userName,String password){ log.info("执行了login方法!"); password = DigestUtils.md5Hex(password); User user = userService.findUser(userName,password); if(user!=null){ request.getSession().setAttribute("userId", user.getId()); request.getSession().setAttribute("user", userName); return "redirect:" + RequestUtil.retrieveSavedRequest(request);//跳转至访问页面 }else{ log.info("用户不存在"); request.getSession().setAttribute("message", "用户名不存在,请重新登录"); return "index"; } }

最后需要几个jsp页面login.jsp,index.jsp(首页面,任何人都能访问的),loginSuccess.jsp,还需要在controller中加上一个测试testHello方法用于满足之前说的需求。

注意事项:我们过滤的是所有请求,但对于静态资源css,js,image我们应该不拦截,对其放行。我们可以在web.xml中进行指定

    <!-- 不拦截静态文件 -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/js/*</url-pattern>
        <url-pattern>/css/*</url-pattern>
        <url-pattern>/image/*</url-pattern>
        <url-pattern>/fonts/*</url-pattern>
    </servlet-mapping>

写在后面:本来想把Filter和SpringMVC的interceptor拦截器一起写总结了,但感觉篇幅有些长打算下篇在介绍。

 

posted @ 2015-11-30 14:21 杨小剑 阅读(...) 评论(...) 编辑 收藏