【SSM】登录和注册

框架

  • controller 控制层

  • dao 持久层

  • interceptor 拦截器

  • model 实体层

  • uils 工具类

  • service 业务层

  • resources 资源文件层

    • mapper 放编写sql语句的文件,与持久层的文件对应

具体代码

@Controller
//控制层
public class UserController {
//用于调用Service层方法
    @Autowired
    private IUserService userService;
//注册
    @RequestMapping(value = "/register",method = RequestMethod.POST)
    @ResponseBody
    public Result register(@RequestBody User user){
        return userService.register(user);
    }
//登录
    @RequestMapping(value = "/login",method = RequestMethod.POST)
    @ResponseBody
    public Result login(@RequestBody User user){
        return userService.login(user);
    }
//注销
    @RequestMapping(value = "/logout")
    @ResponseBody
    public Result logout(@RequestHeader("token") String token){
        return userService.logout(token);
    }
//用于展示首页
    @RequestMapping(value = "/show")
    @ResponseBody
    public Result show(){
        return Result.ok("成功","首页");
    }


}
//持久层
//状态码方法
public interface TokenMapper {
//保存到数据库
    int insert(@Param("token") String token, @Param("userid") int id);
//查看
    Integer selectByToken(String token);
//删除
    void deleteByToken(String token);
}
//用户数据库
public interface UserMapper {
//插入数据,也就是注册的
    int insert(User user);
//通过username查询,用于注册查重
    User findUserByUsername(String username);
//登录方法
    User findUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password);
}
//拦截器
@Controller
public class UserInterceptor implements HandlerInterceptor {
//调用持久层的方法
    @Autowired
    private TokenMapper tokenMapper;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 //获取状态码
        String token = request.getHeader("token");
        //如果状态码不为空或者空字符串
        if (token!=null&&token!=""){
            Integer id = tokenMapper.selectByToken(token);
            //如果不为空且查到存在状态码返回true
            if (id!=null&&id>0){
            
                return true;
            }
        }
        //反之就是权限不够
        String string = JSON.toJSONString(Result.error(500, "权限不够"));
        response.getWriter().println(string);
        return false;
    }
//后置
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
//最终
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
public class Result<T> implements Serializable {
//返回状态
	private static final long serialVersionUID = 1L;

	/**
	 * 成功标志
	 */
	private boolean success = true;

	/**
	 * 返回处理消息
	 */
	private String message = "操作成功!";

	/**
	 * 状态码
	 */
	private Integer code = 0;
	
	/**
	 * 返回数据对象 data
	 */
	private T result;

	public static long getSerialVersionUID() {
		return serialVersionUID;
	}

	public boolean isSuccess() {
		return success;
	}

	public void setSuccess(boolean success) {
		this.success = success;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}

	public Integer getCode() {
		return code;
	}

	public void setCode(Integer code) {
		this.code = code;
	}

	public T getResult() {
		return result;
	}

	public void setResult(T result) {
		this.result = result;
	}

	public long getTimestamp() {
		return timestamp;
	}

	public void setTimestamp(long timestamp) {
		this.timestamp = timestamp;
	}

	/**
	 * 时间戳
	 */
	private long timestamp = System.currentTimeMillis();

	public Result() {
		
	}
	
	public Result<T> success(String message) {
		this.message = message;
		this.code = 200;
		this.success = true;
		return this;
	}
	
	
	public static Result<Object> ok() {
		Result<Object> r = new Result<Object>();
		r.setSuccess(true);
		r.setCode(200);
		r.setMessage("成功");
		return r;
	}
	
	public static Result<Object> ok(String msg) {
		Result<Object> r = new Result<Object>();
		r.setSuccess(true);
		r.setCode(200);
		r.setMessage(msg);
		return r;
	}


	public static Result<Object> ok(String msg,Object obj) {
		Result<Object> r = new Result<Object>();
		r.setSuccess(true);
		r.setCode(200);
		r.setMessage(msg);
		r.setResult(obj);
		return r;
	}
	
	public static Result<Object> ok(Object data) {
		Result<Object> r = new Result<Object>();
		r.setSuccess(true);
		r.setCode(200);
		r.setMessage("成功");
		r.setResult(data);
		return r;
	}
	
	public static Result<Object> error(String msg) {
		return error(500, msg);
	}
	
	public static Result<Object> error(int code, String msg) {
		Result<Object> r = new Result<Object>();
		r.setCode(code);
		r.setMessage(msg);
		r.setSuccess(false);
		return r;
	}

	public Result<T> error500(String message) {
		this.message = message;
		this.code = 500;
		this.success = false;
		return this;
	}
	/**
	 * 无权限访问返回结果
	 */
	public static Result<Object> noauth(String msg) {
		return error(555, msg);
	}
}
//user实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
    /**
     * 这是id
     */
    private int id;
    /**
     * 这是昵称
     */
    private String nickname;
    /**
     * 这是用户名
     */
    private String username;
    /**
     * 这是密码
     */
    private String password;
    /**
     * 这是年龄
     */
    private int age;
    /**
     * 这是手机号
     */
    private String phone;
}
//service接口
public interface IUserService {
        Result register(User user);

        Result login(User user);
        Result logout(String token);
}
//实现service接口
@Service
@Transactional
public class UserService implements IUserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private TokenMapper tokenMapper;

    /**
     * 注册
     * 
     */
    @Override
    public Result register(User user) {
        //用户名校验
        String username = user.getUsername();
        if (username != null && username != "") {
            boolean check = RegUtils.check(username, "^(?=[a-zA-Z])(?!.*[\\-_]{2})[a-zA-Z0-9\\-_]{8,12}$");
            if (!check){
                return Result.error("用户名格式不正确");
            }
        }else {
            return Result.error("用户名不能为空");
        }
//        是否被注册过
        User user1 = userMapper.findUserByUsername(username);
        if (user1!=null){
            return Result.error("用户名已存在,请重新输入");
        }
//        密码校验
        String password = user.getPassword();
        if (password != null && password != "") {
            boolean check = RegUtils.check(password, "^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]).{8,}$");
            if (!check){
                return Result.error("密码格式不正确");
            }
        }else {
            return Result.error("密码不能为空");
        }
//        年龄校验
        int age = user.getAge();
        if(age>120||age<18){
            return Result.error("年龄不符合要求");
        }
        //手机号的校验
        String phone = user.getPhone();
        if (phone != null && phone != "") {
            boolean check = RegUtils.check(phone, "^(1[3-9]\\d{9}$)");
            if (!check){
                return Result.error("手机号格式不正确");
            }
        }else {
            return Result.error("手机号不能为空");
        }
//        写入数据库
        user.setPassword(MD5Utils.encrypt(password));
        int insert = userMapper.insert(user);
        return insert > 0 ? Result.ok("注册成功") : Result.error("注册失败");

    }

    /**
     * 登录
     */
    @Override
    public Result login(User user) {

        String username = user.getUsername();
        if (username != null && username != "") {
            boolean check = RegUtils.check(username, "^(?=[a-zA-Z])(?!.*[\\-_]{2})[a-zA-Z0-9\\-_]{8,12}$");
            if (!check) {
                return Result.error("用户名格式不正确");
            }
        } else {
            return Result.error("用户名不能为空");
        }

        String password = user.getPassword();
        if (password != null && password != "") {
            boolean check = RegUtils.check(password, "^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]).{8,16}$");
            if (!check) {
                return Result.error("密码格式不正确");
            }
        } else {
            return Result.error("密码不能为空");
        }
        password = MD5Utils.encrypt(password);
        User user1 = userMapper.findUserByUsernameAndPassword(username, password);
        if(user1!=null){
            String uuid = UUID.randomUUID().toString();
            String token = uuid.replace("-", "");
            tokenMapper.insert(token, user1.getId());
            return Result.ok("登录成功", token);
        }

        return Result.error("登录失败");
    }
//注销
    @Override
    public Result logout(String token) {
        if(token!=null && token!=""){
            tokenMapper.deleteByToken(token);
        }
        return Result.ok("注销成功");
    }
}
//正则表达式
public class RegUtils {
    public static boolean check(String target,String regex) {
        // 正则表达式
        Pattern pattern = Pattern.compile(regex);
        // 匹配器
        Matcher matcher = pattern.matcher(target);
        // 匹配
        if (matcher.matches()) {
            return true;
        }
        return false;
    }
}

//MD5
public static String encrypt(String password){
        MessageDigest md = null;
        String s = null;
        try {
            md = MessageDigest.getInstance("MD5");
            md.update(password.getBytes());
            s = new BigInteger(1, md.digest()).toString(16);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return s;
    }
<?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="com.xinzhi.dao.TokenMapper">
    <insert id="insert">
        insert into token (token,userid) values (#{token},#{userid})
    </insert>
    <delete id="deleteByToken">
        delete from token where token=#{token}
    </delete>
    <select id="selectByToken" resultType="java.lang.Integer">
        select id from token where token=#{token}
    </select>
</mapper>
<?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="com.LiMou.dao.UserMapper">
    <sql id="userAll">
        id,nickname,username,password,age,phone
    </sql>

    <insert id="insert">
        insert into user (nickname,username,password,age,phone) values (#{nickname},#{username},#{password},#{age},#{phone})
    </insert>
    <select id="findUserByUsername" resultType="com.xinzhi.model.User">
        select <include refid="userAll"/> from user where username=#{username}
    </select>
    <select id="findUserByUsernameAndPassword" resultType="com.xinzhi.model.User">
        select <include refid="userAll"/> from user where username=#{username} and password=#{password}
    </select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="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.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">


    <!--加载properties文件-->
    <context:property-placeholder location="classpath:db.properties"/>


    <!--数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${name}"/>
        <property name="password" value="${password}"/>
    </bean>

    <!--开启bean注解扫描-->
    <context:component-scan base-package="com.LiMou">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <!--事务管理器-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--开启注解式事务-->
    <tx:annotation-driven transaction-manager="txManager"/>



    <!--整合mybatis到spring中-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="typeAliasesPackage" value="com.xinzhi.model"/>
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        <!--分页插件-->
        <property name="plugins">
            <array>
                <bean class="com.github.pagehelper.PageInterceptor">
                    <property name="properties">
                        <props>
                            <prop key="helperDialect">mysql</prop>
                            <prop key="reasonable">true</prop>
                        </props>
                    </property>
                </bean>
            </array>
        </property>
    </bean>

    <!--映射扫描-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.LiMou.dao"/>
    </bean>

</beans>

db.properties//连接数据库的

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">



    <context:component-scan base-package="com.xinzhi.controller"/>

    <mvc:annotation-driven >
        <!-- 消息转换器 -->
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes" value="text/plain;charset=UTF-8"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <!--    视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!--    多媒体解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"/>
        <property name="maxUploadSize" value="500000"/>
    </bean>

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <mvc:exclude-mapping path="/register"/>
            <mvc:exclude-mapping path="/login"/>
            <bean class="com.xinzhi.interceptor.UserInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

</beans>

//依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" 


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.xinzhi</groupId>
  <artifactId>conformity1</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>conformity1 Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.3</version>
    </dependency>
    <!--mysql环境-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.31</version>
    </dependency>
    <!--spring整合jdbc-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>5.1.9.RELEASE</version>
    </dependency>
    <!--spring整合mybatis-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.3</version>
    </dependency>
    <!--druid连接池-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.16</version>
    </dependency>
    <!--分页插件坐标-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.1.2</version>
    </dependency>


    <!--springmvc环境-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.1.9.RELEASE</version>
    </dependency>
    <!--jackson相关坐标3-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>

    <!--servlet环境-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.4</version>
    </dependency>


    <!--junit单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
    <!--spring整合junit-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.1.9.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.24</version>
    </dependency>


    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.4</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.3.2</version>
      </plugin>
    </plugins>
    <finalName>conformity1</finalName>
  </build>
</project>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于基于SSM框架的用户注册登录功能,以下是一般的步骤和实现方式: 1. 创建数据库表 首先,你需要创建一个用户表,该表至少应包含字段如下:用户ID(主键),用户名,密码等。 2. 创建实体类 在Java代码中,创建一个与用户表对应的实体类,包含跟表字段一一对应的属性,并提供相应的getter和setter方法。 3. 编写Mapper接口 使用MyBatis框架,编写与用户表相关的Mapper接口。该接口定义了对用户表进行增删改查操作的方法。 4. 编写Mapper映射文件 在Mapper映射文件中,编写SQL语句,实现对用户表的增删改查操作。使用MyBatis的特定语法,将SQL语句与Mapper接口方法关联起来。 5. 编写Service层接口和实现类 创建一个Service接口,定义用户注册登录的方法。然后创建一个Service实现类,实现这些方法。在实现类中,调用Mapper接口中定义的方法来完成具体的数据库操作。 6. 编写Controller层 创建一个Controller类,在其中定义处理用户请求的方法。通过注解将Service接口实例化,并根据用户请求调用相应的Service方法。 7. 编写前端页面 使用HTML、CSS和JavaScript等技术,创建用户注册登录的前端页面。通过表单提交用户输入的注册登录信息。 8. 实现用户注册功能 在Controller层中,编写处理用户注册请求的方法。该方法接收用户输入的注册信息,并将其传递给Service层的注册方法进行处理。 9. 实现用户登录功能 在Controller层中,编写处理用户登录请求的方法。该方法接收用户输入的登录信息,并将其传递给Service层的登录方法进行验证。 以上是一个大致的步骤,可以根据具体需求进行调整和扩展。希望对你有所帮助!如果还有其他问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值