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

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






例 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>






這個問題是:filter涉及session的問題。注意這樣的實驗必須不能在Eclipse自帶的瀏覽器當中做。這個實驗我是在火狐里做成功的,當我在瀏覽器中訪問http://localhost:8080/Filter124/MarkToWinServlet時,結果如下。


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




在上面的程序中如果我本應正確的寫成:response.sendRedirect("http://localhost: 8080/ServletHello/home.jsp")。但我實際錯誤的寫成了:response.sendRedirect("http: //localhost:8080//ServletHello/home.jsp"); 多寫了一個/,則輸出的結果將會變成:

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