springboot2.0+jsp+登录拦截器
最近接触springboot说不推荐jsp,之前一直用传统web项目,所以自己研究了一下springboot+web整合。
首先参考https://blog.csdn.net/apathecrazyfan/article/details/79638731这篇文章进行springboot+jsp项目的搭建,后来将尚硅谷的springboot视频做的springboot+thymeleaf项目改造成jsp的。项目结构如下:
//web部分
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com._7k7k</groupId>
<artifactId>springboot-web-jsp-sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>springboot-web-jsp-sample</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--Web 项目所以添加spring MVC Web模块支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--jsp页面使用jstl标签-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!--Provided start-->
<!--War包部署到外部的Tomcat中已经包含了这些,
所以需要添加以下依赖
否则会和内嵌的Tomcat 容器发生冲突
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!--用于编译jsp-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- redis添加 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
登录功能及拦截功能的实现如下:
@Controller
@RequestMapping("/admin")
public class LoginController extends BaseController {
@Resource
private StudentService studentService;
@GetMapping("login")
public ModelAndView loginView() {
return new ModelAndView("admin/login");
}
//登陆
@PostMapping(value = "login")
public String login(@RequestParam("username") String userName,
@RequestParam("password") String passWord,
HttpSession session){
// System.out.println("用户名:"+userName);
// System.out.println("密码:"+passWord);
Student student = studentService.loginValidate(userName, passWord);
if (student!=null){
session.setAttribute("loginUser",student);
return "admin/main";
}else {
request.setAttribute("msg","用户名或密码错误");
return "admin/login";
}
}
//退出
@RequestMapping("/logout")
public String logout(){
//移除session
request.getSession().invalidate();
return "redirect:/admin/login";
}
}
登录拦截器:loginInterceptor
package com.atguigu.springboot.component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginHanderInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
Object user = request.getSession().getAttribute( "loginUser" );
if (user == null){
System.out.println( "拦截" );
request.setAttribute( "msg","没有权限,请重新登录" );
request.getRequestDispatcher( "/admin/login" ).forward( request,response );
return false;
}else {
return true;
}
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
拦截器注册:之前用的springboot1.5.6 ,后来用了2.0.5 拦截器变为实现 WebMvcConfigurer接口, 之前继承WebMvcConfigurationSupport 各种出错
package com.atguigu.springboot.config;
import com.atguigu.springboot.component.LoginHanderInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
//注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor( new LoginHanderInterceptor())
.addPathPatterns( "/**" ).excludePathPatterns("/", "/index.jsp","/admin/login","/static/**" );
}
//自定义静态资源
// @Override
// public void addResourceHandlers(ResourceHandlerRegistry registry) {
// registry.addResourceHandler( "/static/**" )
// .addResourceLocations( "classpath:/static/" );
// }
/**
* 不经过controller,实现页面跳转
* registry.addViewController( "requestMapping路径" ).setViewName( "页面地址" );
*/
// @Override
// public void addViewControllers(ViewControllerRegistry registry) {
// registry.addViewController( "/admin/login" ).setViewName( "/index.jsp");
// }
}
注:本人将静态资源放在webapp下的static下,静态文件引用就成功了,具体原因不知。
最后成功实现拦截,结果如下: