構(gòu)建一個(gè)spring mvc web程序

在學(xué)習(xí)spring secuity之前我們先構(gòu)建一個(gè)spring mvc的web程序裁着,以后的spring secuity就在這個(gè)web程序基礎(chǔ)上去構(gòu)建捂掰。

  • 加入依賴
    我們使用maven構(gòu)建項(xiàng)目梆砸,我們加入了springmvcservlet相關(guān)的依賴,并且加入了jetty插件,可以不使用外部容器的情況下去運(yùn)行啟動(dòng)項(xiàng)目峦朗,依賴如下:
<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.13.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>


    <build>
        <finalName>springmvc-web</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.4.3.v20170317</version>
                <configuration>
                    <httpConnector>
                        <port>8001</port>
                    </httpConnector>
                    //配置contextPath為/
                    <webApp>
                        <contextPath>/</contextPath>
                    </webApp>
                </configuration>
            </plugin>
        </plugins>
    </build>
  • 首先定義系統(tǒng)啟動(dòng)根類

配置的@EnableWebMvc注解的類需要繼承WebMvcConfigurerAdapter禁偎,來做一下回調(diào)配置(比如說自己定義的類型轉(zhuǎn)換器腿堤,自己定義的攔截器等),詳細(xì)了解可以點(diǎn)擊查看@EnableWebMvc的源碼備注

@EnableWebMvc
@ComponentScan("com.zhihao.miao.mvc")
public class WebAppConfig extends WebMvcConfigurerAdapter {

    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        //配置默認(rèn)的DefaultServletHttpRequestHandler(靜態(tài)資源默認(rèn)使用的servlet)如暖,DefaultServletHttpRequestHandler是HttpRequestHandler的默認(rèn)實(shí)現(xiàn)笆檀,
        configurer.enable();
    }

}
  • 其他的一些配置
/**
 * 系統(tǒng)啟動(dòng)類,配置url過濾的url
 */
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        //以我的理解就是以WebAppConfig來創(chuàng)建spring 容器上下文
        return new Class<?>[]{WebAppConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/*"};
    }
}
  • 定義自己的Controller
@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){
        return "hello spring mvc web";
    }

    @GetMapping("/home")
    public String home(){
        return "home spring mvc web";
    }

    @GetMapping("/admin")
    public String admin(){
        return "admin spring mvc web";
    }
}
  • 測(cè)試

訪問下面三個(gè)接口盒至,都可以訪問酗洒,

http://localhost:8001/hello
http://localhost:8001/home
http://localhost:8001/admin
  • url的組成

這邊說明一下url地址的一些組成,比如說http://127.0.0.1:8081/home枷遂,其可以看成http[s]://[host]:[port][request url][?queryString]樱衷,而request url = [context path][servlet path][path info],url路徑除了context pathservlet path之外就是path_info了酒唉,我們這邊沒有配置context pathservlet path矩桂。

修改一下Controller,

@RestController
public class HelloController {

@GetMapping("/hello")
public String hello(HttpServletRequest req){
    System.out.println("==================");
    System.out.println(" req.getRequestURI(): " + req.getRequestURI());
    System.out.println(" req.getContextPath(): " + req.getContextPath());
    System.out.println(" req.getServletPath(): " + req.getServletPath());
    System.out.println(" req.getPathInfo(): " + req.getPathInfo());
    System.out.println("==================");
    return "hello spring mvc web";
}

@GetMapping("/home")
public String home(){
    return "home spring mvc web";
}

@GetMapping("/admin")
public String admin(){
    return "admin spring mvc web";
}

}

控制臺(tái)打踊韭住:

==================
 req.getRequestURI(): /hello
 req.getContextPath(): 
 req.getServletPath(): 
 req.getPathInfo(): /hello
==================
  • 我們修改pom文件的jetty插件的context path

如下侄榴,

<build>
        <finalName>springmvc-web</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.4.3.v20170317</version>
                <configuration>
                    <httpConnector>
                        <port>8001</port>
                    </httpConnector>
                    <webApp>
                        <!--修改contextPath>
                        <contextPath>/web</contextPath>
                    </webApp>
                </configuration>
            </plugin>
        </plugins>
</build>

此時(shí)訪問的url地址就改成了:

http://localhost:8001/web/hello

控制臺(tái)打印:

==================
 req.getRequestURI(): /web/hello
 req.getContextPath(): /web
 req.getServletPath(): 
 req.getPathInfo(): /hello
==================
  • 我們?cè)偃バ薷?code>servlet path流妻,修改配置類中
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        //以我的理解就是以WebAppConfig來創(chuàng)建spring 容器上下文
        return new Class<?>[]{WebAppConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    /**
     * url mapping 通常有三種配置方式
     *
     * 1: /*
     * 2: /aaa/*, /aaa/bbb/*
     * 3: *.do, *.action
     *
     * 第一種配置方式 servlet Path 為空
     * 第二種配置方式 servlet Path /aaa, /aaa/bbb/
     * 第三種配置方式servlet Path /aaa/bbb.do, /aaa/bbb.action
     *
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/v1/*","/v2/*"};
    }
}

此時(shí)訪問路徑:

http://localhost:8001/web/v1/hello

控制臺(tái)打由瘛:

==================
 req.getRequestURI(): /web/v1/hello
 req.getContextPath(): /web
 req.getServletPath(): /v1
 req.getPathInfo(): /hello
==================

或者:

http://localhost:8001/web/v2/hello

控制臺(tái)打印:

==================
 req.getRequestURI(): /web/v2/hello
 req.getContextPath(): /web
 req.getServletPath(): /v2
 req.getPathInfo(): /hello
==================

講到這邊一個(gè)基于spring web構(gòu)建的web程序已經(jīng)搭建成功绅这,并且可以進(jìn)行訪問了涣达,我們發(fā)現(xiàn)我們應(yīng)用暴露的url地址不管是誰都可以訪問,這樣是不安全的证薇,我們希望其得到一些權(quán)限認(rèn)證度苔,不同的人員認(rèn)證之后才可以訪問具體的資源。而spring secuity就是為了解決這個(gè)問題的浑度,當(dāng)然spring secuity框架能為我們做的事情不僅如此寇窑。

Spring Security

Spring Security is a powerful and highly customizable authentication and access-control framework. It is the de-facto standard for securing Spring-based applications.
Spring Security是一個(gè)強(qiáng)大的且高度可定制化的身份認(rèn)證和訪問控制框架。是一個(gè)基于Spring之上的一個(gè)提供安全解決方案的框架

  • 特征
  1. 多種認(rèn)證方式HTTP BASIC箩张,HTTP Digest(HTTP摘要認(rèn)證)甩骏,X.509窗市,LDAP。Form-based(HTTP表單認(rèn)證)饮笛,OpenID咨察,CAS
  2. 多種權(quán)限驗(yàn)證,支持基于URL的權(quán)限驗(yàn)證福青,方法的權(quán)限驗(yàn)證等
  3. 多種安全領(lǐng)域的解決方案摄狱,XSS,XSRF无午,CORS媒役,session管理,單點(diǎn)登錄(CAS)宪迟,OAuth等等酣衷。
  4. 強(qiáng)大的可擴(kuò)展性,可配置性
  5. 基于官方Java Config(注解)和xml的配置方式
  6. 官方集成springboot次泽,大大簡(jiǎn)化了spring security的開發(fā)難度鸥诽。

參考資料

官方文檔
Spring Security 從入門到進(jìn)階系列教程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市箕憾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拳昌,老刑警劉巖袭异,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異炬藤,居然都是意外死亡御铃,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門沈矿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來上真,“玉大人,你說我怎么就攤上這事羹膳∷ィ” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵陵像,是天一觀的道長(zhǎng)就珠。 經(jīng)常有香客問我,道長(zhǎng)醒颖,這世上最難降的妖魔是什么妻怎? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮泞歉,結(jié)果婚禮上逼侦,老公的妹妹穿的比我還像新娘匿辩。我一直安慰自己,他們只是感情好榛丢,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布铲球。 她就那樣靜靜地躺著,像睡著了一般涕滋。 火紅的嫁衣襯著肌膚如雪睬辐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天宾肺,我揣著相機(jī)與錄音溯饵,去河邊找鬼。 笑死锨用,一個(gè)胖子當(dāng)著我的面吹牛丰刊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播增拥,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼啄巧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了掌栅?” 一聲冷哼從身側(cè)響起秩仆,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猾封,沒想到半個(gè)月后澄耍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晌缘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年齐莲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磷箕。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡选酗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岳枷,到底是詐尸還是另有隱情芒填,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布空繁,位于F島的核電站氢烘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏家厌。R本人自食惡果不足惜播玖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饭于。 院中可真熱鬧蜀踏,春花似錦维蒙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至局待,卻和暖如春斑响,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钳榨。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工舰罚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人薛耻。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓营罢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親饼齿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饲漾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)缕溉,斷路器考传,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • 要加“m”說明是MB,否則就是KB了. -Xms:初始值 -Xmx:最大值 -Xmn:最小值 java -Xms8...
    dadong0505閱讀 4,806評(píng)論 0 53
  • 在我搭建基于Spring Cloud的微服務(wù)體系應(yīng)用的時(shí)候所需要或者是常用的屬性配置文件证鸥,還有這些屬性的用途伙菊,此配...
    StrongManAlone閱讀 3,992評(píng)論 0 18
  • 一提到愛情,相比絕大多數(shù)人想到的是那種心跳的感覺敌土,兩個(gè)人相望一笑的美好。期待一場(chǎng)美好的愛情便是生命中最值得的等待运翼。...
    風(fēng)寫閱讀 406評(píng)論 0 1