JAvaWEB学習のフィルタ
6397 ワード
JavaWeb三大コンポーネント
1.すべてwebで必要です.xmlでのサーブレットListenerの構成
Filter
2.フィルタはwebを通過する.xmlはリソースのセット(jsp、servlet、.css、.htmlなど)の前で実行される大きなリソースを管理しています.管理するリソースにアクセスしたい場合は、処理をブロックします.リクエストにターゲットリソースを取得させることも、リクエストを達成させないこともできます.警備員のように多くのリソースを操作する限りfilterを思い浮かべるべきです
フィルタの作成方法
1.クラス実装Filterインタフェース2を書く.Webでxmlで構成管理するリソース
1.Filterインタフェース
void init(FilterConfig)*作成後、すぐに実行します.Filterはサーバの起動時に作成されます!void destory(*)*破棄する前に実行!サーバのシャットダウン時にvoid doFilter(サーブレットRequest,サーブレットResponse,FilterChain)を破棄*フィルタリングするたびに実行
Filterは一例です!servletと同じ
2. web.xml xxx web.filter.AFitler xxx /*
この構成は、このfilterが管理するリソースを表す.これらのリソースにアクセスすると、このフィルタはdoFilter()を実行します.
FilterConfig-->ServiceletConfigに似ています*初期化パラメータの取得:getInitParameter()*取得フィルタ名:getFilterName()*取得application:getServiceletContext()
FilterChain*doFilter(サーブレットリクエスト、サーブレットResponse):ロー!ターゲットサーブレットを呼び出したサービス()メソッドに相当します!
-------------------------------
-------------------------------
マルチフィルタの場合FilterChainのdoFilter()メソッド:ターゲットリソースを実行するか、次のフィルタを実行します!次のフィルタがない場合はターゲットリソースを実行し、ある場合は次のフィルタを実行します.
-------------------------------
フィルタの4種類のブロック方式
REQUEST デフォルト!ブロッキングダイレクトリクエストFOrWARD ブロッキングリクエスト転送INCLUDE ブロッキングリクエストはERROR ブロッキングエラー転送を含む
で構成!
-------------------------------
複数のフィルタの実行順序
の構成順序がフィルタの実行順序を決定します!
フィルタの適用シーン:
ターゲットリソースを実行する前に前処理を行います.例えば、符号化を設定します.このような試みは通常、ターゲットリソースが実行される前に準備をします.
現在のユーザがログインしているかどうか、またはユーザIPが無効になっているかどうかを確認するなど、条件によってローを実行するかどうかを判断する.
ターゲットリソースの実行後、ターゲットリソースから出力されたデータを処理するなど、後続の特殊な処理を行います.
例:
統計IP
サーブレットContext内のmapをループします.keyはipアドレス、valueはアクセス回数です.
jspページ
フィルタコード
全局文字の文字化けしを解決する
文字化けしの問題:
l要求パラメータにおける乱符号化問題を取得する.
POST要求:request.setCharacterEncoding(“utf-8”);
GET要求:newString(request.getParameter(「xxx」)getBytes(“iso-8859-1”), “utf-8”);
l応答の文字化けし問題:response.setContextType(“text/html;charset=utf-8”).
POST要求の処理は簡単であるが、get要求の処理にはパラメータを取得する必要があり、filterがすべてのフィルタリングリソースのパラメータを取得することは不可能である.ここでrequestをパッケージしてservletに送ることができます.requestオブジェクト(getParamater()メソッドを変更する.パラメータを取得するたびに文字化けし問題を直接解決する).
オブジェクトを強化する方法は3つあります:(aオブジェクトを強化し、fun 1()方法)継承:AAクラスはaオブジェクトのタイプ:Aクラスを継承し、fun 1()メソッドを書き換え、書き換えたfun 1()メソッドが強化されたメソッドである.ただし、継承は、aオブジェクトの真のタイプを知ってから継承する必要があります.aオブジェクトの正確なタイプを知らず、aオブジェクトがIAインタフェースの実装クラスオブジェクトであることしか知らない場合、継承を使用してaオブジェクトを強化することはできません. 装飾者モード:AA類はaオブジェクトの同じインタフェースを実現する:IAインタフェース、またAA類にaオブジェクトを伝達する必要があり、AA類のすべての方法の実現はaオブジェクトを呼び出す同じ方法で実現され、fun 1()方法だけが下の内容を変更し、fun 1()を強化する必要がある. 動的エージェント:エンハンダーモードと比較して に似ています.
ここでrequestオブジェクトを補強するのは、requestオブジェクトの装飾クラスを継承することにより、装飾クラスはインタフェースの包装クラスであるが、補強は一切行われず、それを継承してから補強が必要な方法を書き換えることにより、補強が必要な方法を書き換える必要がなくなる.
(強化時に継承類を見ると、インタフェースのある包装類、三インタフェースの装飾者モードを見る)
継承パッケージクラス強化request
1.すべてwebで必要です.xmlでのサーブレットListenerの構成
Filter
2.フィルタはwebを通過する.xmlはリソースのセット(jsp、servlet、.css、.htmlなど)の前で実行される大きなリソースを管理しています.管理するリソースにアクセスしたい場合は、処理をブロックします.リクエストにターゲットリソースを取得させることも、リクエストを達成させないこともできます.警備員のように多くのリソースを操作する限りfilterを思い浮かべるべきです
フィルタの作成方法
1.クラス実装Filterインタフェース2を書く.Webでxmlで構成管理するリソース
1.Filterインタフェース
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
System.out.println("filterstart...");
chain.doFilter(request,response);//
System.out.println("filterend...");
}
void init(FilterConfig)*作成後、すぐに実行します.Filterはサーバの起動時に作成されます!void destory(*)*破棄する前に実行!サーバのシャットダウン時にvoid doFilter(サーブレットRequest,サーブレットResponse,FilterChain)を破棄*フィルタリングするたびに実行
Filterは一例です!servletと同じ
2. web.xml
この構成は、このfilterが管理するリソースを表す.これらのリソースにアクセスすると、このフィルタはdoFilter()を実行します.
FilterConfig-->ServiceletConfigに似ています*初期化パラメータの取得:getInitParameter()*取得フィルタ名:getFilterName()*取得application:getServiceletContext()
FilterChain*doFilter(サーブレットリクエスト、サーブレットResponse):ロー!ターゲットサーブレットを呼び出したサービス()メソッドに相当します!
-------------------------------
-------------------------------
マルチフィルタの場合FilterChainのdoFilter()メソッド:ターゲットリソースを実行するか、次のフィルタを実行します!次のフィルタがない場合はターゲットリソースを実行し、ある場合は次のフィルタを実行します.
-------------------------------
フィルタの4種類のブロック方式
-------------------------------
複数のフィルタの実行順序
フィルタの適用シーン:
ターゲットリソースを実行する前に前処理を行います.例えば、符号化を設定します.このような試みは通常、ターゲットリソースが実行される前に準備をします.
現在のユーザがログインしているかどうか、またはユーザIPが無効になっているかどうかを確認するなど、条件によってローを実行するかどうかを判断する.
ターゲットリソースの実行後、ターゲットリソースから出力されたデータを処理するなど、後続の特殊な処理を行います.
例:
統計IP
サーブレットContext内のmapをループします.keyはipアドレス、valueはアクセス回数です.
jspページ
<body>
<h1> IP </h1>
<table align="center"width="50%" border="1">
<tr>
<th>IP </th>
<th> </th>
</tr>
<c:forEach items="${aplicationScope.ipCountMap}" var="entry">
<tr>
<td>${entry.key }</td>
<td>${entry.value }</td>
</tr>
</c:forEach>
</table>
</body>
フィルタコード
public void init(FilterConfig fConfig) throws ServletException {
context = fConfig.getServletContext();
Map<String, Integer> ipCountMap = new LinkedHashMap<String, Integer>();
context.setAttribute("ipCountMap", ipCountMap);
}
public void doFilter(ServletRequest request, ServletResponseresponse,
FilterChain chain) throws IOException, ServletException{
HttpServletRequest req = (HttpServletRequest) request;
String ip = req.getRemoteAddr();
Map<String, Integer> ipCountMap = (Map<String,Integer>) context
.getAttribute("ipCountMap");
Integer count = ipCountMap.get(ip);
if (count == null) {
count = 1;
} else {
count += 1;
}
ipCountMap.put(ip, count);
context.setAttribute("ipCountMap", ipCountMap);
chain.doFilter(request, response);
}
public void destroy() {}
}
全局文字の文字化けしを解決する
文字化けしの問題:
l要求パラメータにおける乱符号化問題を取得する.
POST要求:request.setCharacterEncoding(“utf-8”);
GET要求:newString(request.getParameter(「xxx」)getBytes(“iso-8859-1”), “utf-8”);
l応答の文字化けし問題:response.setContextType(“text/html;charset=utf-8”).
POST要求の処理は簡単であるが、get要求の処理にはパラメータを取得する必要があり、filterがすべてのフィルタリングリソースのパラメータを取得することは不可能である.ここでrequestをパッケージしてservletに送ることができます.requestオブジェクト(getParamater()メソッドを変更する.パラメータを取得するたびに文字化けし問題を直接解決する).
オブジェクトを強化する方法は3つあります:(aオブジェクトを強化し、fun 1()方法)
ここでrequestオブジェクトを補強するのは、requestオブジェクトの装飾クラスを継承することにより、装飾クラスはインタフェースの包装クラスであるが、補強は一切行われず、それを継承してから補強が必要な方法を書き換えることにより、補強が必要な方法を書き換える必要がなくなる.
(強化時に継承類を見ると、インタフェースのある包装類、三インタフェースの装飾者モードを見る)
public class EncodingFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// post
request.setCharacterEncoding("utf-8");
HttpServletRequest req = (HttpServletRequest) request;
/*
* GET
*/
// String username = request.getParameter("username");
// username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
/*
* request
*/
if(req.getMethod().equals("GET")) {
EncodingRequest er = new EncodingRequest(req);
chain.doFilter(er, response);
} else if(req.getMethod().equals("POST")) {
chain.doFilter(request, response);
}
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
継承パッケージクラス強化request
/**
* reqeust
*/
public class EncodingRequest extends HttpServletRequestWrapper {
private HttpServletRequest req;
public EncodingRequest(HttpServletRequest request) {
super(request);
this.req = request;
}
public String getParameter(String name) {
String value = req.getParameter(name);
//
try {
value = new String(value.getBytes("iso-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
return value;
}
}