一:思路:用户免登录实现:
注:该案例基于登录验证功能实现
1.用户发送验证cookie信息的请求,编写对应的的Servlet进行处理;
2.如果包含Cookie,直接跳转到成功页面;
3.如果不包含Cookie信息,直接调转到登录;
二:代码实现:
1.第一步:在登录请求中设置Cookie信息;
package com.cy.controller;
import com.cy.entity.User;
import com.cy.service.Impl.UserServiceImpl;
import com.cy.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
UserService userService=new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码格式
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("gbk");
//获取请求数据
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
//封装对象
User user = new User(name, pwd);
//调用service进行逻辑处理
User u = userService.login(user);
System.out.println(u);
//判断返回结果是否为空
if (u!=null){
// response.getWriter().write("登录成功!");
//使用请求转发的方式进行跳转
// request.getRequestDispatcher("success").forward(request,response);
//创建cookie对象
Cookie cookie = new Cookie("uid", u.getUid() + "");
//设置Cookie过期时间
cookie.setMaxAge(7*24*3600);
//将cookie信息设置到response对象中
response.addCookie(cookie);
//获取session对象
HttpSession session = request.getSession();
//设置session参数
session.setAttribute("name",u.getUsername());
//使用重定向
response.sendRedirect("success");
}else {
// response.getWriter().write("用户名密码错误!");
//在request域中设置参数
request.setAttribute("msg","用户名或密码错误");
//装发到登录页面
//注意:请求servlet的时候,写相对路径,同时后面不需要写逻辑代码的处理
request.getRequestDispatcher("page").forward(request,response);
return ;
}
}
}
2.第二步:编写验证cookie信息的Servlet:
package com.cy.controller;
import com.cy.entity.User;
import com.cy.service.Impl.UserServiceImpl;
import com.cy.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CookieProjectServlet extends HttpServlet {
UserService userService=new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("gbk");
String url="";
//获取Cookie对象
Cookie[] cookies = request.getCookies();
//如果Cookies等于空,直接跳转到登录页面,如果不为空,进行相关处理
if (cookies!=null){
for (Cookie c:cookies) {
//取值
String key = c.getName();
System.out.println(key);
//判断Uid是否为空
if ("uid".equals(key)){
//获取Value
String value = c.getValue();
//进行Uid值验证
User user=userService.getUserById(Integer.valueOf(value));
System.out.println(user);
//判断返回数据是否为空
if (user!=null){//不为空
url="success";
}else{//为空
url="page";
}
}else {
//如果Uid不存在跳转到登录页面
url="page";
}
}
}else{
//跳转到登录页面
url="page";
}
response.sendRedirect(url);
}
}
3.第三步:编写业务层代码:
package com.cy.service;
import com.cy.entity.User;
/**
* 业务层接口
*/
public interface UserService {
/**
* 登录
* @param user
* @return
*/
User login(User user);
/**
* 根据id查询对象
* @param uid
* @return
*/
User getUserById(int uid);
}
package com.cy.service.Impl;
import com.cy.dao.Impl.UserDaoImpl;
import com.cy.dao.UserDao;
import com.cy.entity.User;
import com.cy.service.UserService;
/**
* 业务实现类
*/
public class UserServiceImpl implements UserService {
UserDao userDao=new UserDaoImpl();
/**
* 登录方法
* @param user
* @return
*/
@Override
public User login(User user) {
return userDao.login(user);
}
/**
* 根据id查询对相关
* @param uid
* @return
*/
@Override
public User getUserById(int uid) {
return userDao.getUserById(uid);
}
}
4.第四步持久层代码实现:
package com.cy.dao;
import com.cy.entity.User;
/**
* 持久层接口
*/
public interface UserDao {
/**
* 登录
* @param user
* @return
*/
User login(User user);
/**
* 根据id查询对象
* @param uid
* @return
*/
User getUserById(int uid);
}
package com.cy.dao.Impl;
import com.cy.dao.UserDao;
import com.cy.entity.User;
import java.sql.*;
/**
* 持久层实现类
*/
public class UserDaoImpl implements UserDao {
@Override
public User login(User user) {
//1.定义连接对象
Connection con=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
User u=null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
//获取预处理块
preparedStatement=con.prepareStatement("select Uid,UserName,Password from tb_user where UserName=? and Password=?");
//给?赋值
preparedStatement.setString(1,user.getUsername());
preparedStatement.setString(2,user.getPassword());
//执行sql
resultSet=preparedStatement.executeQuery();
//从resultset中获取结果值
while (resultSet.next()){
u=new User(resultSet.getInt("Uid"),resultSet.getString("UserName"),resultSet.getString("Password"));
}
} catch (Exception e) {
e.printStackTrace();
}
//释放资源
try {
resultSet.close();
preparedStatement.close();
con.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return u;
}
/**
* 根据id查询对象
* @param uid
* @return
*/
@Override
public User getUserById(int uid) {
//定义连接对象
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
User u=null;
try {
//注册驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
//获取预处理块
preparedStatement=connection.prepareStatement("select Uid,UserName,Password from tb_user where Uid=?");
//给?赋值
preparedStatement.setInt(1,uid);
//执行sql语句
resultSet=preparedStatement.executeQuery();
//从返回数据中获取结果值
while (resultSet.next()){
u= new User(resultSet.getInt("Uid"),resultSet.getString("UserName"),resultSet.getString("Password"));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
//释放资源
resultSet.close();
preparedStatement.close();
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return u;
}
}