赞
踩
写作于
2022-11-12 13:29:56
私密发布于
2022-11-20 16:32:13
公开发布于
2024-5-13 13:14:51
Java牛客网社区项目——知识点&面试题
Java基于SpringBoot的牛客网社区项目实现详解(上)
Java基于SpringBoot的牛客网社区项目实现详解(下)
权限模块
Interceptor
package com.jsss.community.controller.interceptor; @Component public class AlphaInterceptor implements HandlerInterceptor { private static final Logger logger = LoggerFactory.getLogger(AlphaInterceptor.class); // 在Controller之前执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.debug("preHandle: " + handler.toString()); return true; } // 在Controller之后执行 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.debug("postHandle: " + handler.toString()); } // 在TemplateEngine之后执行 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.debug("afterCompletion: " + handler.toString()); } }
作用
拦截器
对于未登录的用户,禁止一些资源的访问,必须在登录之后才可以访问
比如:未登录之前,主页头部显示
首页、登录、注册
登录之后,显示
首页、消息、头像(下拉-用户信息)
授权的Spring Security
怎么用
权限管理的角色,分为
普通用户
通用功能:登录、发帖、私信、点赞
版主:置顶、加精
管理员:删帖、数据统计
核心模块
Advice
ExceptionAdvice
用来处理Controller层的异常
package com.jsss.community.controller.advice; import com.jsss.community.util.CommunityUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @ControllerAdvice(annotations = Controller.class) public class ExceptionAdvice { private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class); @ExceptionHandler({Exception.class}) public void handleException(Exception e, HttpServletRequest request, HttpServletResponse response) throws IOException { logger.error("服务器发生异常: " + e.getMessage()); for (StackTraceElement element : e.getStackTrace()) { logger.error(element.toString()); } String xRequestedWith = request.getHeader("x-requested-with"); if ("XMLHttpRequest".equals(xRequestedWith)) { response.setContentType("application/plain;charset=utf-8"); PrintWriter writer = response.getWriter(); writer.write(CommunityUtil.getJSONString(1, "服务器异常!")); } else { response.sendRedirect(request.getContextPath() + "/error"); } } }
Aop aspectj
处理业务层的日志
ServiceLogAspect
package com.jsss.community.aspect; //@Component //@Aspect public class ServiceLogAspect { private static final Logger logger = LoggerFactory.getLogger(ServiceLogAspect.class); //任意返回值 service包下任意类 任意方法(任意参数) @Pointcut("execution(* com.jsss.community.service.*.*(..))") public void pointcut() { } @Before("pointcut()") public void before(JoinPoint joinPoint) { // 用户[1.2.3.4],在[xxx],访问了[com.jsss.community.service.xxx()]. ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (attributes == null) { return; } HttpServletRequest request = attributes.getRequest(); String ip = request.getRemoteHost(); String now = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); String target = joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName(); logger.info(String.format("用户[%s],在[%s],访问了[%s].", ip, now, target)); } }
Translation
事务
敏感词过滤
前缀树
性能模块
Redis
点赞,关注
统计数据
uv:Hyperloglog 存储ip
dau:bitmap 位图
缓存
搜索模块:elasticsearch
倒排索引
通知模块:kafka
系统通知:消息队列
模式:生产者消费者
其他模块:Quartz、Caffeine
排行、上传:Quartz定时任务
服务器缓存:Caffeine分布式局限性
缓存到redis中
Spring Boot核心作用
MyBatis
邮箱设置:启动客户端SMTP服务
Spring Email
导入jar包
<!-- spring 邮箱 -->
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.7.4</version>
</dependency>
邮箱参数配置
# MailProperties
spring.mail.host=smtp.qq.com
spring.mail.port=465
spring.mail.username=3063494684@qq.com
spring.mail.password=vtzhmfetkpeldddg
spring.mail.protocol=smtps
spring.mail.properties.mail.smtp.ssl.enable=true
使用Thymeleaf 发送HTML邮件
MailClient JavaMailSender
cookie
http是无状态的
session
数据存放在服务端更 安全
规避分布式session的问题
用redis存储
Kaptcha
<!-- 验证码 -->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
@Configuration public class KaptchaConfig { @Bean public Producer kaptchaProducer() { Properties properties = new Properties(); properties.setProperty("kaptcha.image.width", "100"); properties.setProperty("kaptcha.image.height", "40"); properties.setProperty("kaptcha.textproducer.font.size", "32"); properties.setProperty("kaptcha.textproducer.font.color", "0,0,0"); properties.setProperty("kaptcha.textproducer.char.string", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYAZ"); properties.setProperty("kaptcha.textproducer.char.length", "4"); properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.NoNoise"); DefaultKaptcha kaptcha = new DefaultKaptcha(); Config config = new Config(properties); kaptcha.setConfig(config); return kaptcha; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。