Rumah > Java > javaTutorial > spring-boot的登陆过滤功能的实现代码

spring-boot的登陆过滤功能的实现代码

不言
Lepaskan: 2018-12-21 10:45:49
ke hadapan
3002 orang telah melayarinya

本篇文章给大家带来的内容是关于spring-boot登陆过滤功能,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

先简单说一下我们工程的架构:前端工程是采用react,后端工程采用spring-cloud,里面分为zuul工程和其他功能模块。zuul工程除了提供后端的路由转发,还可以做全局的过滤器,所以我选择在这个工程里面写登陆校验功能。

session配置

这里使用redis存储session信息。
下载依赖,在pom.xml里面加入

1

2

3

4

5

6

7

8

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

<dependency>

    <groupId>org.springframework.session</groupId>

    <artifactId>spring-session-data-redis</artifactId>

</dependency>

Salin selepas log masuk

配置session存储,在application.yml里面加入

1

2

3

4

5

6

7

8

9

session:

    store-type: redis

    timeout: 30

redis:

    database: 0

    host: 

    password: 

    port: 6379

    timeout: 300000

Salin selepas log masuk

session超时,在application.yml里面配置timeout貌似没有效果,我们在启动类里面加入超时配置注解

1

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200, redisFlushMode = RedisFlushMode.IMMEDIATE)

Salin selepas log masuk

添加redis类配置,新建一个redisConfig类,然后写入

1

2

3

4

5

6

7

8

package com.config;

import org.springframework.context.annotation.Configuration;

@Configuration

public class RedisConfig {

    public RedisConfig() {

 

    }

}

Salin selepas log masuk

过滤器

这里使用zuulFilter,实现了每个http请求都经过这个过滤器,然后通过session中是否存在用户名,判断session是否超时。如果超时就返回错误提示,前端再根据超时的http请求码进行跳转。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

package com.config;

import com.netflix.zuul.ZuulFilter;

import com.netflix.zuul.context.RequestContext;

import com.ztesoft.cloud.Service.StaffService;

import com.ztesoft.cloud.model.User;

import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.http.HttpServletRequest;

public class WebSecurityFilter extends ZuulFilter {

    @Override

    public String filterType() {

        return "pre";//前置过滤器

    }

    @Override

    public int filterOrder() {

        return 0;//优先级为0,数字越大,优先级越低

    }

    @Override

    public boolean shouldFilter() {

        return true;//是否执行该过滤器,此处为true,说明需要过滤

    }

    @Autowired

    private StaffService staffService;

    @Override

    public Object run() {

        RequestContext ctx = RequestContext.getCurrentContext();

        HttpServletRequest request = ctx.getRequest();

        String queryString = request.getQueryString();

        Object username = request.getSession().getAttribute("username");

        Object password = request.getSession().getAttribute("password");

        User user = new User();

        if(username != null) {

            user.setUsername(username.toString());

        }

        if(password != null) {

            user.setPassword(password.toString());

        }

        Boolean verifyResult = this.staffService.verifyLoginUser(user);

        if ((queryString != null && queryString.indexOf("tag=process") > -1) || verifyResult) {

            ctx.setSendZuulResponse(true);// 对该请求进行路由

            ctx.setResponseStatusCode(200);

            ctx.set("isSuccess", true);// 设值,可以在多个过滤器时使用

            return null;

        else {

            ctx.setSendZuulResponse(false);// 过滤该请求,不对其进行路由

            ctx.setResponseStatusCode(401);// 返回错误码,应该是401

            ctx.setResponseBody("session is out of time");// 返回错误内容

            ctx.set("isSuccess", false);

            return null;

        }

    }

}

Salin selepas log masuk

这里还需要在启动类中注入这个类

1

2

3

4

    @Bean

    public WebSecurityFilter accessFilter() {

        return new WebSecurityFilter();

    }

Salin selepas log masuk

登陆的代码

主要就是把前端传来的用户名密码放到session中,并进行校验。如果校验成功,返回登陆成功,否则,返回登陆失败。前端再根据登陆情况做路由跳转。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

package com.controller;

 

@RestController

@RequestMapping(value = "/system")

public class SystemController extends JdkSerializationRedisSerializer implements Serializable {

 

    @Autowired

    private StaffService staffService;

 

    @PostMapping("login")

    public ResponseEntity<String> login(@RequestBody User user, HttpSession session) {

        session.setAttribute("username", user.getUsername());

        session.setAttribute("password", user.getPassword());

        Boolean ret = this.staffService.verifyLoginUser(user);

        if(ret == true) {

            return new ResponseEntity<>("登陆成功", HttpStatus.OK);

        }

        return new ResponseEntity<>("登陆失败", HttpStatus.NON_AUTHORITATIVE_INFORMATION);

    }

 

}

Salin selepas log masuk

最后,贴一下启动类的代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

@SpringBootApplication

@EnableDiscoveryClient

@EnableZuulProxy

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200, redisFlushMode = RedisFlushMode.IMMEDIATE)

@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = RibbonConfig.class))

@RibbonClients(defaultConfiguration = RibbonConfig.class)

public class PlatformWebApplication {

    @Bean

    public WebSecurityFilter accessFilter() {

        return new WebSecurityFilter();

    }

    public static void main(String[] args) {

        SpringApplication.run(PlatformWebApplication.class, args);

    }

}

Salin selepas log masuk


Atas ialah kandungan terperinci spring-boot的登陆过滤功能的实现代码. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:segmentfault.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan