サーブレット学習(五)サーブレットフィルタによるログイン権限検証-ソースコードダウンロード


フィルタを使用してユーザーのログイン状態を検証し、
場合によっては、Webサイトの一部のWebページにログインする必要があるユーザーがアクセスできる場合がありますが、どのように実現すればいいのでしょうか.
フィルタを使用して、論理レイヤにフィルタを追加してログイン状態の検証を行い、指定したインタフェースまたはサーブレットに情報をジャンプします.
まず、具体的な使用プロセスを分析します.
ユーザーがログイン状態にある場合、ユーザーは指定したWebページにアクセスでき、ログインしていないユーザーがこのWebページにアクセスすると、ログインインタフェースに直接ジャンプします.
フローチャートは次のとおりです.
まずhelloを書きましょうjspファイル、すなわちユーザがアクセスしたいターゲットファイル、
簡単な情報を表示させるだけで
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    out.println("Hello World");
%>
</body>
</html>

まず、すべてのインタフェースプログラムを作成します.
次にloginを書きます.jspファイル
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>    </title>
</head>
<style type="text/css">
    body{
        color: #000;
        font-size: 14px;
        margin: 20px auto;
    }
</style>
<script type="text/javascript">
    function check(form) {
        //         
        if (document.forms.loginform.uname.value==""){
            alert("      ");
            //           
            document.forms.loginform.uname.focus();
            return false;
        }
        //        
        if (document.forms.loginform.upwd.value==""){
            alert("      ");
            //           
            document.forms.loginform.upwd.focus();
            return false;
        }
    }
</script>
<body>
    <form action="<%=request.getContextPath()%>/LoginServlet17" method="post" name="loginform">
        <%if (request.getAttribute("return_uri")!=null){%>
        <input type="hidden" name="return_uri" value="<%=request.getAttribute("return_uri")%>"/>
        <%}%>
        <table border="1" cellspacing="0" cellpadding="5" bordercolor="silver" align="center">
            <tr>
                <td colspan="2" align="center" bgcolor="#E8E8E8">    </td>
            </tr>
            <tr>
                <td>   :</td>
                <td><input type="text" name="uname"></td>
            </tr>
            <tr>
                <td>  :</td>
                <td><input type="password" name="upwd"></td>
            </tr>
            <tr>
                <td colspan="2" align="center">
                    <input type="submit" name="submit" onclick="return check(this);">
                    <input type="reset" name="reset">
                </td>
            </tr>
        </table>
    </form>
</body>
</html>

ファイルディレクトリの下にindexというプライマリファイルを設定しなければなりません.jspファイル
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>  </title>
</head>
<body>
  
<br/>
<br/>
<a href="<%=request.getContextPath()%>/17/hello.jsp">hello.jsp</a>
<br/>
<%
    String flag="";
    Object object=session.getAttribute("flag");
    if (object!=null){
        flag=object.toString();
    }
    if (flag.equals("login_success")){
%>
<a href="<%=request.getContextPath()%>/LogoutServlet17">  </a>
<%}else{%>
<a href="<%=request.getContextPath()%>/17/login.jsp">  </a>
<%}%>
</body>
</html>

表現層のコード記述を処理したら,次の論理層のサーブレットプログラムを記述する.
まず、ユーザー名とパスワードが正しいかどうかを検証するログインロジック処理機能が必要です.
LoginServlet17
public class LoginServlet17 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String uname=request.getParameter("uname");
        String upwd=request.getParameter("upwd");
        //                ,
        //                           
        String returnUri=request.getParameter("return_uri");

        System.out.println("   :==》"+uname);
        System.out.println("    :==》"+upwd);
        System.out.println("Return Uri:==》"+returnUri);

        //            
        //                 
        RequestDispatcher rd=null;
        if (uname==null||upwd==null){
            request.setAttribute("msg","        !!!");
            rd=request.getRequestDispatcher("/17/login.jsp");
            rd.forward(request,response);
        }else{
            if (uname.equals("  ")&&upwd.equals("123456")){
                //      ,     session       kvflag,  login_success
                request.getSession().setAttribute("flag","login_success");
                //            ,           
                //          ,      
                if (returnUri!=null){
                    rd=request.getRequestDispatcher(returnUri);
                    rd.forward(request,response);
                }else{
                    rd=request.getRequestDispatcher("/17/index.jsp");
                    rd.forward(request,response);
                }
            }else{
                request.getSession().setAttribute("flag","login_error");
                request.setAttribute("msg","          !!!");
                rd=request.getRequestDispatcher("/17/login.jsp");
                rd.forward(request,response);

            }

        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

ここでは、ログインに成功した後、ユーザーがログインする前のインタフェースにページを再ジャンプするため、ログインインタフェースの前にユーザーがアクセスしたインタフェースを取得しました.この値はフィルタで設定します.
ログインの処理に加えて、ユーザーログインに成功したSessionオブジェクト情報を取得したため、ログインプログラムでSessionオブジェクトの情報を消去する必要があります.インタフェースをトップページに移動します.
ログアウトプログラム
public class LogoutServlet17 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //    session  
        request.getSession().invalidate();
        //      
        response.sendRedirect(request.getContextPath()+"/17/index.jsp");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

次は私たちの最も重要なフィルタの設定です.
まず、フィルタに必要な機能を明確にしなければなりません.
1.ユーザーがアクセスしたいインタフェースを明確にしなければなりません.
2.ユーザがアクセスするインタフェースがログイン権限が必要なインタフェースであると判断した場合、ユーザの現在のログイン状態を判断する必要がある.
3.ユーザーがログインしていないか、ログインエラーが発生した場合は、ログインインタフェースにインタフェースをジャンプする必要があります.
よし、フィルタに必要な機能を明確にすれば実現できます.
public class PermissionFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //       ServletRequest ServletResponse   Http...
        HttpServletRequest hreq= (HttpServletRequest) req;
        HttpServletResponse hresp= (HttpServletResponse) resp;

        //      Servletpath
        String servletpath=hreq.getServletPath();
        //  session  
        HttpSession hsess=hreq.getSession();
        //  session   flag  ,   String  
        String flag= (String) hsess.getAttribute("flag");

        //             login           
        //                  
        //              
        if (servletpath!=null&&(servletpath.equals("/17/index.jsp"))||
                (servletpath.equals("/17/login.jsp"))||
                (servletpath.equals("/LoginServlet17"))){

            chain.doFilter(req, resp);
        }else{
            //                 
            if (flag!=null&&flag.equals("login_success")){
                chain.doFilter(req, resp);
                //    ,        
            }else if (flag!=null&&flag.equals("login_error")){
                hreq.setAttribute("msg","    ,     !!!<br/>");
                hreq.setAttribute("return_uri",servletpath);
                RequestDispatcher rd=hreq.getRequestDispatcher("/17/login.jsp");
                rd.forward(hreq,hresp);
                //         login.jsp  ,   “     !!!”
            }else {
                hreq.setAttribute("msg","     !!!");
                hreq.setAttribute("return_uri",servletpath);
                RequestDispatcher rd=hreq.getRequestDispatcher("/17/login.jsp");
                rd.forward(hreq,hresp);
            }
        }
    }

    public void destroy() {
    }

}

ここでservletrequestとhttpservletrequestの違いを明確にしなければなりませんか?
HttpServeretRequestはServeretRequestを継承し、ServeretにはdoGet、doPostメソッドがあり、doPutメソッドはなく、formのget postに対応する.
servletRequestはインタフェースであり、httpServertRequestは実装されるが、getttpSession()などのhttpServertRequest独自の方法がある.
HttpService Requestインタフェースは、Service Requestインタフェースから継承されます.HTTPに関するいくつかの方法が追加されました.
いわゆるrequest(JSPで使われている)というのは、仕様の1つの名前にすぎません.もちろんオブジェクトですが、SUNが提供しているわけではありません.これは各異なるサーブレットプロバイダによって作成されています.SUNは、このクラスがHttpサーブレットRequestインタフェースを実現することを規定し、各メソッドの用途を規定していますが、具体的にはどのクラスが各プロバイダによって決定されていますか.
web.xmlの構成情報は次のとおりです.
<servlet>
    <servlet-name>LoginServlet17</servlet-name>
    <servlet-class>com.icarus.servlet.LoginServlet17</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LoginServlet17</servlet-name>
    <url-pattern>/LoginServlet17</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>LogoutServlet17</servlet-name>
    <servlet-class>com.icarus.servlet.LogoutServlet17</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>LogoutServlet17</servlet-name>
    <url-pattern>/LogoutServlet17</url-pattern>
</servlet-mapping>

<filter>
    <filter-name>PermissionFilter</filter-name>
    <filter-class>com.icarus.filter.PermissionFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>PermissionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>

これまでJspやサーブレットの勉強はここまでで一段落し、次にSpringなどのjavaフレームワークを勉強してきました.
がんばれ!
ソースのダウンロードアドレス:https://github.com/icaruswang/StudyJsp