3、案例:權限驗證過濾器、通用字符集編碼過濾器

權限驗證過濾器案例需求

  • 現在一個網站上需要有登錄功能,在登陸成功之後,重定向到後臺的成功頁面(後臺的頁面有很多),如果沒有登錄直接在地址欄輸入後臺url,也是可以登錄的。
  • 編寫一個過濾器:可以對沒有登錄的用戶進行攔截。(沒有登錄,回到登陸頁面,如果已經登陸,放行。)

權限驗證過濾器代碼

package com.itheima.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 com.itheima.domain.User;

public class PrivilegeFilter implements Filter {

	@Override
	public void destroy() {

	}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
			throws IOException, ServletException {
		//判斷:用戶是否已經登陸,如果登錄了,放行;沒有登錄,回到登陸頁面。
		HttpServletRequest request = (HttpServletRequest) arg0;
		User existUser = (User) request.getSession().getAttribute("existUser");
		//判斷
		if(existUser == null) {
			//沒有登陸
			request.setAttribute("msg", "您還沒有登錄,請先登錄");
			request.getRequestDispatcher("/login.jsp").forward(arg0, arg1);
		}else {
			//已經登陸
			arg2.doFilter(arg0, arg1);
		}
	}

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

	}

}

配置權限驗證過濾器

  <filter>
	<filter-name>PrivilegeFilter</filter-name>  
	<filter-class>com.itheima.Filter.PrivilegeFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>PrivilegeFilter</filter-name>
  	<url-pattern>/jsp/*</url-pattern>
  </filter-mapping>

除了登陸頁面(login.jsp)在根目錄,其他jsp文件放在jsp文件夾裏,所有需訪問後續頁面的路徑都必須先經過過濾器判斷。

通用字符集編碼過濾器案例需求

  • 網站,需要向後臺提交中文的數據(有可能是get、也有可能是post提交)。中文處理方式不同。
  • 需要調用request.getparamater()方法接收數據,但這個時候無論是get還是post接收數據都會亂碼,怎麼解決?
  • 通過上面的分析,現在增強request的getparamater方法,增強的過程要寫在過濾器當中。
    在這裏插入圖片描述

通用字符集編碼過濾器代碼實現

package com.itheima.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;

/**
 * 通用的字符集編碼過濾器
 */
public class GenericEncodingFilter implements Filter {
	
	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		//在過濾器中增強request對象,並將增強後的request對象傳遞給Servlet
		HttpServletRequest req = (HttpServletRequest) request;
		MyHttpServletRequest myReq = new MyHttpServletRequest(req);
		chain.doFilter(myReq, response);
		
	}


	public void init(FilterConfig fConfig) throws ServletException {
	}

}
package com.itheima.Filter;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
 * 增強的類
 */

public class MyHttpServletRequest  extends HttpServletRequestWrapper{

	private HttpServletRequest request;

	public MyHttpServletRequest(HttpServletRequest request) {
		super(request);
		this.request=request;
	}
	//增強request.getparameter()方法

	@Override
	public String getParameter(String name) {
		//獲得請求方式
		String method = request.getMethod();
		//根據get還是post請求進行不同方式亂碼的處理
		if("GET".equalsIgnoreCase(method)) {
			String value = super.getParameter(name);
			try {
				value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			return value;
		}else if ("POST".equalsIgnoreCase(method)) {
			try {
				request.setCharacterEncoding("UTF-8");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		return super.getParameter(name);
	}
	

}
  <filter>
    <display-name>GenericEncodingFilter</display-name>
    <filter-name>GenericEncodingFilter</filter-name>
    <filter-class>com.itheima.Filter.GenericEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>GenericEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章