Filter與Session配合的簡單過渡例子

Filter與Session配合的簡單過渡例子
馬克- to-win:馬克 java社區(qū):防盜版實(shí)名手機(jī)尾號(hào): 73203。
馬克-to-win:因?yàn)橄乱粋€(gè)登錄例子太難,我先給出一個(gè)過度的例子,便于大家理解下一個(gè)例子。這里也有個(gè)軼事,當(dāng)我在做下一個(gè)登錄的例子時(shí),發(fā)現(xiàn)一個(gè)非常隱晦的bug。那就是,我本應(yīng)寫成:response.sendRedirect("http: //localhost:8080/ServletHello/home.jsp")。但我實(shí)際寫成了:response.sendRedirect ("http://localhost:8080//ServletHello/home.jsp");多寫了一個(gè)/,跳轉(zhuǎn)沒出現(xiàn)問題。嚴(yán)重的問題就是 filter當(dāng)中怎么也取不出session了。我當(dāng)時(shí)還以為是tomcat出現(xiàn)問題了或是機(jī)器出現(xiàn)毛病。這個(gè)Bug的隱晦之處是,url寫錯(cuò)后,不是跳轉(zhuǎn)出現(xiàn)毛病,而是Filter當(dāng)中session取不出來。我曾經(jīng)一度懷疑,是sun公司整個(gè)filter機(jī)制設(shè)計(jì)有問題?后來經(jīng)過仔細(xì)思考,我的結(jié)論是,當(dāng)url只是簡單錯(cuò)誤時(shí)(比如home.jsp寫成home1.jsp),會(huì)跳轉(zhuǎn)失敗。馬克-to-win:但如果只是機(jī)器名后多加了一個(gè)/,sun 公司會(huì)認(rèn)為你要跳轉(zhuǎn)去別的web應(yīng)用,于是就把session清空了。但是filter不管是一個(gè)斜杠還是兩個(gè)斜杠,還是會(huì)照常過濾。跳轉(zhuǎn)去別的web應(yīng)用,所以取不到session。(請(qǐng)參考我的Session部分:跨應(yīng)用取session)看來,sun公司的filter大的方面設(shè)計(jì)沒問題,只是還是有一點(diǎn)點(diǎn)bug。應(yīng)該在下一個(gè)版本把這個(gè)問題解決一下。(應(yīng)該兩個(gè)斜杠就不過濾了)






例 1.2.4

package com;
import java.io.IOException;
import java.io.PrintWriter;
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.HttpSession;
public class MarkToWinFilter implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        response.setCharacterEncoding("GBK");
        HttpServletRequest hsr=(HttpServletRequest)request;
        HttpSession hs=hsr.getSession();
        String me=(String)hs.getAttribute("me");
        System.out.println("me in filter is "+me);
        PrintWriter out = response.getWriter();
        out.println("之前 filterChain.doFilter");
        System.out.println("之前 filterChain.doFilter");
        chain.doFilter(request, response);
        System.out.println("之后 filterChain.doFilter");
        out.println("之后 filterChain.doFilter");
        me=(String)hs.getAttribute("me");
        System.out.println("me in filter is "+me);
    }
    public void init(FilterConfig fConfig) throws ServletException {
    }
}




package com;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class ServletHello1 extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("GBK");
        HttpSession hs=request.getSession();
        hs.setAttribute("me", "馬克-to-win");
        System.out.println("in servlet");
 response.sendRedirect("http://localhost:8080/ServletHello/home.jsp");
    }
}




<%@ page contentType="text/html; charset=GBK" %>
<%System.out.println("me in jsp is "+session.getAttribute("me"));
%>
<br>這是在home.jsp<br>






這個(gè)問題是:filter涉及session的問題。注意這樣的實(shí)驗(yàn)必須不能在Eclipse自帶的瀏覽器當(dāng)中做。這個(gè)實(shí)驗(yàn)我是在火狐里做成功的,當(dāng)我在瀏覽器中訪問http://localhost:8080/Filter124/MarkToWinServlet時(shí),結(jié)果如下。


me in filter is null
之前 filterChain.doFilter
in servlet
之后 filterChain.doFilter
me in filter is 馬克-to-win
me in filter is 馬克-to-win
之前 filterChain.doFilter
me in jsp is 馬克-to-win
之后 filterChain.doFilter
me in filter is 馬克-to-win




在上面的程序中如果我本應(yīng)正確的寫成:response.sendRedirect("http://localhost: 8080/ServletHello/home.jsp")。但我實(shí)際錯(cuò)誤的寫成了:response.sendRedirect("http: //localhost:8080//ServletHello/home.jsp"); 多寫了一個(gè)/,則輸出的結(jié)果將會(huì)變成:

me in filter is null
之前 filterChain.doFilter
in servlet
之后 filterChain.doFilter
me in filter is null
me in filter is null
之前 filterChain.doFilter
me in jsp is null
之后 filterChain.doFilter
me in filter is null