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.
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>
à pom.xml pour configurer le stockage de session, ajoutez
session: store-type: redis timeout: 30 redis: database: 0 host: password: port: 6379 timeout: 300000
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)
à 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() { } }
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; } } }
@Bean public WebSecurityFilter accessFilter() { return new WebSecurityFilter(); }
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); } }
@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); } }
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!