이 기사의 내용은 spring-boot 로그인 필터링 기능에 관한 것입니다. 필요한 친구들이 참고할 수 있기를 바랍니다.
먼저 우리 프로젝트의 구조에 대해 간단히 이야기해보자. 프론트엔드 프로젝트는 React를 사용하고, 백엔드 프로젝트는 spring-cloud를 사용하는데, 이는 zuul 프로젝트와 기타 기능 모듈로 나누어진다. 백엔드 라우팅 및 전달을 제공하는 것 외에도 zuul 프로젝트는 전역 필터도 수행할 수 있으므로 이 프로젝트에서는 로그인 확인 기능을 작성하기로 결정했습니다.
Redis는 여기서 세션 정보를 저장하는 데 사용됩니다.
종속성을 다운로드하고
<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에 추가합니다.
session: store-type: redis timeout: 30 redis: database: 0 host: password: port: 6379 timeout: 300000redis 클래스 구성을 추가하고 새 redisConfig 클래스를 만든 다음 여기에서
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200, redisFlushMode = RedisFlushMode.IMMEDIATE)filter를 작성합니다. 여기에서 zuulFilter를 사용하여 각 http 요청이 이 필터를 통과하는지 확인한 다음 결정합니다. 세션 시간 초과에 사용자 이름이 있는지 여부에 따라 세션이 결정되는지 여부입니다. 시간이 초과되면 오류 메시지가 반환되고 시간 초과된 http 요청 코드에 따라 프런트 엔드가 점프됩니다.
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); } }
위 내용은 spring-boot의 로그인 필터링 기능 구현 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!