私はあなたに教えるためにコードを使用します:ログインインターセプトのフィルター
1はじめに
あなたが最初にJava Webの学習を始めたとき、最初に遭遇する人は、Webアプリケーションを開発するためのJSP +サーブレットである必要があると思います。ここでは、サーブレットでのFilterの使用と、対応する実際の開発シナリオについて説明します。
2.フィルターとは?
2.1フィルターの公式定義
フィルター(フィルター)は、リソース(サーブレットまたは静的コンテンツ)要求またはリソース応答、あるいはその両方に対してフィルタリングタスクを実行するオブジェクトです。——JavaEE6ドキュメントからの抜粋
2.2フィルタドキュメントを表示する
Java EE6のドキュメント:https ://tool.oschina.net/apidocs/apidoc?api=javaEE6
3.フィルター実行フローチャートソリューション
4.実際の開発シナリオでフィルタリングする
4.1 Unicode処理
4.1.1ビジネスシナリオ
Java Webの開発では、フォームフォームを中国語で入力し、サーバーに渡して保存する必要があることがよくあります。したがって、文字化けした問題に対処する必要があります。
登録フォームに中国語のパラメーターがある場合、登録されたサーブレットは中国語の文字化けの問題に対処する必要があります。ログインフォームに中国語のパラメーターがある場合、ログインを処理するサーブレットは中国語の文字化けの問題に対処する必要があります。2つのフォームに中国語が含まれる場合は、2回処理する必要があります。 10フォームフォーム、100フォームフォーム???
したがって、Filterによって要求されたすべての中国語の文字化けした問題を処理することは非常に酸っぱくてさわやかです。以下でコードを使って説明します。
4.1.2プロジェクトの構造
PS:現在、このような効果を達成しています。login.jspとregister.jspの2つのフォームを作成し、中国語を入力してフォームを送信します。フィルターを使用して、複数のフォームの中国語の文字化けした問題を均一に処理します。
4.1.3サーブレット処理フォーム
RegisterServlet:
@WebServlet(name = "RegisterServlet",urlPatterns = "/register.do")
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收参数
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
System.out.println("username:"+username+",pwd:"+pwd);
request.getRequestDispatcher("login.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
LoginServlet:
@WebServlet(name = "LoginServlet",urlPatterns = "/login.do")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String pwd = request.getParameter("pwd");
System.out.println("username:"+username+",pwd:"+pwd);
request.getRequestDispatcher("index.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
4.1.4登録およびログイン用のJSPページ
ログインフォーム:
登録フォーム:
4.1.5フィルターを使用して、要求されたすべての中国語の文字化けした文字を処理する
@WebFilter(filterName = "CommonFilter",urlPatterns = "*.do")
public class CommonFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("--------公共拦截器--start----------");
//当每个表单中都有中文提交时,此时Servlet都需要进行乱码处理
req.setCharacterEncoding("UTF-8");
chain.doFilter(req, resp);//放行
System.out.println("--------公共拦截器--end----------");
}
public void init(FilterConfig config) throws ServletException {
}
}
4.1.6デモ効果
ログインページまたは登録ページで中国語を入力すると、サーブレットは中国語の文字化け処理がなくても中国語を受信できます。フィルターは、
以下に示すように、中国語の文字化けした文字の処理に役立ちました。
4.2ユーザーログインインターセプター
4.2.1ビジネスシナリオ
実際の開発では、ユーザーがアクセスする前にログインする必要がある多くの要求があります。例:淘宝網にログインすると、ショッピングカートまたは注文リストを確認するときにログインするように求められます。以下のコードを教えてください、それを達成する方法は???
4.2.2プロジェクトの構造
PS:現時点で効果があり、ユーザーがindex.jspの「注文リスト」にジャンプすると、フィルターがインターセプトされてユーザーがログインしているかどうかが判断され、ログインしていない場合はユーザーがログインするためのログインページにジャンプします。
4.2.2前の例に基づいて、次の準備を行います。
注文リスト:Order.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>订单列表</title>
</head>
<body>
<h1>订单列表</h1>
</body>
</html>
ホームページ:index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>主页</title>
</head>
<body>
<h1>welcome to index.jsp!</h1>
<a href="login.jsp">登录</a>
<a href="register.jsp">注册</a>
<a href="${pageContext.request.contextPath}/order/showOrder.do">查看订单列表</a>
</body>
</html>
OrderServlet:
@WebServlet(name = "OrderServlet",urlPatterns = "/order/showOrder.do")
public class OrderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("------------展示订单列表-------------");
request.getRequestDispatcher("index.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
4.2.3ログインインターセプターの作成
@WebFilter(filterName = "LoginFilter",urlPatterns = "/order/*")
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("--------登录拦截器--start----------");
//涉及到4个作用域
HttpServletRequest request = (HttpServletRequest)req;
HttpSession session = request.getSession();
String userName = (String) session.getAttribute("session_user");
if(userName!=null&!"".equals(userName)){
//说明用户登录了
chain.doFilter(req, resp);//放行
}else{
//说明用户未登录
//跳转到登陆页面
request.setAttribute("tip","请先登录!");
request.getRequestDispatcher("/login.jsp").forward(request,resp);
}
System.out.println("--------登录拦截器--end----------");
}
public void init(FilterConfig config) throws ServletException {
}
}
4.2.4実証効果
1)index.jspページの「注文リストの表示」に直接アクセスします
。2)ユーザーがログインしていないため、ログインページに移動してプロンプトを表示します
。3)コンソールの印刷データを表示し、複数のインターセプター間の戻りプロセスを観察して考えます。
4.3他のシナリオでの適用
1)認証フィルター
2)ログおよび監査フィルター
3)画像変換フィルター
4)データ圧縮フィルター
5)暗号化フィルター
このブログ投稿では、2つの例を使用して、実際の開発シナリオにおけるフィルターの役割を理解します。これら2つの例を理解したら、他のビジネスシナリオのアプリケーションを後で実装します。