Filter實(shí)現(xiàn)登陸驗(yàn)證

今天的簡(jiǎn)歷被查看了十份,還是一個(gè)hr都沒(méi)有給我打電話,有一個(gè)之前投的給我打電話,但是因?yàn)槲椰F(xiàn)在在重慶沒(méi)有面成。



吐槽完畢,分享今日學(xué)習(xí)心得
對(duì)于有些頁(yè)面,我們必須要求登陸成功以后才能訪問(wèn),目前接觸到三種方式,先來(lái)介紹一下使用Filter實(shí)現(xiàn)登陸攔截驗(yàn)證

Filter是一個(gè)接口,若要自定義一個(gè)過(guò)濾器,則必須實(shí)現(xiàn)Filter接口。為了完成登陸驗(yàn)證,首先自定義一個(gè)登陸過(guò)濾器:LoginFilter.java

/**
 * 登陸過(guò)濾器
 *
 * @author hetiantian
 * @version 2017/12/26.
 */
public class LoginFilter implements Filter {

    /**
     * web應(yīng)用程序啟動(dòng)時(shí)調(diào)用此方法,用于初始化該Filter
     *
     * @param filterConfig 可以從參數(shù)中獲取初始化參數(shù)以及ServletContext信息等
     * @throws ServletException
     * */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /**
     * 攔截客戶端的請(qǐng)求
     *
     * @param servletRequest 客戶端的請(qǐng)求
     * @param servletResponse 服務(wù)端的響應(yīng)
     * @param filterChain 傳遞請(qǐng)求給下一個(gè)filter
     * @throws ServletException
     * @throws IOException
     * */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)servletRequest;
        HttpServletResponse rep = (HttpServletResponse)servletResponse;

        //獲取session對(duì)象
        HttpSession session = req.getSession();

        //從session對(duì)象中獲取用戶信息
        String name = (String)session.getAttribute("name");
        System.out.println("name: " + name);

        //如果沒(méi)有登陸,此時(shí)session將取不到值,重定向到登錄頁(yè)面
        if (name == null || name.equals("")) {
            rep.sendRedirect("/login.html");
        } else {
            //如果已經(jīng)登陸,繼續(xù)此次請(qǐng)求
            //可以在這里做用戶名和密碼的驗(yàn)證
            filterChain.doFilter(req, rep);
        }
    }

    /**
     * web程序關(guān)閉時(shí)調(diào)用此方法,用于銷(xiāo)毀一些資源
     * */
    @Override
    public void destroy() {

    }
}

在doFilter方法內(nèi)完成邏輯部分,通過(guò)session中的值來(lái)判斷是否登陸成功,session中的值需要我們自己去實(shí)現(xiàn)保存,因此定義了LoginAction類(lèi)來(lái)完成將用戶信息保存在session中
LoginAction.java:

/**
 * 登陸控制中心
 *
 * @author hetiantian
 * @version  2017/12/26.
 */
public class LoginAction extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("請(qǐng)求分發(fā)正確");
        String name = request.getParameter("name");
        String password = request.getParameter("password");

        //將用戶信息保存到session中
        request.getSession().setAttribute("name", name);
        request.getSession().setAttribute("password", password);

        //重定向到success_login.html頁(yè)面中
        response.sendRedirect("/success_login.html?request");
    }
}

保存成功以后將跳轉(zhuǎn)至/success_login.html,因?yàn)槲覀優(yōu)檫@個(gè)頁(yè)面做了攔截(這個(gè)攔截由LoginFilter實(shí)現(xiàn))

web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!--分發(fā)登錄請(qǐng)求-->
    <servlet>
        <servlet-name>LoginAction</servlet-name>
        <servlet-class>com.cqupt.javaweb.LoginAction</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>LoginAction</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

    <!--登陸過(guò)濾器-->
    <filter>
        <filter-name>login</filter-name>
        <filter-class>com.cqupt.javaweb.LoginFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>login</filter-name>
        <url-pattern>/success_login.html</url-pattern>
    </filter-mapping>
</web-app>

在理一下邏輯:
登錄頁(yè)面login.html:里面有用戶和密碼兩個(gè)信息,表單提交給LoginAction,在doPost方法里面保存用戶信息然后重定向到success_login.html頁(yè)面。只有登陸成功以后才能訪問(wèn)success_login.html,對(duì)success_login.html頁(yè)面通過(guò)LoginFilter做了攔截。

附:login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
      <form action="/login" method="post">
          用戶:<input type="text" name="name"><br/>
          密碼:<input type="password" name="password"><br/>
                <input type="submit" name="提交">
      </form>
</body>
</html>

success_login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
      <center>
         <h4>登陸成功</h4>
      </center>
</body>
</html>

在驗(yàn)證結(jié)果打印值的時(shí)候,出現(xiàn)了亂碼情況,于是又定義了一個(gè)編碼過(guò)濾器,字符編碼Filter是最常用的Filter之一,在request提交給servlet之前對(duì)其指定編碼方式。spring中為我們集成了這個(gè)過(guò)濾器,我們不需要自定義了,只要在web.xml中進(jìn)行過(guò)濾就可以了
編碼過(guò)濾器: EncodingFilter.java

/**
 * 編碼過(guò)濾器,在request提交到servlet之前對(duì)request進(jìn)行指定的編碼方式
 *
 * @author hetiantian
 * @version 2017/12/26.
 */
public class EncodingFilter implements Filter {
    private String characterEncoding;  //編碼方式,配置在web.xml中
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //初始化編碼方式
        characterEncoding = filterConfig.getInitParameter("characterEncoding");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
         //設(shè)置request,response的編碼方式
        if (characterEncoding != null) {
            servletRequest.setCharacterEncoding(characterEncoding);
            servletResponse.setCharacterEncoding(characterEncoding);
        }

        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        //銷(xiāo)毀時(shí)清空資源
        characterEncoding = null;
    }
}

注:這個(gè)解決亂碼的方式只針對(duì)post請(qǐng)求
項(xiàng)目地址:https://github.com/TiantianUpup/javaweb

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 本文包括:1、Filter簡(jiǎn)介2、Filter是如何實(shí)現(xiàn)攔截的?3、Filter開(kāi)發(fā)入門(mén)4、Filter的生命周期...
    廖少少閱讀 7,361評(píng)論 3 56
  • 監(jiān)聽(tīng)器(listener) 監(jiān)聽(tīng)器簡(jiǎn)介 :監(jiān)聽(tīng)器就是一個(gè)實(shí)現(xiàn)特定接口的普通java程序,這個(gè)程序?qū)iT(mén)用于監(jiān)聽(tīng)另一個(gè)...
    奮斗的老王閱讀 2,570評(píng)論 0 53
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,993評(píng)論 19 139
  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,241評(píng)論 22 257
  • 這篇文章介紹了Mobile BI(移動(dòng)商務(wù)智能)使用過(guò)程中涉及的各種身份認(rèn)證的方式,主要目的是對(duì)這些方式的原理進(jìn)行...
    雨_樹(shù)閱讀 2,076評(píng)論 1 2