string boot 與 filter

来源:http://www.cnblogs.com/elvinle/archive/2017/12/19/8067565.html
-Advertisement-
Play Games

spring boot 裡面用攔截器好像比用過濾器多一點. 在過濾器中, 並不能獲取到action的相關信息, 會造成很多的麻煩和功能欠缺. 那, 這裡就用過濾器做一個小慄子, 實際使用過程中, 不會這麼做的. 用過濾器做一個不完善的登錄許可權判斷. 一. 過濾器 在這裡慄子里, 應該在過濾器裡面加個 ...


spring boot 裡面用攔截器好像比用過濾器多一點. 在過濾器中, 並不能獲取到action的相關信息, 會造成很多的麻煩和功能欠缺.

那, 這裡就用過濾器做一個小慄子, 實際使用過程中, 不會這麼做的. 

用過濾器做一個不完善的登錄許可權判斷.

一. 過濾器

package org.elvin.springboot.filter;

import org.thymeleaf.util.StringUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class LoginFilter implements Filter {


    private String passUrl;

    private String loginUrl;

    //region getter / setter
    public String getPassUrl() {
        return passUrl;
    }

    public void setPassUrl(String passUrl) {
        this.passUrl = passUrl;
    }

    public String getLoginUrl() {
        return loginUrl;
    }

    public void setLoginUrl(String loginUrl) {
        this.loginUrl = loginUrl;
    }
    //endregion

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        if(isPassUrl(req)){
            filterChain.doFilter(req, resp);
            return;
        }

        HttpSession session = req.getSession();
        String token = (String)session.getAttribute("token");
        if(StringUtils.isEmpty(token)){
            resp.sendRedirect(req.getContextPath() + loginUrl);
            return ;
        }

        filterChain.doFilter(req, resp);
    }

    /**
     * 判斷是否不需要許可權
     * @param req
     * @return
     */
    public boolean isPassUrl(HttpServletRequest req){
        String requestURI = req.getRequestURI() + ";";
        String contextPath = req.getContextPath();
        if(!requestURI.startsWith(contextPath)){
            return false;
        }
        requestURI = requestURI.substring(contextPath.length());
        if(0 <= passUrl.indexOf(requestURI)){
            return true;
        }
        return false;
    }
}

在這裡慄子里, 應該在過濾器裡面加個文件請求過濾. 不過, 好像沒有影響到結果, 所以, 懶得處理了, 後面攔截器的時候, 會再實現一遍這個功能.

 

二. 攔截器的java配置文件

package org.elvin.springboot.config;

import org.elvin.springboot.filter.LoginFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;

@Configuration
public class LoginConfig {

    @Value("${passUrl}")
    private String passUrl;

    @Value("${loginUrl}")
    private  String loginUrl;

    @Bean(name="loginFilter")
    public Filter loginFilter(){
        LoginFilter filter = new LoginFilter();
        filter.setPassUrl(passUrl);
        filter.setLoginUrl(loginUrl);
        return filter;
    }

    @Bean
    public FilterRegistrationBean registrationBean(){
        FilterRegistrationBean reg = new FilterRegistrationBean();
        reg.setFilter(loginFilter());
        reg.addUrlPatterns("/*");
        reg.setName("loginFilter");
        reg.setOrder(Integer.MAX_VALUE);
        return reg;
    }

}

這裡面沒有寫註釋了, 看到方法名, 應該能看明白方法是幹啥的.

 

三. yml配置文件

passUrl: /login/index;/login/checkOut;
loginUrl: /login/index

loginUrl 是登錄頁面地址, passUrl 是不需要登錄的頁面地址

到這裡, 過濾器已經結束了. 接下來, 加入控制器和視圖.

 

四. controller / view

package org.elvin.springboot.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Controller
@RequestMapping("login")
public class LoginController {

    @Autowired
    private HttpServletRequest request;

    @GetMapping("index")
    public String index(){
        HttpSession session = request.getSession();
        session.setAttribute("token", "token");

        return "login/index";
    }

    @PostMapping("checkOut")
    @ResponseBody
    public String checkOut(){
        HttpSession session = request.getSession();
        session.setAttribute("token", null);
        return "success";
    }
}

html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" />
    <title>index</title>
    <link rel="stylesheet" th:href="@{/bootstrap/css/bootstrap.css}" />
</head>
<body>
    <div class="container">
        <input type="button" th:value="登出" id="checkout"/>
    </div>


    <script th:src="@{/js/jquery-1.11.3.js}"></script>
    <script th:src="@{/bootstrap/js/bootstrap.js}" ></script>
    <script th:inline="javascript">
        $(function(){
            $(".container").delegate("#checkout", "click", function(){
                $.ajax({
                    url: [[@{/login/checkOut}]],
                    type:'post',
                    data:'',
                    success: function(res){
                        if(res == "success"){
                            alert("登出成功!");
                        }
                    }
                });
            });
        });
    </script>
</body>
</html>

結果展示還真不好弄, 得弄成 動態圖片, 額, 個人比較懶, 就算了. 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一種:利用eclipse中自帶的export功能 第一種方法分兩種情況先來看第一種情況:沒有引用外部jar的項目打包 步驟一:右鍵點擊項目選擇導出(export),選擇java>jar文件(不是選擇可運行jar文件) 步驟二:選擇你要導出的項目以及文件,指定文件導出路徑。連續點擊兩個下一步後到第四 ...
  • 外觀(Facade)模式 當使用子系統的代碼時,你也許會發現自己過於深入地調用子系統的邏輯代碼。如果子系統代碼總是在不斷變化,而你的代碼卻又在許多不同地方與子系統代碼交互,那麼隨著子系統的發展,你也許會發現維護代碼變得非常困難。 在項目中集成複雜的第三方代碼,或在系統中逐漸形成大量僅在系統自身內部有 ...
  • 客戶端緩存的機制:Eureka還提供了客戶端緩存的機制,即使所有的Eureka Server都掛掉,客戶端仍可以利用緩存中的信息調用服務節點的服務。Eureka一般配合Ribbon進行使用,Ribbon提供了客戶端負載均衡的功能,Ribbon利用從Eureka中讀取到的服務信息,在調用服務節點提供的... ...
  • 一、什麼是JDBC連接池? 在傳統的JDBC連接中,每次獲得一個Connection連接都需要載入通過一些繁雜的代碼去獲取,例如以下代碼: 這樣繁雜的操作只為了獲取一次連接,當然,我們可以將其封裝成一個工具類來訪問(上圖以封裝好Connection的連接),但是每一次連接都需要取載入一次是不是很浪費 ...
  • matplotlib 預設顯示不了中文,如果想顯示中文,通過下麵代碼設置: ...
  • 好幾天沒寫blog了,今天整理整理。寫blog一定要堅持下去。 Python解釋器 #!/usr/bin/env python #-*-coding:utf-8-*- # 無效的內容,只做註釋用(單行註釋) """ """ 多行註釋(三引號) 例: """ 123 123 """ 1.創建xxx.p ...
  • 在這裡我有先把page的設置做成了一個函數getpage,將這個方法放到Application\Common\Common\function.php(註意function不是類)中方便其他地方調用,代碼如下: 控制器中使用的代碼如下: 接下來在View中的使用 自行處理 其中設置分頁的樣式mypag ...
  • 想要爬取動態網頁,很莫名的click失效。被這個問題困擾了很久,基本上把網上提到的所有方法試遍了,最終終於有個方法成功了,在這裡總結一下。 這是我想要點擊的網頁,初始時實在0.5km上,它的class屬性是‘on’,想要點擊到2km 方法一:直接用webdriver的click方法,失效。 text ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...