通过三层架构实现登录界面(解决了cookie记住中文用户名乱码问题)

您所在的位置:网站首页 servlet注册界面 通过三层架构实现登录界面(解决了cookie记住中文用户名乱码问题)

通过三层架构实现登录界面(解决了cookie记住中文用户名乱码问题)

2023-07-04 14:19| 来源: 网络整理| 查看: 265

目录

1.Dao层(Mapper层)

2.Service层

3.web层+前端页面

4.cookie中文乱码如何正确记住并显示中文?

1.Dao层(Mapper层)

        实现查询用户对象、查询用户名、添加用户等数据库操作

package com.xiuxian.mapper; import com.xiuxian.pojo.User; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; public interface UserMapper { /* *根据用户名和密码查询用户对象 * @param username * @param password * @return */ @Select("select * from tb_user where username = #{username} and password = #{password}") User select(@Param("username") String username, @Param("password") String password); /* *根据用户名查询用户对象 *@param username *@return */ @Select("select * from tb_user where username = #{username}") User selectByUsername(String username); /* *添加用户 * @param user */ @Insert("insert into tb_user values(null,#{username},#{password})") void add(User user); } 2.Service层

        连接工厂,对Dao层功能进行进一步实现,让web层能够调用方法

package com.xiuxian.service; import com.xiuxian.mapper.UserMapper; import com.xiuxian.pojo.User; import com.xiuxian.util.SqlSessionFactoryUtils; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; public class UserService { SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory(); /* *查询用户及密码是否存在 */ public User login(String username, String password){ SqlSession sqlSession = factory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.select(username,password); sqlSession.close(); return user; } /* *注册方法,返回注册成功还是失败 */ public boolean register(User user){ SqlSession sqlSession = factory.openSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); // 判断用户名是否存在 User u = mapper.selectByUsername(user.getUsername()); if(u == null){ // 用户名不存在,注册 mapper.add(user); sqlSession.commit(); } return u==null; } } 3.web层+前端页面

        web层loginServlet接收来自login.jsp页面提交的数据,通过数据先去判断用户是否存在,如果存在则再去判断用户是否勾选“记住用户”复选框,如果用户勾选,则通过cookie来保存用户信息(中文乱码解决思路文末详见),如果你想登录后让界面动态显示你的用户名,那么你就要使用session,将对象保存在客户端,你的展示页面就可以根据对象调用用户信息,操作完成后利用重定向到展示页面。如果登录失败,则再次转发到登录页面并提示“用户名或密码错误”

LoginServlet代码:

package com.xiuxian.web; import com.xiuxian.pojo.User; import com.xiuxian.service.UserService; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import javax.xml.crypto.Data; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEncoder; //实现登录功能 @WebServlet("/loginServlet") public class LoginServlet extends HttpServlet { private UserService service = new UserService(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1.接收用户名和密码 // 使用request对象 获取请求数据 req.setCharacterEncoding("UTF-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); // 获取查询数据 User user = service.login(username,password); //获取"记住用户"数据 String remember = req.getParameter("remember"); // 判断 if(user != null){ // 判断用户是否勾选记住我,为了预防空指针异常,所有remember写在括号里 if ("1".equals(remember)){ // 勾选了,发送cookie // 1.创建cookie对象,因为cookie不支持中文,因此要使用URL编码 username = URLEncoder.encode(username,"utf-8"); password = URLEncoder.encode(password,"utf-8"); Cookie c_username = new Cookie("username",username); Cookie c_password = new Cookie("password",password); // 2.设置cookie的存活时间 c_username.setMaxAge(60*60*24*7); c_password.setMaxAge(60*60*24*7); // 3.发送 resp.addCookie(c_username); resp.addCookie(c_password); } // 登录成功,跳转到selectAllServlet查询所有功能,重定向 // 因为是一次会话多次请求,所以要用到会话跟踪技术(将登录成功的user对象存储到session) HttpSession session = req.getSession(); session.setAttribute("user",user); // 重定向 String contextPath = req.getContextPath(); //动态访问虚拟目录RewriteBrand-demo resp.sendRedirect(contextPath+"/selectAllServlet"); }else{ // 登录失败 req.setAttribute("login_msg","用户名或密码错误"); // 跳转到login.jsp 因为是存入到request域中所以用转发 req.getRequestDispatcher("/login.jsp").forward(req,resp); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); } }

jsp页面代码:

登录页面 登录页面 ${login_msg} ${register_msg}

用户名:

密码:

记住用户:

点击注册 4.cookie中文乱码如何正确记住并显示中文?

        为什么要利用cookie来保存数据?因为用户勾选“记住用户”复选框登录成功后,就会请求新的路径到展示页面中,为了不让用户下次在登录页面重新输入用户名和密码,所以我们要将用户记住的用户名和密码通过cookie保存到服务端,这样下次在登录页面的时候就会自动显示,不用重新输入。但是cookie不支持中文,所以在创建cookie对象时要先对数据进行编码然后再创建cookie对象、设置cookie的存活时间、发送cookie。这样我们就成功的将中文数据保存到cookie中了。

         如果就这样在jsp页面直接通过cookie.key.value来调用中文用户名,那么会出现用户名文本框中显示乱码的情况,因为我们还没有对cookie进行解码。我们要在jsp页面输入java语句对cookie进行操作,先判断cookie的key是否是自己想要的数据,如果是,则将数据进行utf-8编码。最后通过参数显示出解码后的数据

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3