基于SpringBoot框架的新闻后台管理系统06
新闻后台管理系统6.0
本次项目内容
- 本次项目开发是在新闻后台管理系统5.0的基础上进行的
- 本次开发主要实现归档功能、异常处理以及登录拦截
项目开发过程
- 在NewsRepository接口中新增查询方法,以实现以年份划分新闻
@Query("select function('date_format',n.updateTime,'%Y') as year from News n group by year order by year desc")
List<String> findGroupYear();
@Query("select n from News n where function('date_format',n.updateTime,'%Y') = ?1 order by n.updateTime desc")
List<News> findByYear(String year);
- 在NewsService接口中新增方法,以提供归档功能的查询服务
Map<String, List<News>> archiveNews();
Long countNews();
- 在NewsServiceImpl类中实现新增方法
@Override
public Map<String, List<News>> archiveNews() {
List<String> years = newsRepository.findGroupYear();
Map<String, List<News>> map = new LinkedHashMap<>();
for(String year: years){
map.put(year, newsRepository.findByYear(year));
}
return map;
}
@Override
public Long countNews() {
return newsRepository.count();
}
- 在web包下创建ArchiveShowController类,以实现归档功能
@Controller
public class ArchiveShowController {
@Autowired
private NewsService newsService;
@GetMapping("/archives")
public String archives(Model model){
model.addAttribute("archiveMap", newsService.archiveNews());
model.addAttribute("newsCount", newsService.countNews());
return "archives";
}
}
-
以上操作已实现归档功能,接下来实现异常处理和登录拦截
-
在templates文件夹下导入error文件夹,error文件夹下是已经完成好的错误提示页面,我们这里直接导入即可。
链接:error文件夹 -
创建handler包,并在该包下创建ControllerExceptionHandler类,handler包通常用于存放一些独立的负责处理逻辑的类,所以我们将异常处理类放在这个包下。ControllerExcepitonHandler类负责全局的异常显示,使用常见的错误代码来显示各种异常,例如:404,500
@ControllerAdvice
public class ControllerExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@ExceptionHandler(Exception.class)
public ModelAndView exceptionHandler(HttpServletRequest request, Exception e) throws Exception {
logger.error("Request: URL: {}, Exception: {}", request, e);
if(AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class)!=null){
throw e;
}
ModelAndView mv = new ModelAndView();
mv.addObject("url", request.getRequestURI());
mv.addObject("exception",e);
mv.setViewName(("error/error"));
return mv;
}
}
-
以上操作又完成了异常处理功能,接下来我们完成登录拦截功能,可能读者会疑惑为什么需要这个功能呢,本来不登录直接进入后台管理页面也是会报错的啊,所以这里需要讲一下,这种情况是因为进入后台管理页面时,页面需要管理员的一些信息,比如头像、名称,而因为没有登录就没有相应信息,所以页面是出于未获得信息而报错,并不是因为未登录的问题,如果我在跳转页面的同时传入一些信息也是能成功进入,这显然是一种漏洞,所以我们需要实现登录拦截,将未登录状态下的任何进入管理页面的操作都拦截下并使其返回登陆界面
-
创建interceptor包,interceptor是指拦截器,是面向切面的。这个包用于存放各种拦截器
-
在interceptor包下创建LoginInterceptor类,并继承HandlerInterceptorAdapter类,LoginInterceptor类是专门负责登录拦截,它会在用户进入管理页面前调用,然后对登录状态进行判断。若已成功登录,就放其通行,若未登录,就让其返回登陆页面。
@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(request.getSession().getAttribute("user") == null){
response.sendRedirect("/admin");
System.out.println("拦截");
return false;
}
System.out.println("放行");
return true;
}
}
- 在interceptor包下创建WebConfig类,并实现WebMvcConfigurer接口,WebConfig类专门用于注册全局的拦截器,任何拦截器只有在这里进行注册后才能起作用,我们还需要在这里给各种拦截器指定拦截条件。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin")
.excludePathPatterns("/admin/login");
}
}
-
运行程序
-
打开浏览器并在网址栏内输入"localhost:8081/admin",这个是新闻后台管理网站,管理员可以在这里面对新闻、类型、标签进行各种操作。
-
打开浏览器并在网址栏内输入"localhost:8081/",这个是新闻主页,用户可以在这里面浏览、查询新闻。
项目演示
-
归档界面
-
异常显示
-
界面拦截不易演示,请读者自行体会
项目下载
链接:news6