Java Web---登錄驗證和字符編碼過濾器


什么是過濾器?

在Java Web中,過濾器即Filter。Servlet API中提供了一個Filter接口(javax.servlet.Filter)。開發web應用時,假設編寫的Java類實現了這個接口,則把這個Java類稱之為過濾器Filter。

通過Filter技術,開發者能夠實現用戶在訪問某個目標資源之前,對訪問的請求和響應進行攔截。簡單說。就是能夠實現web容器對某資源的訪問前截獲進行相關的處理,還能夠在某資源向web容器返回響應前進行截獲進行處理。

創建一個Filter的步驟

1.創建一個Filter處理類(實現javax.servlet.Filter接口)
2.在web.xml文件里配置Filter

Filter運行流程

1.Filter對用戶的請求進行預處理
2.處理好后將請求交給Servlet處理並生成響應
3.最后Filter再對server響應進行后處理

字符編碼過濾器

CharacterFilter.java

package org.LabReserve.filter;

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;

public class CharacterFilter implements Filter {   //實現Filter接口
    private String character;   //保存字符編碼的類型

    @Override
    public void destroy() {   //在Filter銷毀前。完畢某些資源的回收

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
            FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");           //能夠直接設置編碼
        servletResponse.setCharacterEncoding(character);    //也能夠讀取初始化的參數character
        filterChain.doFilter(servletRequest, servletResponse);   //轉到下一個過濾器
    }

    @Override
    public void init(FilterConfig fc) throws ServletException {   //完畢Filter的初始化
        //讀取web.xml中Filter配置的初始化參數
        character = fc.getInitParameter("character");
    }

}

web.xml文件里的配置

<!-- 定義一個Filter -->
    <filter>
        <!-- Filter的名字 -->
        <filter-name>CharacterFilter</filter-name>
        <!-- Filter的實現類 -->
        <filter-class>org.LabReserve.filter.CharacterFilter</filter-class>
        <!-- 初始化參數 -->
        <init-param>
            <!-- 參數名 -->
            <param-name>character</param-name>
            <!-- 參數值,編碼為utf-8 -->
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <!-- 定義Filter要攔截的url地址 -->
    <filter-mapping>
        <!-- Filter的名字 -->
        <filter-name>CharacterFilter</filter-name>
        <!-- 要攔截的url,這里是所有攔截 -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

登錄驗證過濾器

LoginFilter.java

package org.LabReserve.filter;

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;
import javax.servlet.http.HttpSession;

public class LoginFilter implements Filter {

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest servletRequest,
            ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        // 轉換為HTTP請求對象
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        // 轉化為HTTP響應對象
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // 獲得請求相應的session對象
        HttpSession session = request.getSession();

        // 獲得用戶請求的URI
        String path = request.getRequestURI();

        // 不用驗證登錄過濾的頁面
        String[] noCheckPages = { "index.jsp","findPassword.jsp",
                "LoginServlet","UserServlet",
                "css","images","js"};

        // int indexOf(int ch) 返回指定字符在此字符串中第一次出現處的索引。沒找到則返回-1
        for (int i = 0; i < noCheckPages.length; ++i) {
            if (path.indexOf(noCheckPages[i]) > -1) {
                // 轉到下一個過濾器
                filterChain.doFilter(servletRequest, servletResponse);
                return;   //不再過濾,防止頁面重定向循環
            }
        }

        // 假設session為null,說明用戶是第一次訪問
        if (session.getAttribute("userId") != null
                || session.getAttribute("teacherId") != null
                || session.getAttribute("adminId") != null) {
            // 轉到下一個過濾器
            filterChain.doFilter(request, response);
        } else {
            // 又一次定向到首頁
            response.sendRedirect("index.jsp");
            return;   //不再過濾,防止頁面重定向循環
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

}

web.xml文件配置

<filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>org.LabReserve.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

參考鏈接:http://lavasoft.blog.51cto.com/62575/275586/
http://www.cnblogs.com/lyp3314/archive/2012/11/03/2752097.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM