過濾器應用——之檢查用戶是否登錄


       剛開始接觸技術,對這片領域充滿了好奇,第一次寫博客心里有點小激動~,開通此博客的主要目的是為了將自己學到的一些東西記錄下來,這是一個復習與總結的過程,有利於鞏固自己對知識的理解。俗話說的好,好記性不如爛筆頭,學習——思考——總結——記錄,技術的學習周期一般是這樣的,希望我能堅持下去,能在技術這條路上走的更遠!Say good luck to myself!

  好了,廢話不多說直接進入主題:本文主要記錄web開發中過濾器的應用。

  通常,我們在登錄一些網站后比如說登錄某論壇,如果想發表評論,系統往往會提示:“您還沒有登錄,請登錄后在。。。。”這里系統檢測用戶是否登錄的過程就用到了過濾器。過濾器主要是實現Filter接口,比如:

package com.chris.filter;

import java.io.IOException;
import java.util.Arrays;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.catalina.connector.Request;

import com.sun.xml.internal.bind.v2.runtime.unmarshaller.XsiNilLoader.Array;

public class LoginFilter implements Filter {
    
    private String sessionKey;
    private String rediretUrl;
    private String uncheckedUrls;
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        ServletContext servletContext=filterConfig.getServletContext();
        sessionKey=servletContext.getInitParameter("userSessonKey");
        rediretUrl=servletContext.getInitParameter("rediretUrl");
        uncheckedUrls=servletContext.getInitParameter("uncheckedUrls");
    }

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest httpServletRequest=(HttpServletRequest) servletRequest;
        HttpServletResponse httpServletResponse=(HttpServletResponse) servletResponse;
        
        //1、得到用戶請求路徑
        String servletPath=httpServletRequest.getServletPath();
        //2、放行不需要過濾的頁面,如登錄界面之類的
        List<String> urls=Arrays.asList(uncheckedUrls.split(","));
        if(urls.contains(servletPath)){
            filterChain.doFilter(httpServletRequest, httpServletResponse);
            return;
        }
        //3、從session中獲取用戶並判斷用戶是否登錄過,如果沒有登錄過則重定向到登錄界面
        Object user= httpServletRequest.getSession().getAttribute(sessionKey);if(user==null){
            httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+rediretUrl);
            return;
        }
        
        //4、否則放行
        filterChain.doFilter(httpServletRequest, httpServletResponse);
    }
}

 

文中sessionKey,rediretUrl,uncheckedUrls是初始化在web.xml中的,在LoginFilter 中通過FilterConfig對象獲取這些值,這里FilterConfig類似於ServletConfig:

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>LoginFilter</display-name>
  <welcome-file-list>
    <welcome-file>login/index.jsp</welcome-file>
  </welcome-file-list>
  <context-param>
      <param-name>userSessonKey</param-name>
      <param-value>USERSESSONKEY</param-value>
  </context-param>
  <context-param>
      <param-name>rediretUrl</param-name>
      <param-value>/login/login.jsp</param-value>
  </context-param>
  <context-param>
      <param-name>uncheckedUrls</param-name>
      <param-value>/login/a.jsp,/login/login.jsp,/login/index.jsp,/login/dologin.jsp</param-value>
  </context-param>
  <filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>com.chris.filter.LoginFilter</filter-class>      
  </filter>  
  <filter-mapping>
      <filter-name>loginFilter</filter-name>
      <url-pattern>/login/*</url-pattern>
  </filter-mapping>
</web-app>

 

 

本例子中為了方便,LoginFilter 類中的form表單的action是跳轉到另一個jsp中的——dologin.jsp.

 

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

    <%
        String username = request.getParameter("username");
        if (username != null && !username.trim().equals("")) {
       //如果username不為空則將username放入到session中,以便LoginFilter 類中進行用戶是否登錄的判斷 session.setAttribute(application.getInitParameter(
"userSessonKey"), username); response.sendRedirect("index.jsp"); }else{ response.sendRedirect("login.jsp"); } %> </body> </html>

 

到這里,一個簡單的檢測用戶是否登錄的過濾器就完成了。本人理解比較淺顯,請各位大神指正!

 

  


免責聲明!

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



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