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)用此方法单料,用于銷毀一些資源
     * */
    @Override
    public void destroy() {

    }
}

在doFilter方法內(nèi)完成邏輯部分埋凯,通過(guò)session中的值來(lái)判斷是否登陸成功,session中的值需要我們自己去實(shí)現(xiàn)保存扫尖,因此定義了LoginAction類來(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() {
        //銷毀時(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)系作者
  • 序言:七十年代末帆赢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子线梗,更是在濱河造成了極大的恐慌椰于,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仪搔,死亡現(xiàn)場(chǎng)離奇詭異瘾婿,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)烤咧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)偏陪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人煮嫌,你說(shuō)我怎么就攤上這事笛谦。” “怎么了昌阿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵饥脑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我懦冰,道長(zhǎng)灶轰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任刷钢,我火速辦了婚禮笋颤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘内地。我一直安慰自己伴澄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布瓤鼻。 她就那樣靜靜地躺著,像睡著了一般贤重。 火紅的嫁衣襯著肌膚如雪茬祷。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天并蝗,我揣著相機(jī)與錄音祭犯,去河邊找鬼秸妥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沃粗,可吹牛的內(nèi)容都是我干的粥惧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼最盅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼突雪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起涡贱,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咏删,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后问词,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體督函,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年激挪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辰狡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垄分,死狀恐怖宛篇,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锋喜,我是刑警寧澤些己,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站嘿般,受9級(jí)特大地震影響段标,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炉奴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一逼庞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞻赶,春花似錦赛糟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至师逸,卻和暖如春司倚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工动知, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留皿伺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓盒粮,卻偏偏與公主長(zhǎng)得像鸵鸥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丹皱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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

  • 本文包括:1妒穴、Filter簡(jiǎn)介2、Filter是如何實(shí)現(xiàn)攔截的种呐?3宰翅、Filter開(kāi)發(fā)入門(mén)4、Filter的生命周期...
    廖少少閱讀 7,248評(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,488評(píng)論 0 53
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理汁讼,服務(wù)發(fā)現(xiàn),斷路器阔墩,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 22年12月更新:個(gè)人網(wǎng)站關(guān)停嘿架,如果仍舊對(duì)舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,160評(píng)論 22 257
  • 這篇文章介紹了Mobile BI(移動(dòng)商務(wù)智能)使用過(guò)程中涉及的各種身份認(rèn)證的方式,主要目的是對(duì)這些方式的原理進(jìn)行...
    雨_樹(shù)閱讀 2,002評(píng)論 1 2