Filter與Session配合的簡(jiǎn)單過(guò)渡例子

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






例 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è)問(wèn)題是:filter涉及session的問(wèn)題。注意這樣的實(shí)驗(yàn)必須不能在Eclipse自帶的瀏覽器當(dāng)中做。這個(gè)實(shí)驗(yàn)我是在火狐里做成功的,當(dāng)我在瀏覽器中訪問(wèn)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)正確的寫(xiě)成:response.sendRedirect("http://localhost: 8080/ServletHello/home.jsp")。但我實(shí)際錯(cuò)誤的寫(xiě)成了:response.sendRedirect("http: //localhost:8080//ServletHello/home.jsp"); 多寫(xiě)了一個(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