上一篇博客的地址:https://blog.csdn.net/qq_41115379/article/details/114334907
下一篇博客的地址:https://blog.csdn.net/qq_41115379/article/details/114376776
用户注册
首先是LoginController
@RequestMapping("/doReg")
public String doReg(Employee employee, Model model){
//这里的参数是employee 还有携带信息的model
//先进行注册,这个方法存在一个返回值
Integer result= employeeService.doReg(employee);
if(result==1){
return "redirect:/";//这个意思就是到登录页面了http://localhost:8080/
}else{
//再上传回去 这里也有个小细节
model.addAttribute("error","注册失败");
model.addAttribute("employee",employee);
return "forward:/register";
}
//这里又提到了forward和redirect 一个是转发,一个重定向
//在数据上的区别就是,forward的数据是可以保留在新的页面的,而redirect是不可以的 这里留个疑问
}
然后到EmployeeService
public Integer doReg(Employee employee) {
//注册用户名是不能重复的,这就连上了之前的,使用之前的方法去查询这个name 从而得到这个emp
if(employeeMapper.loadEmpByUsername(employee.getUsername())!=null){
//也就是如果存在的话
return -1;
}
employee.setRole(1);
employee.setStatus(0);
//然后调用mapper 进行插入
return employeeMapper.doReg(employee);
}
employeeMapper
Integer doReg(Employee employee);
employeeMapper.xml
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.javaboy.meeting.mapper.EmployeeMapper">
<select id="loadEmpByUsername" resultType="org.javaboy.meeting.model.Employee">
select * from employee where username=#{username};
</select>
<insert id="doReg" parameterType="org.javaboy.meeting.model.Employee">
insert into employee (employeename,username,phone,email,status,departmentid,password,role) value (#{employeename},#{username},#{phone},#{email},#{status},#{depatrtmentid},#{password},#{role});
</insert>
</mapper>
这里还有一点关于input里面的name属性的知识:https://blog.csdn.net/qq_41115379/article/details/114332684
然后是register.ftl
<!DOCTYPE html>
<html>
<head>
<title>CoolMeeting会议管理系统</title>
<link rel="stylesheet" href="styles/common.css"/>
<style type="text/css">
</style>
</head>
<body>
<#include 'top.ftl'>
<div class="page-body">
<#include 'leftMenu.ftl'>
<div class="page-content">
<div class="content-nav">
人员管理 > 员工注册
</div>
<form action="/doReg" method="post">
<fieldset>
<legend>员工信息</legend>
<div style="color: red">${error!''}</div>
<table class="formtable" style="width:50%">
<tr>
<td>姓名:</td>
<td>
<input name="employeename" type="text" value="<#if employee??>${employee.employeename}</#if>" id="employeename" maxlength="20"/>
</td>
</tr>
<tr>
<td>账户名:</td>
<td>
<input name="username" type="text"value="<#if employee??>${employee.username}</#if>" id="accountname" maxlength="20"/>
</td>
</tr>
<tr>
<td>密码:</td>
<td>
<input name="password" type="password" id="password" maxlength="20" placeholder="请输入6位以上的密码"/>
</td>
</tr>
<tr>
<td>确认密码:</td>
<td>
<input type="password" id="confirm" maxlength="20" onchange="check()"/>
<div style="color: red" id="confirminfo"></div>
</td>
</tr>
<tr>
<td>联系电话:</td>
<td>
<input name="phone" type="text"value="<#if employee??>${employee.phone}</#if>" id="phone" maxlength="20"/>
</td>
</tr>
<tr>
<td>电子邮件:</td>
<td>
<input name="email" type="text" value="<#if employee??>${employee.email}</#if>"id="email" maxlength="20"/>
</td>
</tr>
<td>所在部门:</td>
<td>
<select name="departmentid">
<#if deps??>
<#list deps as dep>
<option value="${dep.departmentid}">${dep.departmentname}</option>
</#list>
</#if>
</select>
</td>
</tr>
<tr>
<td colspan="6" class="command">
<input type="submit" class="clickbutton" value="注册"/>
<input type="reset" class="clickbutton" value="重置"/>
</td>
</tr>
</table>
</fieldset>
</form>
</div>
</div>
<div class="page-footer">
<hr/>
更多问题,欢迎联系<a href="mailto:webmaster@eeg.com">管理员</a>
<img src="images/footer.png" alt="CoolMeeting"/>
</div>
<script>
function check(){
var password=document.getElementById("password");
var confirm=document.getElementById("confirm");
var confirminfo=document.getElementById("confirminfo");
if(password.value!=confirm.value){
confirminfo.innerHTML='两次输入密码不一致';
}
else{
confirminfo.innerHTML='';
}
}
</script>
</body>
</html>
最后运行一下
数据库里也刷新出来了
非专业权限处理
通过拦截器来处理权限问题
首先在meeting下面创建一个interceptor包
并创建PermissInterceptor这个类
package org.javaboy.meeting.interceptor;
import org.javaboy.meeting.model.Employee;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//HandlerInterceptor 就是一种拦截器
public class PermissInterceptor implements HandlerInterceptor {
//实现他的preHandle 该方法将在请求处理之前进行调用
//AntPathMatcher 是一个路径匹配规则
AntPathMatcher PathMatcher=new AntPathMatcher();
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//首先获取请求地址
String requestURI = request.getRequestURI();
//并对地址进行分类
if("/".equals(requestURI)||"/dologin".equals(requestURI)||"/register".equals(requestURI)||"/doReg".equals(requestURI)){
//这些网站是匿名都可以访问的
return true;
}
//这里找到当前的登录用户
HttpSession session = request.getSession(true);
//这个currentUser就是之前的那个嘛,我不确定。。。
Employee currentUser = (Employee)session.getAttribute("currentUser");
if(PathMatcher.match("/admin/**",requestURI)){
//也就是说 如果这个请求的路径格式和/admin/**一样的话
//就进行判断他是不是admin
if(currentUser!=null&¤tUser.getRole()==2){
return true;
}
}else {
//也就是登录的时候 不是admin的,只要他存在,就可以直接返回
if(currentUser!=null){
return true;
}
}
return false;
}
}
在spring-mvc里进行配置
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/images/**"/>
<mvc:exclude-mapping path="/styles/**"/>
<bean class="org.javaboy.meeting.interceptor.PermissInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
再修改leftMenu.ftl
把那些需要admin ,也就是role==2 的html都加上/admin/
在DepartmentController 这边加入department的页面
package org.javaboy.meeting.controller;
import org.javaboy.meeting.model.Department;
import org.javaboy.meeting.service.DepartmentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Controller
@RequestMapping("/admin")
//放这里和放里面有区别嘛,这里的request和get有区别嘛
public class DepartmentController {
//先注入service
/* @Autowired
DepartmentService departmentService;
@GetMapping("/dep")
public void getDepById(Integer id){
//也就是直接调用service这个方法,所以需要去serveice那边创建这个方法
Department dep=departmentService.getDepById(id);
//toString()方法在Object类中定义,其返回值是String类型,返回类名和他的引用地址
//在进行与其他类型数据的连接操作时,自动调用tostring()方法 所以是自动调用的
System.out.println("dep= "+dep);
}*/
//这里用requestMapper 和GetMapper一样都成吧
//这里就不能使用RestController 不然只会return里的内容,而不能跳转
@GetMapping("/departments")
public String departments(){
return "departments";
}
}
然后测试,发现出现了问题
应该是拦截上的,修改一下
原来是要把currentUser改成currentuser,也就是印证了我之前说的,就是之前的那个currentuser,也就是session是在不同页面都能保留的
同时也印证了
1.在这里requestMapping和GetMapping 是一样的
2.但是不能同时都写在内部 ,而且GetMapping不能放在方法前面
但还会出现页面上的问题
所以需要再修改一下
因为是相对路径的缘故,改成绝对路径就成了.所以把departments.ftl的
styles/common.css 改成 /styles/common.css
images/footer.png 改成 /images/footer.png
(左上角那个没加载出来 是因为他那个在top.ftl 之后会统一改的)
再把这个完善一下
package org.javaboy.meeting.interceptor;
import org.javaboy.meeting.model.Employee;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//HandlerInterceptor 就是一种拦截器
public class PermissInterceptor implements HandlerInterceptor {
//实现他的preHandle 该方法将在请求处理之前进行调用
//AntPathMatcher 是一个路径匹配规则
AntPathMatcher PathMatcher=new AntPathMatcher();
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//首先获取请求地址
String requestURI = request.getRequestURI();
//并对地址进行分类
if("/".equals(requestURI)||"/dologin".equals(requestURI)||"/register".equals(requestURI)||"/doReg".equals(requestURI)){
//这些网站是匿名都可以访问的
return true;
}
//这里找到当前的登录用户
HttpSession session = request.getSession(true);
//这个currentUser就是之前的那个嘛,我不确定。。。
Employee currentUser = (Employee)session.getAttribute("currentuser");
if(PathMatcher.match("/admin/**",requestURI)){
//也就是说 如果这个请求的路径格式和/admin/**一样的话
//就进行判断他是不是admin
if(currentUser!=null) {
if (currentUser.getRole() == 2) {
//如果满足 直接true
return true;
}
else{
//如果不满足 显示的是
response.getWriter().write("forbidden");
return false;
}
}
}else {
//也就是登录的时候 不是admin的,只要他存在,就可以直接返回
if(currentUser!=null){
return true;
}
}
//重定向到登录页面上去 就是没用登录的时候 就是直接/admin/departments的时候
response.sendRedirect("/");
return false;
}
}
这个代码实现的功能有 ,如果你直接没有登录 的访问localhost:8080/admin/departments 他会自动跳转回 登录界面
其次就是 登录之后,没有admin权限的 访问localhost:8080/admin/departments ,会出现这个提示
最后大家辛苦一下,把所有的ftl里的相对路径改成绝对路径