Heim >Java >javaLernprogramm >Implementierungscode der Anmeldefilterfunktion von Spring-Boot
Der Inhalt dieses Artikels befasst sich mit der Spring-Boot-Login-Filterfunktion. Ich hoffe, dass er für Sie hilfreich ist.
Lassen Sie uns kurz über die Architektur unseres Projekts sprechen: Das Front-End-Projekt verwendet React und das Back-End-Projekt verwendet Spring-Cloud, das in Zuul-Projekte und andere Funktionsmodule unterteilt ist. Zusätzlich zur Bereitstellung von Back-End-Routing und -Weiterleitung kann das Zuul-Projekt auch globale Filter ausführen. Daher habe ich mich entschieden, die Anmeldeüberprüfungsfunktion in diesem Projekt zu schreiben.
Hier wird Redis zum Speichern von Sitzungsinformationen verwendet.
Abhängigkeiten herunterladen,
<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>
zu pom.xml hinzufügen, um den Sitzungsspeicher zu konfigurieren,
session: store-type: redis timeout: 30 redis: database: 0 host: password: port: 6379 timeout: 300000
Sitzungstimeout zu application.yml hinzufügen und das Timeout in application.yml konfigurieren scheint keine Wirkung zu haben . Wir fügen die Timeout-Konfigurationsanmerkung
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200, redisFlushMode = RedisFlushMode.IMMEDIATE)
zur Startup-Klasse hinzu, fügen die Redis-Klassenkonfiguration hinzu, erstellen eine neue redisConfig-Klasse und schreiben dann den
package com.config; import org.springframework.context.annotation.Configuration; @Configuration public class RedisConfig { public RedisConfig() { } }
hier Um es mit zuulFilter zu implementieren, durchläuft jede HTTP-Anfrage diesen Filter. Ob die Sitzung abgelaufen ist, wird dann dadurch bestimmt, ob der Benutzername in der Sitzung vorhanden ist. Bei einer Zeitüberschreitung wird eine Fehlermeldung zurückgegeben und das Frontend springt basierend auf dem abgelaufenen HTTP-Anforderungscode.
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; } } }
Hier müssen Sie diese Klasse auch in die Startup-Klasse einfügen
@Bean public WebSecurityFilter accessFilter() { return new WebSecurityFilter(); }
Die Hauptsache ist, den vom Frontend übergebenen Benutzernamen und das Passwort einzugeben in die Sitzung einbinden und eine Prüfung durchführen. Wenn die Überprüfung erfolgreich ist, wird eine erfolgreiche Anmeldung zurückgegeben. Andernfalls wird eine fehlgeschlagene Anmeldung zurückgegeben. Das Frontend führt dann Routing-Sprünge basierend auf dem Anmeldestatus durch.
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); } }
Zum Schluss posten Sie den Code der Startup-Klasse
@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); } }
Das obige ist der detaillierte Inhalt vonImplementierungscode der Anmeldefilterfunktion von Spring-Boot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!