JavaEE学習ノートのサーブレット/JSP(5)
サーブレットでよく使用されるフィルタをいくつか示します.
一、文字コードのフィルタ
web.xml
二、すべての動的ページをキャッシュするフィルタを禁止する
a)3つのHTTP応答ヘッダフィールドは、ブラウザが現在のページをキャッシュすることを禁止することができ、それらのサーブレットにおけるサンプルコードは以下の通りである.
b)すべてのブラウザが上記の3つの応答ヘッダを完全にサポートできるわけではないので、上記の3つの応答ヘッダを同時に使用することが望ましい.
c)Expiresデータヘッダ:値はGMT時間値、値は-1ブラウザがページをキャッシュしないことを指す
d)Cache-Control応答ヘッダには2つの共通値がある.
web.xml
複数のfilter-mappingを設定して、異なるファイルタイプをマッピングできます.
テスト:
フォーム・データをコミットし、戻ってフォーム内のデータがまだ存在するかどうかを確認します.
三、ユーザーがログインしていないことを防止するフィルタ
私たちはよくこの機能を使うかもしれません.例えば、ユーザーがログインしてバックグラウンドの操作ページにアクセスしないことを望んでいません.また、このような不正アクセスはシステムを極めて安全ではありません.そのため、私たちは常にログインして他のページにアクセスすることを許可する必要があります.いいえ、ログインページだけが表示されます.もちろん、私の考えは:
1つは、jspページでsessionの判断を行い、そのユーザのsessionが存在しない場合はログインページにジャンプし、そうでなければjspページコードを実行しますが、このような論理も簡単であることがわかりますが、非常に面倒で、多くのjspがあれば、複数の判定を書く必要があります.
もう1つは、フィルタを利用してページにアクセスする際にフィルタ検証を行い、そのユーザーセッションが存在する場合はそのページにアクセスし、そうでない場合はログインページにジャンプしてログインし、セッションを保存して他のページにアクセスする
web.xml
一、文字コードのフィルタ
/** * HTTP , encoding , HtmlForm */
public class CharacterEncodingFilter implements Filter {
private FilterConfig config = null;
private String defaultCharset = "utf-8";
public CharacterEncodingFilter() {
// TODO Auto-generated constructor stub
}
/** * @see Filter#destroy() */
public void destroy() {
this.config = null;
this.defaultCharset = null;
}
/** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String charset = config.getInitParameter("encoding");
if (charset == null) {
charset = defaultCharset;
}
request.setCharacterEncoding(charset);
// response , servlet ,
// jsp , jsp
request.setCharacterEncoding(charset);
resp.setContentType("text/html;charset=" + charset);
chain.doFilter(req, resp);
}
/** * @see Filter#init(FilterConfig) */
public void init(FilterConfig fConfig) throws ServletException {
this.config = fConfig;
}
}
web.xml
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>com.briup.day03.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
二、すべての動的ページをキャッシュするフィルタを禁止する
a)3つのHTTP応答ヘッダフィールドは、ブラウザが現在のページをキャッシュすることを禁止することができ、それらのサーブレットにおけるサンプルコードは以下の通りである.
response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
b)すべてのブラウザが上記の3つの応答ヘッダを完全にサポートできるわけではないので、上記の3つの応答ヘッダを同時に使用することが望ましい.
c)Expiresデータヘッダ:値はGMT時間値、値は-1ブラウザがページをキャッシュしないことを指す
d)Cache-Control応答ヘッダには2つの共通値がある.
no-cache 。
max-age:xxx xxx
/** * Browser */
public class NoCacheFilter implements Filter {
public NoCacheFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
response.setDateHeader("expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
web.xml
<filter>
<filter-name>noCacheFilter</filter-name>
<filter-class>com.briup.day03.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>noCacheFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>noCacheFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
複数のfilter-mappingを設定して、異なるファイルタイプをマッピングできます.
テスト:
フォーム・データをコミットし、戻ってフォーム内のデータがまだ存在するかどうかを確認します.
三、ユーザーがログインしていないことを防止するフィルタ
私たちはよくこの機能を使うかもしれません.例えば、ユーザーがログインしてバックグラウンドの操作ページにアクセスしないことを望んでいません.また、このような不正アクセスはシステムを極めて安全ではありません.そのため、私たちは常にログインして他のページにアクセスすることを許可する必要があります.いいえ、ログインページだけが表示されます.もちろん、私の考えは:
1つは、jspページでsessionの判断を行い、そのユーザのsessionが存在しない場合はログインページにジャンプし、そうでなければjspページコードを実行しますが、このような論理も簡単であることがわかりますが、非常に面倒で、多くのjspがあれば、複数の判定を書く必要があります.
もう1つは、フィルタを利用してページにアクセスする際にフィルタ検証を行い、そのユーザーセッションが存在する場合はそのページにアクセスし、そうでない場合はログインページにジャンプしてログインし、セッションを保存して他のページにアクセスする
public class LoginFilter implements Filter {
public static final String login_page = "/test/admin/index.jsp";
public static final String logout_page = "/test/admin/Public/login.jsp";
@Override
public void destroy() {
System.out.println("OneFilter 。。。");
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
String requestURI = request.getRequestURI();
String cxtPath = request.getContextPath();
//
String targerURL = requestURI.substring(cxtPath.length());
HttpSession session = request.getSession(false);
// ,
if (!("/admin/Public/login.jsp".equals(targerURL))) {
// , , session ,
if(session == null || session.getAttribute("admin") == null){
response.sendRedirect(logout_page);
return;
}else {
// , , ,
chain.doFilter(request, response);
return;
}
}else {
// ,
chain.doFilter(request, response);
return;
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("OneFilter 。。。");
}
}
web.xml
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.test.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
// jsp ,
<url-pattern>*.jsp</url-pattern>
</filter-mapping>