Cookie信息校验步骤
- 判断请求中是否携带正确的Cookie信息
- 如果有则校验Cookie信息是否正确
①如果校验正确则直接响应主页面给用户
②如果校验不正确则响应登录页面给用户 - 没有则请求转发给登录页面
具体代码实现
我结合了前几次的登陆代码进行具体实现
1.首先创建一个新的.java文件,里面对请求信息的Cookie进行检查,获取Cookie信息,如果没有则为null,会跳转到登陆主页,即/page页面;如果存在Cookie信息,则会检查UID是否存在,是否有清除历史记录等操作,如果清除了历史记录,那么也会跳转到登陆主页,即/page页面,否则,会检查UID的用户信息,是否在数据库中存在,如果存在跳转到/main页面,不存在则跳转到/page页面。
package com.youdian.servlet;
import java.io.IOException;
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 com.youdian.pojo.User;
import com.youdian.service.LoginService;
import com.youdian.service.impl.LoginServiceImpl;
public class CookieServlet extends HttpServlet {
protected void service(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//获取Cookie信息
Cookie[] cks=req.getCookies();
//处理请求信息
if(cks!=null){
//遍历Cookie信息
String uid="";
for(Cookie c:cks){
if("uid".equals(c.getName())){
uid=c.getValue();
}
}
//校验UID是否存在
if("".equals(uid)){
//请求转发
req.getRequestDispatcher("page").forward(req, resp);
return;
}else{
//校验UID用户信息
//获取业务层对象
LoginService ls=new LoginServiceImpl();
User u=ls.checkUidService(uid);
if(u!=null){
//重定向
resp.sendRedirect("/login/main");
return;
}else{
//请求转发
req.getRequestDispatcher("page").forward(req, resp);
return;
}
}
}else{
//响应处理结果
//请求转发
req.getRequestDispatcher("page").forward(req, resp);
return;
}
}
}
- 在原有代码的基础上进行添加
LoginServlet
//响应处理结果
if(u!=null){
//创建Cookie信息实现三天免登录。
Cookie c=new Cookie("uid", u.getUid()+"");
//设置Cookie的有效期
c.setMaxAge(3*24*3600);
c.setPath("/login/ck");
//添加Cookie信息
resp.addCookie(c);
resp.sendRedirect("/login/main");
}
接口LoginService
//校验用户Cookie信息
User checkUidService(String uid);
实现
//校验Cookie信息
@Override
public User checkUidService(String uid) {
return ld.checkUidDao(uid);
}
接口LoginDao
//根据UID获取用户信息
User checkUidDao(String uid);
实现
//根据UID获取用户信息
public User checkUidDao(String uid) {
//声明Jdbc对象
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
//声明数据存储对象
User u=null;
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接对象
conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/servlet","root","root");
//创建Sql命令
String sql="select * from t_user where uid=?";
//创建Sql命令对象
ps=conn.prepareStatement(sql);
//给占位符赋值
ps.setString(1, uid);
//执行
rs=ps.executeQuery();
//遍历执行结果
while(rs.next()){
u=new User();
u.setUid(rs.getInt("uid"));
u.setUname(rs.getString("uname"));
u.setPwd(rs.getString("pwd"));
}
//关闭资源
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//返回
return u;
}
注:这些是添加的代码,其余完整的代码在07中