Maison > Java > javaDidacticiel > Code d'implémentation de la fonction de filtrage de connexion de Spring-boot

Code d'implémentation de la fonction de filtrage de connexion de Spring-boot

不言
Libérer: 2018-12-21 10:45:49
avant
2983 Les gens l'ont consulté

Le contenu de cet article concerne la fonction de filtrage de connexion Spring-Boot. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Parlons brièvement de l'architecture de notre projet : le projet front-end utilise React, et le projet back-end utilise spring-cloud, qui est divisé en projet zuul et d'autres modules fonctionnels. En plus de fournir le routage et le transfert back-end, le projet zuul peut également effectuer des filtres globaux, j'ai donc choisi d'écrire la fonction de vérification de connexion dans ce projet.

configuration de session

Ici, redis est utilisé pour stocker les informations de session.
Téléchargez les dépendances, ajoutez

<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>
Copier après la connexion

à pom.xml pour configurer le stockage de session, ajoutez

session:
    store-type: redis
    timeout: 30
redis:
    database: 0
    host: 
    password: 
    port: 6379
    timeout: 300000
Copier après la connexion

délai d'expiration de session à application.yml et configurez le délai d'expiration dans application.yml. semble n'avoir aucun effet. Nous ajoutons l'annotation de configuration du délai d'attente

@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200, redisFlushMode = RedisFlushMode.IMMEDIATE)
Copier après la connexion

à la classe de démarrage, ajoutons la configuration de la classe redis, créons une nouvelle classe redisConfig, puis écrivons le

package com.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RedisConfig {
    public RedisConfig() {

    }
}
Copier après la connexion
filtre

Utilisez zuulFilter ici pour réaliser que chaque requête http passe par ce filtre, puis détermine si la session a expiré en fonction du fait que le nom d'utilisateur existe dans la session. S'il expire, un message d'erreur sera renvoyé et le frontal sautera en fonction du code de requête http expiré.

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;
        }
    }
}
Copier après la connexion
Ici, vous devez également injecter cette classe dans la classe de démarrage

    @Bean
    public WebSecurityFilter accessFilter() {
        return new WebSecurityFilter();
    }
Copier après la connexion
Le code de connexion

sert principalement à mettre le nom d'utilisateur et le mot de passe transmis depuis le front-end dans la session et effectuez la vérification. Si la vérification réussit, le succès de la connexion sera renvoyé ; sinon, l’échec de la connexion sera renvoyé. Le frontal effectue ensuite des sauts de routage en fonction de l'état de connexion.

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);
    }

}
Copier après la connexion
Enfin, postez le code de la classe de démarrage

@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);
    }
}
Copier après la connexion


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal