用户登录(使用Spring AOP记录登录日志)

1、Spring配置文件解析:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
        <!--配置数据库连接信息-->
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
            <property name="username" value="root"></property>
            <property name="password" value="root"></property>
        </bean>
    <!--创建工厂类方法-->
    <bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <!--扫描实体类对象,为实体类对象起一个别名-->
        <property name="typeAliasesPackage" value="Model"></property>
    </bean>
    <!--配置扫描映射文件接口-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="Mapper"></property>
        <property name="sqlSessionFactory" ref="factory"></property>
    </bean>
    <!--配置使用cglib动态代理,使用功能接口userService接收代理对象UserImpl对象-->
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
    <!--创建实现类对象并注入dao层接口映射-->
    <bean id="userImpl" class="Service.Impl.UserImplService">
        <property name="userLogin" ref="IUserLogin"></property>
    </bean>
    <!--创建通知对象-->
    <bean id="before" class="Advisor.beforeAdvisor"></bean>
    <bean id="after" class="Advisor.after"></bean>
    <aop:config>
        <aop:pointcut id="user" expression="execution(* Service.Impl.UserImplService.findUserInfoByUser(..))"></aop:pointcut>
        <aop:advisor advice-ref="before" pointcut-ref="user"></aop:advisor>
        <aop:advisor advice-ref="after" pointcut-ref="user"></aop:advisor>
    </aop:config>
</beans>

此处新使用了一个配置,即在创建SqlSessionFactory工厂类对象时,使用类中参数typeAliasesPackage()扫描封装实体类的包,给包下的封装实体类起了一个别名(类名的首字母小写)。

2、持久层映射文件
在这里插入图片描述
2.1、接口映射文件
IUserLogin.java:

package Mapper;

import Model.User;

public interface IUserLogin {
    /**
     * 查询用户信息
     */
    User queryUserInfoByUser(User user);
}

2.2、SQL映射文件

<?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="Mapper.IUserLogin">

<!--type="user" : User封装实体类别名-->

    <resultMap id="resultUser" type="user">
        <id property="id" column="id"></id>
        <result property="userName" column="username"></result>
        <result property="passWord" column="password"></result>
        <result property="sex" column="sex"></result>
        <result property="birthday" column="birthday"></result>
        <result property="address" column="address"></result>
    </resultMap>
    <select id="queryUserInfoByUser" parameterType="user" resultMap="resultUser">
        select * from user where #{userName} = username and password = #{passWord}
    </select>
</mapper>

3、封装实体类:
User.java

package Model;

import java.util.Date;

public class User {
    private int id;
    private String userName;
    private String passWord;
    private Date birthday;
    private char sex;
    private String address;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", passWord='" + passWord + '\'' +
                ", birthday=" + birthday +
                ", sex=" + sex +
                ", address='" + address + '\'' +
                '}';
    }
}

4、Service层:
功能接口:
UserService.java:

package Service;
import Model.User;

public interface UserService {
    User findUserInfoByUser(User user);
}

实现类:

package Service.Impl;

import Mapper.IUserLogin;
import Model.User;
import Service.UserService;

public class UserImplService  implements UserService {
    private IUserLogin userLogin;

    public IUserLogin getUserLogin() {
        return userLogin;
    }

    public void setUserLogin(IUserLogin userLogin) {
        this.userLogin = userLogin;
    }

    @Override
    public User findUserInfoByUser(User user) {
        return userLogin.queryUserInfoByUser(user);
    }
}

5、web.xml配置读取ApplicationConext.xml配置文件的监听

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:ApplicationContext.xml</param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>

此处需要注意的需要使用Spring-web包中的监听类,在标签中配置schema相关信息,头信息<?xml version="1.0" encoding="UTF-8"?>不能缺失;上下文配置中,值一定是contextConfigLocation。

6、Servlet类代码:
一定要记得继承HttpServlet ,重写service方法、init()方法,init()初始化方法中获取Spring配置文件信息;service方法可以接收Post、get请求,获取、处理请求数据,和服务端相应数据。
在Servlet类前 使用@WebServlet("/…"),指定访问路径,注解的使用需要保障tomcat版本在7以上,web在3.0以上。

package Servlet;

import Model.User;
import Service.Impl.UserImplService;
import Service.UserService;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/login")
public class UserLoginServlet extends HttpServlet {
    private UserService userService;
    /**
     * 重写初始化方法
     * @throws ServletException
     */
    @Override
    public void init() {
        WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
        userService = wac.getBean("userImpl",UserImplService.class);
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        User user = new User();

        req.setCharacterEncoding("UTF-8");
        user.setUserName(req.getParameter("username"));
        user.setPassWord(req.getParameter("password"));
        User u = userService.findUserInfoByUser(user);
        if(u != null){
            resp.sendRedirect("main.jsp");
        }else{
            resp.sendRedirect("index.jsp");
        }
    }
}

7、配置通知–使用log4j登记用户登录信息
切点方法使用Service层的实现类中的登录信息查询方法,上述ApplicationContext.xml配置文件中有切点和通知方法的配置及对象创建;
此处只介绍log4j配置文件及通知方法的编写。

7.1、log4j配置文件:
在这里插入图片描述

log4j.rootCategory=INFO, CONSOLE ,LOGFILE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%m %n

log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=E:/Idea/Spring.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%m %n

7.2、前置通知配置:

package Advisor;

import Model.User;
import org.apache.log4j.Logger;
import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;
import java.util.Date;

public class beforeAdvisor implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        //Log4JLogger log = new Log4JLogger(String.valueOf(beforeAdvisor.class));
        User user = (User) objects[0];
       // log.info(user.getUserName()+"登录系统");
        Logger log = Logger.getLogger(beforeAdvisor.class);
        log.info("用户 "+user.getUserName()+" 在"+new Date() +"时登录系统!!!");
    }
}

7.3、后置通知配置:

package Advisor;
import Model.User;
import org.apache.log4j.Logger;
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
import java.util.Date;
public class after implements AfterReturningAdvice {
    @Override
    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
        User user = (User) o;
       Logger log =  Logger.getLogger(after.class);
       log.info("用户 "+user.getUserName()+" 在"+new Date() +"成功登录系统!!!");
    }
}

8、登录页面(index.jsp)及登录成功跳转页面(main.jsp)
index.jsp

<%@page language="java" contentType="text/html; UFT-8" pageEncoding="UTF-8" %>
<html>
<body>
<h2>用户登录页面</h2>
<hr>
<form action="login" method="post">
    <table border="1" align="center">
        <tr align="center">
            <td align="center" style="font-size: 20px;">登录名:</td>
            <td align="center" style="text-align: center"><input type="text" name="username" style="text-align: center;width: 180px;"/></td>
        </tr>
        <tr align="center">
            <td align="center" style="font-size: 20px;">密码:</td>
            <td align="center"><input type="text" align="center" name="password" style="text-align: center;width: 180px;"/></td>
        </tr>
        <tr>
            <td colspan="2" align="center">
                <input type="submit" value="登录" align="center" style="font-size: 25px;"/>
                <input type="reset" value="取消" align="center" style="font-size: 25px;"/>
            </td>
        </tr>
    </table>
</form>
</body>
</html>

main.jsp:

<%--
  Created by IntelliJ IDEA.
  User: xingfuhu
  Date: 2020/4/23
  Time: 21:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>登陆成功!!!</h3>
</body>
</html>

9、开发所需包及IDEA手动导包处理注意事项
包:

在这里插入图片描述
导包步骤:
8.1、File – Project Structrue – Artifacts
在这里插入图片描述

Output Layout – Web-INF – lib --Add Copy of – Libray Files
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值