在本篇文章中將使用過濾器進行編碼轉換、登陸驗證、防站外提交的過程,為了演示,我把編碼轉換放在一個filter中,登陸驗證和防站外提交放在另一個filter中,兩個filter進行串聯工作。
1、為了演示,先制作這兩個filter
//這個filter是為了做編碼轉換,只要訪問.jsp網頁都要功過這個filter
/**類名:filter.Encoding
*作用:對后臺修改進行權限驗證和防止站外提交
*作者:luoshao
*日期:2008-1-9
*/
package filter;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Encoding implements Filter {
/** Request.java
* 對 HttpServletRequestWrapper 進行擴充, 不影響原來的功能并能提供所有的 HttpServletRequest
* 接口中的功能. 它可以統一的對 Tomcat 默認設置下的中文問題進行解決而只需要用新的 Request 對象替換頁面中的
* request 對象即可.
*/
class Request extends HttpServletRequestWrapper
{
public Request(HttpServletRequest request) {
super(request);
}
/**
* 轉換由表單讀取的數據的內碼.
* 從 ISO 字符轉到 GBK.
*/
public String toChi(String input) {
try {
byte[] bytes = input.getBytes("ISO8859-1");
return new String(bytes, "GBK");
}
catch (Exception ex) {
}
return null;
}
/**
* Return the HttpServletRequest holded by this object.
*/
private HttpServletRequest getHttpServletRequest()
{
return (HttpServletRequest)super.getRequest();
}
/**
* 讀取參數 -- 修正了中文問題.
*/
public String getParameter(String name)
{
return toChi(getHttpServletRequest().getParameter(name));
}
/**
* 讀取參數列表 - 修正了中文問題.
*/
public String[] getParameterValues(String name)
{
String values[] = getHttpServletRequest().getParameterValues(name);
if (values != null) {
for (int i = 0; i < values.length; i++) {
values[i] = toChi(values[i]);
}
}
return values;
}
}
public void destroy() {
}
第二個filter做登陸驗證和防止站外提交
/**類名:filter.SecurityAndDeny
*作用:對后臺修改進行權限驗證和防止站外提交
*作者:luoshao
*日期:2008-1-9
*/
package filter;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SecurityAndDeny implements Filter{
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)resp;
//權限驗證
HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("username") == null) {
//*用戶登錄以后需手動添加session
response.sendRedirect(request.getContextPath() + "/adminLogin.jsp");
}
//防止站外提交
String s1=request.getHeader("Referer");
String s2=request.getServerName();
s1=s1.substring(7,7+s2.length());
System.out.println("s1=" + s1 + " s2="+ s2 + "s2.length()=" +s2.length());
if(!s1.equals(s2)){
PrintWriter out=response.getWriter();
out.println("you are doing wrong activities...");
return ;
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpreq = (HttpServletRequest)request;
if(httpreq.getMethod().equals("POST")) {
request.setCharacterEncoding("GBK");
} else {
request = new Request(httpreq);
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
2、為了清楚起見,看下web.xml的filter設置
<!--filter setting-->
<filter>
<filter-name>encoding</filter-name>
<filter-class>filter.Encoding</filter-class>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>securityAndDeny</filter-name>
<filter-class>filter.SecurityAndDeny</filter-class>
</filter>
<filter-mapping>
<filter-name>securityAndDeny</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
從設置可以看出,如果訪問了/admin/下的網頁,這個兩個filter將先后執行,形成串聯工作,即首先對request進行編碼轉換,然后才進行登陸驗證和防站外提交,都通過后才能訪問您要的網頁資源
3、制作登陸驗證servlet
該servlet代碼如下:
/**登陸驗證servlet
*作者:luoshao
*日期:2008-1-9
*/
package servlet;
import geci.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class AdminLogin extends HttpServlet{
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
try{
String username=request.getParameter("username").replace("'","''");
String password=request.getParameter("password").replace("'","''");
//System.out.println(username + "/" + password);
LrcDB lrcdb=new LrcDB();//來自geci.LrcDB,該類用到了tomcat連接池[清參看我關于連接池的設置]
HttpSession session = request.getSession(true);
if(lrcdb.adminLogin(username,password)){
session.setAttribute("username",username);//驗證成功設置session
//當轉向admin/下的網頁是會啟用第二個filter
response.sendRedirect(request.getContextPath()+"/admin/admin.jsp");
}else{
session.invalidate();//登陸失敗,session失效
response.sendRedirect(request.getContextPath()+"/LoginErr.htm");
}
}catch(Exception e){
e.printStackTrace();
}
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
doPost(request,response);
}
}
4、web.xml中的servlet設置
<servlet>
<servlet-name>adminLogin</servlet-name>
<servlet-class>servlet.AdminLogin</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>adminLogin</servlet-name>
<url-pattern>/adminLogin</url-pattern>
5、制作登陸頁面
<form action="adminLogin" method="POST" name="form2">
<tr>
<td width="97" height="23" bgcolor="#EEEEEE"> <img src="images/User_Login.gif" width="13" height="13" />管理員登陸</td>
<td width="93"> </td>
</tr>
<tr height="1">
<td bgcolor="#808080"> </td>
<td bgcolor="#808080"> </td>
</tr>
<tr>
<td height="30" colspan="2" bgcolor="#F2F2F2"> 管理員:
<label>
<input name="username" type="text" id="username" size="15" />
</label></td>
</tr>
<tr>
<td height="30" colspan="2" bgcolor="#F2F2F2"> 密 碼:
<label>
<input name="password" type="password" id="password" size="15" />
</label></td>
</tr>
<tr>
<td height="30" colspan="2" bgcolor="#F2F2F2"><div align="center">
<label>
<input name="Submit" type="submit" class="buttonYinse" value="登 陸" />
</label>
</div></td>
</tr>
</form>
頁面其他部分省略。。。
可以看出表單提交給步驟3的servlet
------完
演示得從后面往前說了,當我們訪問了網站中除了/admin/下的網頁時,tomcat只啟用第一個filter;當我們登陸的時候,表單提交個/adminLogin,那么就啟用了第一個filter,對request的編碼進行了轉換,然后servlet對用用戶名密碼驗證后,轉向/admin/admin.jsp時,tomcat首先啟用一次第一個filter,然后直接轉到第二個filter,第二個filter發現session已經有了(剛才servlet驗證通過并設置了session)就直接進入了/admin/admin.jsp;如果用戶在未登陸情況下直接訪問/admin/admin.jsp,那么同樣會首先啟用第一個filter進行編碼轉換,然后再到第二個filter,在第二個filter中發現session根本沒有username屬性,頁面被強制轉向到/adminLogin.jsp,在這個轉向過程同樣還有啟用第一個filter。。。。。是不是很復雜,呵呵。
唯一的擔心:因為在這些跳轉中不止一次的啟用filter,對tomcat增加負擔,后果會不會很嚴重 -_-!!,不清楚。。。。。。
原文出處:http://luoshao.blog.163.com/blog/static/111399502008091058895/
柴油發電機
發電機
柴油機
柴油發電機
13636374743(上海)
13291526067(嘉興)