SSM小项目(会议管理系统)六 用户注册和非专业权限处理(图解超详细)

上一篇博客的地址: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&&currentUser.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里的相对路径改成绝对路径

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值