需求:只有登录过的管理员才能查看学生的信息并对学生进行增删改查的操作

1、设计表

我们需要创建一张管理员表:

CREATE TABLE manager(
     id INT(10) NOT NULL AUTO_INCREMENT,
     manager_name VARCHAR(20) NOT NULL,
     manager_password VARCHAR(20) NOT NULL, 
     PRIMARY KEY(id)
 )ENGINE=INNODB DEFAULT CHARSET=utf8;

既然已经有了管理员表,肯定也要为它设定相应的持久化类

public class Manager {
     private Integer id;
     private String manager_name;
     private String manager_password;//篇幅有限,省略了set、get方法
}

有了类,在编写相应的配置文件

<hibernate-mapping>
     <!-- 建立类与表的映射 -->
     <class name="domain.Manager" table="manager">
         <!-- 建立类中的属性与表中的主键对应 -->
         <id name="id" column="id" >
             <!-- 主键生成策略 -->
             <generator class="native"/>
         </id>
         
         <!-- 建立类中的普通的属性和表的字段的对应 -->
         <property name="manager_name" column="manager_name"  />
         <property name="manager_password" column="manager_password" />
     </class>
 </hibernate-mapping>

不要忘记把这些文件在Spring中配置

2、登录方法

登录方法大致和编写学生方法时差不多

Controller层:

//管理员登录
     public String login(){
         Manager existmanager=managerService.login(manager);
         //如果用户不存在
         if(existmanager==null){
             this.addActionError("用户名或密码错误");
             return "loginfail";
         }
         //如果存在
         else{
             ActionContext.getContext().getSession().put("existmanager", existmanager);
             return "loginsuccess";
         }
         
     }

在方法中,先将从页面上获取到的用户名密码代入方法去查询数据库中是否有这样一个管理员存在,如果存在,将管理员存入session中,然后返回登录成功的信息。 如果不存在,返回登录失败的信息。

service层和Dao层略过

 

3、过滤器

为了防止没有登录的用户查看到学生信息,我们需要一个过滤器来对请求做处理:

在此我创建了一个过滤器:

public class MyFilter implements Filter{
    @Override
     public void destroy() {
         // TODO Auto-generated method stub
     }    @Override
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
             throws IOException, ServletException {
         // TODO Auto-generated method stub
         HttpServletRequest req=(HttpServletRequest)request;
         HttpServletResponse resp=(HttpServletResponse)response;
         HttpSession session=req.getSession();
         if(session.getAttribute("existmanager")==null &&!req.getRequestURI().endsWith("/login.jsp") && !req.getRequestURI().endsWith("manager_login.action")){
             System.out.println("用户为空");
             resp.sendRedirect(req.getContextPath()+"/login.jsp");
             return;
         }
         System.out.println("用户不为空");
         chain.doFilter(request, response);
     }    @Override
     public void init(FilterConfig arg0) throws ServletException {
         // TODO Auto-generated method stub
     }

在过滤器中,取出session中的manager对象,判断manager对象是否为空,如果为空,证明没有登录,跳转到登录界面。

如果不为空,证明登录,过滤器放行。

同时在这里取出请求的路径,对某些路径放行,比如login.jsp等等

注意:在判断到用户为空时,我对请求作了一个重定向到登录页面,此时代码后面一定要加上return表示方法结束,否则还会执行后面的doFilter造成错误。

 

注意:在写Action时要将Action配置成多例,比如加上注解@Scope("prototype") ,否则会造成错误。

写完了过滤器,我们可以在web.xml中将过滤器配置起来:

<filter>
       <filter-name>MyFilter</filter-name>
       <filter-class>Filter.MyFilter</filter-class>
   </filter>
   
   <filter-mapping>
       <filter-name>MyFilter</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>

至此,登录系统完成了。