權限驗證過濾器案例需求
- 現在一個網站上需要有登錄功能,在登陸成功之後,重定向到後臺的成功頁面(後臺的頁面有很多),如果沒有登錄直接在地址欄輸入後臺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>