文章目录
项目总体结构如下
component下配置了一个登陆拦截器;config下配置接管springMVC添加拦截;controller下:HelloController控制页面访问、跳转,UserController,entity下User实体类对应数据库内的数据表;UserRepository继承数据库访问的接口。前端的那些页面结构就不截了,无关紧要。
JPA操作
application.yaml配置
我的数据库叫“jpa”,先自行建立好,驱动只会建立数据表不会建立数据库。
spring:
datasource:
url: jdbc:mysql://localhost:3306/jpa?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: 123
driver-class-name: com.mysql.cj.jdbc.Driver #8.0以上版本的mysql使用这个驱动
jpa:
hibernate:
ddl-auto: update #create是每次创建新表并清空,update是如果有表了就不变了,没有表就创建
show-sql: true
创建实体类User
省略了import和getter、setter,自行添加。对应了数据库中的"users"表。应用于登陆场合,只要用户名和密码就OK了,然后配上id。
@Entity(name="users")
public class User {
@Id //主键
@GeneratedValue(strategy = GenerationType.IDENTITY) //自增主键
private Integer id;
@Column(name ="name")
private String name;
@Column(name ="password")
private String password;
UserRepository继承接口JpaRepository
因为登陆时要使用用户名到数据库内检索是否有对应用户,所以新建方法findByName(),返回值类型为User,到时候可以使用user.getPassword()来获取检索的密码,并与提交的密码进行比对,相等则登陆成功,不等则失败。
public interface UserRepository extends JpaRepository<User,Long> {
public User findByName(String name);
}
UserController
登陆页会将表单提交至"/check",在selectOne方法内进行判断,成功则跳转至主页, 并在session中添加内容用以判断是否登陆,用于后续的登陆拦截——未登录则拦截;失败则返回“login”,并注入失败信息,继续填写用户名密码。
@Controller
public class UserController {
@Autowired
UserRepository userRepository;
@RequestMapping("/all")
public List<User> selectAll(){
List<User> userList=userRepository.findAll();
String str= JSON.toJSON(userList).toString();
return userList;
}
@PostMapping(value = "/check")
public String selectOne(@RequestParam("name") String name, @RequestParam("password") String password, HttpSession session, Map<String,Object> map){
User user = userRepository.findByName(name);
if (user==null){
map.put("msg","用户名不存在");
System.out.println(110);
return "login";
}
String pwd = user.getPassword();
if (pwd.equals(password)) {
session.setAttribute("loginUser", name);
return "index";
}
else{
map.put("msg","用户名密码错误");
System.out.println(111);
return "login";
}
}
}
登陆失败的截图如下:
登陆页使用的bootstrap的example,可以去官网自提。表单处的代码略有修改,主要是给两个“input”添加了name属性,不然post出去得不到数据;以及加了一个p标签,提示用户名、密码出错。
<form class="form-signin" action="/check" method="post">
<img class="mb-4" src="/bootstrap-solid.svg" alt="" width="72" height="72">
<h1 class="h3 mb-3 font-weight-normal">请登录</h1>
<p style="color:red" th:text="${msg}" th:if="${not #strings.isEmpty(msg)}" ></p>
<label for="inputEmail" class="sr-only">用户名</label>
<input type="text" name="name" id="inputEmail" class="form-control" placeholder="用户名" required="" autofocus="">
<label for="inputPassword" class="sr-only">密码</label>
<input type="password" name="password" id="inputPassword" class="form-control" placeholder="密码" required="">
<div class="checkbox mb-3">
<label>
<input type="checkbox" value="remember-me"> Remember me
</label>
</div>
<button class="btn btn-lg btn-primary btn-block" type="submit">登陆</button>
<p class="mt-5 mb-3 text-muted">© 2017-2019</p>
</form>
登陆拦截
添加拦截器component.LoginInterceptor
实现接口HandlerInterceptor,判断session是否有注入内容,如果没有,则表示没有登陆,那么拦截请求并返回login页。
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("loginUser");
if(user==null){
request.setAttribute("msg","没有权限");
request.getRequestDispatcher("/login").forward(request,response);
return false;
}
else
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
springmvc配置,添加拦截器(MyMvcConfig)
spring boot2.0后WebMvcAutoConfigurationAdapter被弃用,所以继承WebMvcConfigurationSupport这个类。拦截所有请求,除了"/login"和"/check"。
@Configuration
public class MyMvcConfig extends WebMvcConfigurationSupport {
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/login","/check","/static/*");
super.addInterceptors(registry);
}
}
补一个小问题:中间有一次运行时一直找不到我的如CSS等静态文件,报错如下:
搞了很久,重启啊、改配置啊几乎都试过了,没用。最后把@Configuration注释了运行了一次,再取消注释运行就OK了,但不知道为什么。