先写一个要跳转的index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${info}
welcome to china
</body>
</html>
再写一个登录界面 login.jsp:
${msg}
<form action="login" method="post">
用户名:<input type="text" name="username"><br>
密码 :<input type="password" name="password"><br>
一周内登录:<input type="checkbox" name="auto" value="auto">
<input type="submit" value="登录">
</form>
然后写LoginServlet:
package com.java12.web.cookie;
import java.io.IOException;
import java.util.Base64;
import java.util.Base64.Encoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoginServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
String auto = request.getParameter("auto");
//校验成功 跳转到网站首页
if("tom".equals(username)&&"123456".equals(password)){
if("auto".equals(auto)){
//经过base64 转码处理
String str = username+"&"+password;
Encoder encoder = Base64.getEncoder();
String encodeToString = encoder.encodeToString(str.getBytes());
Cookie cookie = new Cookie("loginInfo",encodeToString);
cookie.setMaxAge(60);
response.addCookie(cookie);
}
request.getRequestDispatcher("/index.jsp").forward(request, response);
}else{
request.setAttribute("msg", "用户名或密码错误,请重新登陆");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
然后写一个Filter,过滤indx.jsp,对保存登录进行cookie过滤
@WebFilter(urlPatterns={"/index.jsp"})
public class LoginFilter implements Filter {
public LoginFilter() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest)request;
HttpServletResponse httpServletResponse = (HttpServletResponse)response;
Cookie[] cookies = httpServletRequest.getCookies();
boolean flag = false;
//查看浏览器中是否有cookie
if(cookies != null && cookies.length > 0){
//浏览器中有cookie 进行循环遍历 查找一周内登陆的cookie
for(Cookie cookie : cookies){
if("loginInfo".equals(cookie.getName())){
//对cookie进行base64解码 校验cookie防止被串改
Decoder decoder = Base64.getDecoder();
byte[] decode = decoder.decode(cookie.getValue());
String string = new String(decode);
if(string.equals("tom&123456")){
//找到并设置标志位
flag = true;
}
}
}
//根据标志位进行顾虑请求 特别理解标志位的使用
if(flag){
chain.doFilter(request, response);
}else{
httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/login.jsp");
}
}
//浏览器中没有一个cookie
else{
httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/login.jsp");
}
}
public void init(FilterConfig fConfig) throws ServletException {
}
}